/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 1994, by Sun Microsytems, Inc. */ #ifndef _SYS_TNF_PROBE_H #define _SYS_TNF_PROBE_H #pragma ident "%Z%%M% %I% %E% SMI" #include #ifdef __cplusplus extern "C" { #endif /* * These macros are used to convert the __LINE__ directive to a * string in the probe macros below. */ #define TNF_STRINGIFY(x) #x #define TNF_STRINGVALUE(x) TNF_STRINGIFY(x) /* * Alignment of tnf_ref32_t */ struct _tnf_ref32_align { char c; tnf_ref32_t t; }; #define TNF_REF32_ALIGN TNF_OFFSETOF(struct _tnf_ref32_align, t) /* * Probe versioning */ struct tnf_probe_version { size_t version_size; /* sizeof(struct tnf_probe_version) */ size_t probe_control_size; /* sizeof(tnf_probe_control_t) */ }; extern struct tnf_probe_version __tnf_probe_version_1; #pragma weak __tnf_probe_version_1 /* * Typedefs */ typedef struct tnf_probe_control tnf_probe_control_t; typedef struct tnf_probe_setup tnf_probe_setup_t; /* returns pointer to buffer */ typedef void * (*tnf_probe_test_func_t)(void *, tnf_probe_control_t *, tnf_probe_setup_t *); /* returns buffer pointer */ typedef void * (*tnf_probe_alloc_func_t)(tnf_ops_t *, /* tpd */ tnf_probe_control_t *, tnf_probe_setup_t *); typedef void (*tnf_probe_func_t)(tnf_probe_setup_t *); /* * Probe argument block */ struct tnf_probe_setup { tnf_ops_t *tpd_p; void *buffer_p; tnf_probe_control_t *probe_p; }; /* * Probe control block */ struct tnf_probe_control { const struct tnf_probe_version *version; tnf_probe_control_t *next; tnf_probe_test_func_t test_func; tnf_probe_alloc_func_t alloc_func; tnf_probe_func_t probe_func; tnf_probe_func_t commit_func; uintptr_t index; const char *attrs; tnf_tag_data_t ***slot_types; unsigned long tnf_event_size; }; #ifdef _KERNEL #define TNF_NEXT_INIT 0 #else #define TNF_NEXT_INIT -1 #endif /* _KERNEL */ /* * TNF Type extension */ #ifdef NPROBE #define TNF_DECLARE_RECORD(ctype, record) \ typedef tnf_reference_t record##_t #else #define TNF_DECLARE_RECORD(ctype, record) \ typedef tnf_reference_t record##_t; \ extern tnf_tag_data_t *record##_tag_data; \ extern record##_t record(tnf_ops_t *, ctype *, tnf_record_p) #endif /* NPROBE */ #ifdef NPROBE /* CSTYLED */ #define TNF_DEFINE_RECORD_1(ctype, ctype_record, t1, n1) #else /* CSTYLED */ #define TNF_DEFINE_RECORD_1(ctype, ctype_record, t1, n1) \ typedef struct { \ tnf_tag_t tag; \ t1##_t data_1; \ } ctype_record##_prototype_t; \ static tnf_tag_data_t **ctype_record##_type_slots[] = { \ &tnf_tag_tag_data, \ &t1##_tag_data, \ 0 }; \ static char *ctype_record##_slot_names[] = { \ "tnf_tag", \ ""#n1, \ 0 }; \ static tnf_tag_data_t ctype_record##_tag_data_rec = { \ TNF_TAG_VERSION, &tnf_struct_tag_1, \ 0, #ctype_record, &tnf_user_struct_properties, \ sizeof (ctype_record##_prototype_t), \ TNF_REF32_ALIGN, \ sizeof (ctype_record##_t), TNF_STRUCT, 0, \ ctype_record##_type_slots, ctype_record##_slot_names \ }; \ tnf_tag_data_t *ctype_record##_tag_data = \ &ctype_record##_tag_data_rec; \ ctype_record##_t \ ctype_record(tnf_ops_t *ops, ctype * the_ctype, \ tnf_record_p reference) \ { \ tnf_tag_data_t *metatag_data; \ tnf_record_p metatag_index; \ ctype_record##_prototype_t *buffer; \ \ if (the_ctype == NULL) \ return (0); \ buffer = (ctype_record##_prototype_t *) tnf_allocate(ops, \ sizeof (ctype_record##_prototype_t)); \ if (buffer == NULL) \ return (0); \ \ metatag_data = ctype_record##_tag_data; \ metatag_index = metatag_data->tag_index ? \ metatag_data->tag_index: \ metatag_data->tag_desc(ops, metatag_data); \ buffer->tag = tnf_tag(ops, metatag_index, \ (tnf_record_p) &buffer->tag); \ buffer->data_1 = t1(ops, the_ctype->n1, \ (tnf_record_p) &(buffer->data_1)); \ return (tnf_ref32(ops, (tnf_record_p) buffer, reference)); \ } #endif /* NPROBE */ #ifdef NPROBE /* CSTYLED */ #define TNF_DEFINE_RECORD_2(ctype, ctype_record, t1, n1, t2, n2) #else /* CSTYLED */ #define TNF_DEFINE_RECORD_2(ctype, ctype_record, t1, n1, t2, n2) \ typedef struct { \ tnf_tag_t tag; \ t1##_t data_1; \ t2##_t data_2; \ } ctype_record##_prototype_t; \ static tnf_tag_data_t **ctype_record##_type_slots[] = { \ &tnf_tag_tag_data, \ &t1##_tag_data, \ &t2##_tag_data, \ 0 }; \ static char *ctype_record##_slot_names[] = { \ "tnf_tag", \ ""#n1, \ ""#n2, \ 0 }; \ static tnf_tag_data_t ctype_record##_tag_data_rec = { \ TNF_TAG_VERSION, &tnf_struct_tag_1, \ 0, #ctype_record, &tnf_user_struct_properties, \ sizeof (ctype_record##_prototype_t), \ TNF_REF32_ALIGN, \ sizeof (ctype_record##_t), TNF_STRUCT, 0, \ ctype_record##_type_slots, ctype_record##_slot_names \ }; \ tnf_tag_data_t *ctype_record##_tag_data = \ &ctype_record##_tag_data_rec; \ ctype_record##_t \ ctype_record(tnf_ops_t *ops, ctype * the_ctype, \ tnf_record_p reference) \ { \ tnf_tag_data_t *metatag_data; \ tnf_record_p metatag_index; \ ctype_record##_prototype_t *buffer; \ \ if (the_ctype == NULL) \ return (0); \ buffer = (ctype_record##_prototype_t *) tnf_allocate(ops, \ sizeof (ctype_record##_prototype_t)); \ if (buffer == NULL) \ return (0); \ \ metatag_data = ctype_record##_tag_data; \ metatag_index = metatag_data->tag_index ? \ metatag_data->tag_index: \ metatag_data->tag_desc(ops, metatag_data); \ buffer->tag = tnf_tag(ops, metatag_index, \ (tnf_record_p) &buffer->tag); \ buffer->data_1 = t1(ops, the_ctype->n1, \ (tnf_record_p) &(buffer->data_1)); \ buffer->data_2 = t2(ops, the_ctype->n2, \ (tnf_record_p) &(buffer->data_2)); \ return (tnf_ref32(ops, (tnf_record_p) buffer, reference)); \ } #endif /* NPROBE */ #ifdef NPROBE /* CSTYLED */ #define TNF_DEFINE_RECORD_3(ctype, ctype_record, t1, n1, t2, n2, t3, n3) #else /* CSTYLED */ #define TNF_DEFINE_RECORD_3(ctype, ctype_record, t1, n1, t2, n2, t3, n3) \ typedef struct { \ tnf_tag_t tag; \ t1##_t data_1; \ t2##_t data_2; \ t3##_t data_3; \ } ctype_record##_prototype_t; \ static tnf_tag_data_t **ctype_record##_type_slots[] = { \ &tnf_tag_tag_data, \ &t1##_tag_data, \ &t2##_tag_data, \ &t3##_tag_data, \ 0 }; \ static char *ctype_record##_slot_names[] = { \ "tnf_tag", \ ""#n1, \ ""#n2, \ ""#n3, \ 0 }; \ static tnf_tag_data_t ctype_record##_tag_data_rec = { \ TNF_TAG_VERSION, &tnf_struct_tag_1, \ 0, #ctype_record, &tnf_user_struct_properties, \ sizeof (ctype_record##_prototype_t), \ TNF_REF32_ALIGN, \ sizeof (ctype_record##_t), TNF_STRUCT, 0, \ ctype_record##_type_slots, ctype_record##_slot_names \ }; \ tnf_tag_data_t *ctype_record##_tag_data = \ &ctype_record##_tag_data_rec; \ ctype_record##_t \ ctype_record(tnf_ops_t *ops, ctype * the_ctype, \ tnf_record_p reference) \ { \ tnf_tag_data_t *metatag_data; \ tnf_record_p metatag_index; \ ctype_record##_prototype_t *buffer; \ \ if (the_ctype == NULL) \ return (0); \ buffer = (ctype_record##_prototype_t *) tnf_allocate(ops, \ sizeof (ctype_record##_prototype_t)); \ if (buffer == NULL) \ return (0); \ \ metatag_data = ctype_record##_tag_data; \ metatag_index = metatag_data->tag_index ? \ metatag_data->tag_index: \ metatag_data->tag_desc(ops, metatag_data); \ buffer->tag = tnf_tag(ops, metatag_index, \ (tnf_record_p) &buffer->tag); \ buffer->data_1 = t1(ops, the_ctype->n1, \ (tnf_record_p) &(buffer->data_1)); \ buffer->data_2 = t2(ops, the_ctype->n2, \ (tnf_record_p) &(buffer->data_2)); \ buffer->data_3 = t3(ops, the_ctype->n3, \ (tnf_record_p) &(buffer->data_3)); \ return (tnf_ref32(ops, (tnf_record_p) buffer, reference)); \ } #endif /* NPROBE */ #ifdef NPROBE /* CSTYLED */ #define TNF_DEFINE_RECORD_4(ctype, ctype_record, t1, n1, t2, n2, t3, n3, t4, n4) #else /* CSTYLED */ #define TNF_DEFINE_RECORD_4(ctype, ctype_record, t1, n1, t2, n2, t3, n3, t4, n4) \ typedef struct { \ tnf_tag_t tag; \ t1##_t data_1; \ t2##_t data_2; \ t3##_t data_3; \ t4##_t data_4; \ } ctype_record##_prototype_t; \ static tnf_tag_data_t **ctype_record##_type_slots[] = { \ &tnf_tag_tag_data, \ &t1##_tag_data, \ &t2##_tag_data, \ &t3##_tag_data, \ &t4##_tag_data, \ 0 }; \ static char *ctype_record##_slot_names[] = { \ "tnf_tag", \ ""#n1, \ ""#n2, \ ""#n3, \ ""#n4, \ 0 }; \ static tnf_tag_data_t ctype_record##_tag_data_rec = { \ TNF_TAG_VERSION, &tnf_struct_tag_1, \ 0, #ctype_record, &tnf_user_struct_properties, \ sizeof (ctype_record##_prototype_t), \ TNF_REF32_ALIGN, \ sizeof (ctype_record##_t), TNF_STRUCT, 0, \ ctype_record##_type_slots, ctype_record##_slot_names \ }; \ tnf_tag_data_t *ctype_record##_tag_data = \ &ctype_record##_tag_data_rec; \ ctype_record##_t \ ctype_record(tnf_ops_t *ops, ctype * the_ctype, \ tnf_record_p reference) \ { \ tnf_tag_data_t *metatag_data; \ tnf_record_p metatag_index; \ ctype_record##_prototype_t *buffer; \ \ if (the_ctype == NULL) \ return (0); \ buffer = (ctype_record##_prototype_t *) tnf_allocate(ops, \ sizeof (ctype_record##_prototype_t)); \ if (buffer == NULL) \ return (0); \ \ metatag_data = ctype_record##_tag_data; \ metatag_index = metatag_data->tag_index ? \ metatag_data->tag_index: \ metatag_data->tag_desc(ops, metatag_data); \ buffer->tag = tnf_tag(ops, metatag_index, \ (tnf_record_p) &buffer->tag); \ buffer->data_1 = t1(ops, the_ctype->n1, \ (tnf_record_p) &(buffer->data_1)); \ buffer->data_2 = t2(ops, the_ctype->n2, \ (tnf_record_p) &(buffer->data_2)); \ buffer->data_3 = t3(ops, the_ctype->n3, \ (tnf_record_p) &(buffer->data_3)); \ buffer->data_4 = t4(ops, the_ctype->n4, \ (tnf_record_p) &(buffer->data_4)); \ return (tnf_ref32(ops, (tnf_record_p) buffer, reference)); \ } #endif /* NPROBE */ #ifdef NPROBE /* CSTYLED */ #define TNF_DEFINE_RECORD_5(ctype, ctype_record, t1, n1, t2, n2, t3, n3, t4, n4, t5, n5) #else /* CSTYLED */ #define TNF_DEFINE_RECORD_5(ctype, ctype_record, t1, n1, t2, n2, t3, n3, t4, n4, t5, n5) \ typedef struct { \ tnf_tag_t tag; \ t1##_t data_1; \ t2##_t data_2; \ t3##_t data_3; \ t4##_t data_4; \ t5##_t data_5; \ } ctype_record##_prototype_t; \ static tnf_tag_data_t **ctype_record##_type_slots[] = { \ &tnf_tag_tag_data, \ &t1##_tag_data, \ &t2##_tag_data, \ &t3##_tag_data, \ &t4##_tag_data, \ &t5##_tag_data, \ 0 }; \ static char *ctype_record##_slot_names[] = { \ "tnf_tag", \ ""#n1, \ ""#n2, \ ""#n3, \ ""#n4, \ ""#n5, \ 0 }; \ static tnf_tag_data_t ctype_record##_tag_data_rec = { \ TNF_TAG_VERSION, &tnf_struct_tag_1, \ 0, #ctype_record, &tnf_user_struct_properties, \ sizeof (ctype_record##_prototype_t), \ TNF_REF32_ALIGN, \ sizeof (ctype_record##_t), TNF_STRUCT, 0, \ ctype_record##_type_slots, ctype_record##_slot_names \ }; \ tnf_tag_data_t *ctype_record##_tag_data = \ &ctype_record##_tag_data_rec; \ ctype_record##_t \ ctype_record(tnf_ops_t *ops, ctype * the_ctype, \ tnf_record_p reference) \ { \ tnf_tag_data_t *metatag_data; \ tnf_record_p metatag_index; \ ctype_record##_prototype_t *buffer; \ \ if (the_ctype == NULL) \ return (0); \ buffer = (ctype_record##_prototype_t *) tnf_allocate(ops, \ sizeof (ctype_record##_prototype_t)); \ if (buffer == NULL) \ return (0); \ \ metatag_data = ctype_record##_tag_data; \ metatag_index = metatag_data->tag_index ? \ metatag_data->tag_index: \ metatag_data->tag_desc(ops, metatag_data); \ buffer->tag = tnf_tag(ops, metatag_index, \ (tnf_record_p) &buffer->tag); \ buffer->data_1 = t1(ops, the_ctype->n1, \ (tnf_record_p) &(buffer->data_1)); \ buffer->data_2 = t2(ops, the_ctype->n2, \ (tnf_record_p) &(buffer->data_2)); \ buffer->data_3 = t3(ops, the_ctype->n3, \ (tnf_record_p) &(buffer->data_3)); \ buffer->data_4 = t4(ops, the_ctype->n4, \ (tnf_record_p) &(buffer->data_4)); \ buffer->data_5 = t5(ops, the_ctype->n5, \ (tnf_record_p) &(buffer->data_5)); \ return (tnf_ref32(ops, (tnf_record_p) buffer, reference)); \ } #endif /* NPROBE */ /* * Probe Macros */ #ifdef NPROBE /* CSTYLED */ #define TNF_PROBE_0(namearg, keysarg, detail) \ ((void)0) #else /* CSTYLED */ #define TNF_PROBE_0(namearg, keysarg, detail) \ { \ struct tnf_v_buf_0 { \ tnf_probe_event_t probe_event; \ tnf_time_delta_t time_delta; \ }; \ static tnf_tag_data_t ** tnf_v_##namearg##_info[] = { \ &tnf_probe_event_tag_data, \ &tnf_time_delta_tag_data, \ 0 }; \ static struct tnf_probe_control tnf_v_##namearg##_probe = { \ &__tnf_probe_version_1, \ (tnf_probe_control_t *) TNF_NEXT_INIT, \ (tnf_probe_test_func_t) 0, \ (tnf_probe_alloc_func_t) 0, \ (tnf_probe_func_t) 0, \ (tnf_probe_func_t) 0, \ (tnf_uint32_t) 0, \ /* attribute string */ \ "name " TNF_STRINGVALUE(namearg) ";" \ "slots " \ ";" \ "keys " keysarg ";" \ "file " __FILE__ ";" \ "line " TNF_STRINGVALUE(__LINE__) ";" \ detail, \ tnf_v_##namearg##_info, \ sizeof (struct tnf_v_buf_0) \ }; \ tnf_probe_control_t *tnf_v_probe_p = &tnf_v_##namearg##_probe; \ tnf_probe_test_func_t tnf_v_probe_test = tnf_v_probe_p->test_func; \ tnf_probe_setup_t tnf_v_set_p; \ struct tnf_v_buf_0 *tnf_v_probe_buffer; \ \ if (tnf_v_probe_test) { \ tnf_v_probe_buffer = (struct tnf_v_buf_0 *) \ tnf_v_probe_test(0, tnf_v_probe_p, &tnf_v_set_p); \ if (tnf_v_probe_buffer) { \ (tnf_v_probe_p->probe_func)(&tnf_v_set_p); \ } \ } \ } #endif /* NPROBE */ #ifdef NPROBE /* CSTYLED */ #define TNF_PROBE_1(namearg, keysarg, detail, type_1, namearg_1, valarg_1) \ ((void)0) #else /* CSTYLED */ #define TNF_PROBE_1(namearg, keysarg, detail, type_1, namearg_1, valarg_1) \ { \ struct tnf_v_buf_1 { \ tnf_probe_event_t probe_event; \ tnf_time_delta_t time_delta; \ type_1##_t data_1; \ }; \ static tnf_tag_data_t ** tnf_v_##namearg##_info[] = { \ &tnf_probe_event_tag_data, \ &tnf_time_delta_tag_data, \ &type_1##_tag_data, \ 0 }; \ static struct tnf_probe_control tnf_v_##namearg##_probe = { \ &__tnf_probe_version_1, \ (tnf_probe_control_t *) TNF_NEXT_INIT, \ (tnf_probe_test_func_t) 0, \ (tnf_probe_alloc_func_t) 0, \ (tnf_probe_func_t) 0, \ (tnf_probe_func_t) 0, \ (tnf_uint32_t) 0, \ /* attribute string */ \ "name " TNF_STRINGVALUE(namearg) ";" \ "slots " \ ""#namearg_1" " \ ";" \ "keys " keysarg ";" \ "file " __FILE__ ";" \ "line " TNF_STRINGVALUE(__LINE__) ";" \ detail, \ tnf_v_##namearg##_info, \ sizeof (struct tnf_v_buf_1) \ }; \ tnf_probe_control_t *tnf_v_probe_p = &tnf_v_##namearg##_probe; \ tnf_probe_test_func_t tnf_v_probe_test = tnf_v_probe_p->test_func; \ tnf_probe_setup_t tnf_v_set_p; \ struct tnf_v_buf_1 *tnf_v_probe_buffer; \ \ if (tnf_v_probe_test) { \ tnf_v_probe_buffer = (struct tnf_v_buf_1 *) \ tnf_v_probe_test(0, tnf_v_probe_p, &tnf_v_set_p); \ if (tnf_v_probe_buffer) { \ tnf_v_probe_buffer->data_1 = type_1( \ tnf_v_set_p.tpd_p, valarg_1, \ (tnf_record_p) &(tnf_v_probe_buffer->data_1)); \ (tnf_v_probe_p->probe_func)(&tnf_v_set_p); \ } \ } \ } #endif /* NPROBE */ #ifdef NPROBE /* CSTYLED */ #define TNF_PROBE_2(namearg, keysarg, detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2) \ ((void)0) #else /* CSTYLED */ #define TNF_PROBE_2(namearg, keysarg, detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2) \ { \ struct tnf_v_buf_2 { \ tnf_probe_event_t probe_event; \ tnf_time_delta_t time_delta; \ type_1##_t data_1; \ type_2##_t data_2; \ }; \ static tnf_tag_data_t ** tnf_v_##namearg##_info[] = { \ &tnf_probe_event_tag_data, \ &tnf_time_delta_tag_data, \ &type_1##_tag_data, \ &type_2##_tag_data, \ 0 }; \ static struct tnf_probe_control tnf_v_##namearg##_probe = { \ &__tnf_probe_version_1, \ (tnf_probe_control_t *) TNF_NEXT_INIT, \ (tnf_probe_test_func_t) 0, \ (tnf_probe_alloc_func_t) 0, \ (tnf_probe_func_t) 0, \ (tnf_probe_func_t) 0, \ (tnf_uint32_t) 0, \ /* attribute string */ \ "name " TNF_STRINGVALUE(namearg) ";" \ "slots " \ ""#namearg_1" " \ ""#namearg_2" " \ ";" \ "keys " keysarg ";" \ "file " __FILE__ ";" \ "line " TNF_STRINGVALUE(__LINE__) ";" \ detail, \ tnf_v_##namearg##_info, \ sizeof (struct tnf_v_buf_2) \ }; \ tnf_probe_control_t *tnf_v_probe_p = &tnf_v_##namearg##_probe; \ tnf_probe_test_func_t tnf_v_probe_test = tnf_v_probe_p->test_func; \ tnf_probe_setup_t tnf_v_set_p; \ struct tnf_v_buf_2 *tnf_v_probe_buffer; \ \ if (tnf_v_probe_test) { \ tnf_v_probe_buffer = (struct tnf_v_buf_2 *) \ tnf_v_probe_test(0, tnf_v_probe_p, &tnf_v_set_p); \ if (tnf_v_probe_buffer) { \ tnf_v_probe_buffer->data_1 = type_1( \ tnf_v_set_p.tpd_p, valarg_1, \ (tnf_record_p) &(tnf_v_probe_buffer->data_1)); \ tnf_v_probe_buffer->data_2 = type_2( \ tnf_v_set_p.tpd_p, valarg_2, \ (tnf_record_p) &(tnf_v_probe_buffer->data_2)); \ (tnf_v_probe_p->probe_func)(&tnf_v_set_p); \ } \ } \ } #endif /* NPROBE */ #ifdef NPROBE /* CSTYLED */ #define TNF_PROBE_3(namearg, keysarg, detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2, type_3, namearg_3, valarg_3) \ ((void)0) #else /* CSTYLED */ #define TNF_PROBE_3(namearg, keysarg, detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2, type_3, namearg_3, valarg_3) \ { \ struct tnf_v_buf_3 { \ tnf_probe_event_t probe_event; \ tnf_time_delta_t time_delta; \ type_1##_t data_1; \ type_2##_t data_2; \ type_3##_t data_3; \ }; \ static tnf_tag_data_t ** tnf_v_##namearg##_info[] = { \ &tnf_probe_event_tag_data, \ &tnf_time_delta_tag_data, \ &type_1##_tag_data, \ &type_2##_tag_data, \ &type_3##_tag_data, \ 0 }; \ static struct tnf_probe_control tnf_v_##namearg##_probe = { \ &__tnf_probe_version_1, \ (tnf_probe_control_t *) TNF_NEXT_INIT, \ (tnf_probe_test_func_t) 0, \ (tnf_probe_alloc_func_t) 0, \ (tnf_probe_func_t) 0, \ (tnf_probe_func_t) 0, \ (tnf_uint32_t) 0, \ /* attribute string */ \ "name " TNF_STRINGVALUE(namearg) ";" \ "slots " \ ""#namearg_1" " \ ""#namearg_2" " \ ""#namearg_3" " \ ";" \ "keys " keysarg ";" \ "file " __FILE__ ";" \ "line " TNF_STRINGVALUE(__LINE__) ";" \ detail, \ tnf_v_##namearg##_info, \ sizeof (struct tnf_v_buf_3) \ }; \ tnf_probe_control_t *tnf_v_probe_p = &tnf_v_##namearg##_probe; \ tnf_probe_test_func_t tnf_v_probe_test = tnf_v_probe_p->test_func; \ tnf_probe_setup_t tnf_v_set_p; \ struct tnf_v_buf_3 *tnf_v_probe_buffer; \ \ if (tnf_v_probe_test) { \ tnf_v_probe_buffer = (struct tnf_v_buf_3 *) \ tnf_v_probe_test(0, tnf_v_probe_p, &tnf_v_set_p); \ if (tnf_v_probe_buffer) { \ tnf_v_probe_buffer->data_1 = type_1( \ tnf_v_set_p.tpd_p, valarg_1, \ (tnf_record_p) &(tnf_v_probe_buffer->data_1)); \ tnf_v_probe_buffer->data_2 = type_2( \ tnf_v_set_p.tpd_p, valarg_2, \ (tnf_record_p) &(tnf_v_probe_buffer->data_2)); \ tnf_v_probe_buffer->data_3 = type_3( \ tnf_v_set_p.tpd_p, valarg_3, \ (tnf_record_p) &(tnf_v_probe_buffer->data_3)); \ (tnf_v_probe_p->probe_func)(&tnf_v_set_p); \ } \ } \ } #endif /* NPROBE */ #ifdef NPROBE /* CSTYLED */ #define TNF_PROBE_4(namearg, keysarg, detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2, type_3, namearg_3, valarg_3, type_4, namearg_4, valarg_4) \ ((void)0) #else /* CSTYLED */ #define TNF_PROBE_4(namearg, keysarg, detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2, type_3, namearg_3, valarg_3, type_4, namearg_4, valarg_4) \ { \ struct tnf_v_buf_4 { \ tnf_probe_event_t probe_event; \ tnf_time_delta_t time_delta; \ type_1##_t data_1; \ type_2##_t data_2; \ type_3##_t data_3; \ type_4##_t data_4; \ }; \ static tnf_tag_data_t ** tnf_v_##namearg##_info[] = { \ &tnf_probe_event_tag_data, \ &tnf_time_delta_tag_data, \ &type_1##_tag_data, \ &type_2##_tag_data, \ &type_3##_tag_data, \ &type_4##_tag_data, \ 0 }; \ static struct tnf_probe_control tnf_v_##namearg##_probe = { \ &__tnf_probe_version_1, \ (tnf_probe_control_t *) TNF_NEXT_INIT, \ (tnf_probe_test_func_t) 0, \ (tnf_probe_alloc_func_t) 0, \ (tnf_probe_func_t) 0, \ (tnf_probe_func_t) 0, \ (tnf_uint32_t) 0, \ /* attribute string */ \ "name " TNF_STRINGVALUE(namearg) ";" \ "slots " \ ""#namearg_1" " \ ""#namearg_2" " \ ""#namearg_3" " \ ""#namearg_4" " \ ";" \ "keys " keysarg ";" \ "file " __FILE__ ";" \ "line " TNF_STRINGVALUE(__LINE__) ";" \ detail, \ tnf_v_##namearg##_info, \ sizeof (struct tnf_v_buf_4) \ }; \ tnf_probe_control_t *tnf_v_probe_p = &tnf_v_##namearg##_probe; \ tnf_probe_test_func_t tnf_v_probe_test = tnf_v_probe_p->test_func; \ tnf_probe_setup_t tnf_v_set_p; \ struct tnf_v_buf_4 *tnf_v_probe_buffer; \ \ if (tnf_v_probe_test) { \ tnf_v_probe_buffer = (struct tnf_v_buf_4 *) \ tnf_v_probe_test(0, tnf_v_probe_p, &tnf_v_set_p); \ if (tnf_v_probe_buffer) { \ tnf_v_probe_buffer->data_1 = type_1( \ tnf_v_set_p.tpd_p, valarg_1, \ (tnf_record_p) &(tnf_v_probe_buffer->data_1)); \ tnf_v_probe_buffer->data_2 = type_2( \ tnf_v_set_p.tpd_p, valarg_2, \ (tnf_record_p) &(tnf_v_probe_buffer->data_2)); \ tnf_v_probe_buffer->data_3 = type_3( \ tnf_v_set_p.tpd_p, valarg_3, \ (tnf_record_p) &(tnf_v_probe_buffer->data_3)); \ tnf_v_probe_buffer->data_4 = type_4( \ tnf_v_set_p.tpd_p, valarg_4, \ (tnf_record_p) &(tnf_v_probe_buffer->data_4)); \ (tnf_v_probe_p->probe_func)(&tnf_v_set_p); \ } \ } \ } #endif /* NPROBE */ #ifdef NPROBE /* CSTYLED */ #define TNF_PROBE_5(namearg, keysarg, detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2, type_3, namearg_3, valarg_3, type_4, namearg_4, valarg_4, type_5, namearg_5, valarg_5) \ ((void)0) #else /* CSTYLED */ #define TNF_PROBE_5(namearg, keysarg, detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2, type_3, namearg_3, valarg_3, type_4, namearg_4, valarg_4, type_5, namearg_5, valarg_5) \ { \ struct tnf_v_buf_5 { \ tnf_probe_event_t probe_event; \ tnf_time_delta_t time_delta; \ type_1##_t data_1; \ type_2##_t data_2; \ type_3##_t data_3; \ type_4##_t data_4; \ type_5##_t data_5; \ }; \ static tnf_tag_data_t ** tnf_v_##namearg##_info[] = { \ &tnf_probe_event_tag_data, \ &tnf_time_delta_tag_data, \ &type_1##_tag_data, \ &type_2##_tag_data, \ &type_3##_tag_data, \ &type_4##_tag_data, \ &type_5##_tag_data, \ 0 }; \ static struct tnf_probe_control tnf_v_##namearg##_probe = { \ &__tnf_probe_version_1, \ (tnf_probe_control_t *) TNF_NEXT_INIT, \ (tnf_probe_test_func_t) 0, \ (tnf_probe_alloc_func_t) 0, \ (tnf_probe_func_t) 0, \ (tnf_probe_func_t) 0, \ (tnf_uint32_t) 0, \ /* attribute string */ \ "name " TNF_STRINGVALUE(namearg) ";" \ "slots " \ ""#namearg_1" " \ ""#namearg_2" " \ ""#namearg_3" " \ ""#namearg_4" " \ ""#namearg_5" " \ ";" \ "keys " keysarg ";" \ "file " __FILE__ ";" \ "line " TNF_STRINGVALUE(__LINE__) ";" \ detail, \ tnf_v_##namearg##_info, \ sizeof (struct tnf_v_buf_5) \ }; \ tnf_probe_control_t *tnf_v_probe_p = &tnf_v_##namearg##_probe; \ tnf_probe_test_func_t tnf_v_probe_test = tnf_v_probe_p->test_func; \ tnf_probe_setup_t tnf_v_set_p; \ struct tnf_v_buf_5 *tnf_v_probe_buffer; \ \ if (tnf_v_probe_test) { \ tnf_v_probe_buffer = (struct tnf_v_buf_5 *) \ tnf_v_probe_test(0, tnf_v_probe_p, &tnf_v_set_p); \ if (tnf_v_probe_buffer) { \ tnf_v_probe_buffer->data_1 = type_1( \ tnf_v_set_p.tpd_p, valarg_1, \ (tnf_record_p) &(tnf_v_probe_buffer->data_1)); \ tnf_v_probe_buffer->data_2 = type_2( \ tnf_v_set_p.tpd_p, valarg_2, \ (tnf_record_p) &(tnf_v_probe_buffer->data_2)); \ tnf_v_probe_buffer->data_3 = type_3( \ tnf_v_set_p.tpd_p, valarg_3, \ (tnf_record_p) &(tnf_v_probe_buffer->data_3)); \ tnf_v_probe_buffer->data_4 = type_4( \ tnf_v_set_p.tpd_p, valarg_4, \ (tnf_record_p) &(tnf_v_probe_buffer->data_4)); \ tnf_v_probe_buffer->data_5 = type_5( \ tnf_v_set_p.tpd_p, valarg_5, \ (tnf_record_p) &(tnf_v_probe_buffer->data_5)); \ (tnf_v_probe_p->probe_func)(&tnf_v_set_p); \ } \ } \ } #endif /* NPROBE */ /* * Debug Probe Macros (contain an additional "debug" attribute) */ #if defined(TNF_DEBUG) /* CSTYLED */ #define TNF_PROBE_0_DEBUG(namearg, keysarg, detail) TNF_PROBE_0(namearg, keysarg, "debug;" detail) #else /* CSTYLED */ #define TNF_PROBE_0_DEBUG(namearg, keysarg, detail) \ ((void)0) #endif /* defined(TNF_DEBUG) */ #if defined(TNF_DEBUG) /* CSTYLED */ #define TNF_PROBE_1_DEBUG(namearg, keysarg, detail, type_1, namearg_1, valarg_1) TNF_PROBE_1(namearg, keysarg, "debug;" detail, type_1, namearg_1, valarg_1) #else /* CSTYLED */ #define TNF_PROBE_1_DEBUG(namearg, keysarg, detail, type_1, namearg_1, valarg_1) \ ((void)0) #endif /* defined(TNF_DEBUG) */ #if defined(TNF_DEBUG) /* CSTYLED */ #define TNF_PROBE_2_DEBUG(namearg, keysarg, detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2) TNF_PROBE_2(namearg, keysarg, "debug;" detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2) #else /* CSTYLED */ #define TNF_PROBE_2_DEBUG(namearg, keysarg, detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2) \ ((void)0) #endif /* defined(TNF_DEBUG) */ #if defined(TNF_DEBUG) /* CSTYLED */ #define TNF_PROBE_3_DEBUG(namearg, keysarg, detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2, type_3, namearg_3, valarg_3) TNF_PROBE_3(namearg, keysarg, "debug;" detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2, type_3, namearg_3, valarg_3) #else /* CSTYLED */ #define TNF_PROBE_3_DEBUG(namearg, keysarg, detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2, type_3, namearg_3, valarg_3) \ ((void)0) #endif /* defined(TNF_DEBUG) */ #if defined(TNF_DEBUG) /* CSTYLED */ #define TNF_PROBE_4_DEBUG(namearg, keysarg, detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2, type_3, namearg_3, valarg_3, type_4, namearg_4, valarg_4) TNF_PROBE_4(namearg, keysarg, "debug;" detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2, type_3, namearg_3, valarg_3, type_4, namearg_4, valarg_4) #else /* CSTYLED */ #define TNF_PROBE_4_DEBUG(namearg, keysarg, detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2, type_3, namearg_3, valarg_3, type_4, namearg_4, valarg_4) \ ((void)0) #endif /* defined(TNF_DEBUG) */ #if defined(TNF_DEBUG) /* CSTYLED */ #define TNF_PROBE_5_DEBUG(namearg, keysarg, detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2, type_3, namearg_3, valarg_3, type_4, namearg_4, valarg_4, type_5, namearg_5, valarg_5) TNF_PROBE_5(namearg, keysarg, "debug;" detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2, type_3, namearg_3, valarg_3, type_4, namearg_4, valarg_4, type_5, namearg_5, valarg_5) #else /* CSTYLED */ #define TNF_PROBE_5_DEBUG(namearg, keysarg, detail, type_1, namearg_1, valarg_1, type_2, namearg_2, valarg_2, type_3, namearg_3, valarg_3, type_4, namearg_4, valarg_4, type_5, namearg_5, valarg_5) \ ((void)0) #endif /* defined(TNF_DEBUG) */ #ifdef __cplusplus } #endif #endif /* _SYS_TNF_PROBE_H */