cc [ flag ... ] file ... [ -ltnfprobe ] [ library ... ]
#include <tnf/probe.h>
TNF_DECLARE_RECORD(c_type, tnf_type);
TNF_DEFINE_RECORD_1(c_type, tnf_type, tnf_member_type_1, c_member_name_1)
TNF_DEFINE_RECORD_2(c_type, tnf_type, tnf_member_type_1, c_member_name_1, tnf_member_type_2, c_member_name_2)
TNF_DEFINE_RECORD_3(c_type, tnf_type, tnf_member_type_1, c_member_name_1, tnf_member_type_2, c_member_name_2, tnf_member_type_3, c_member_name_3)
TNF_DEFINE_RECORD_4(c_type, tnf_type, tnf_member_type_1, c_member_name_1, tnf_member_type_2, c_member_name_2, tnf_member_type_3, c_member_name_3, tnf_member_type_4, c_member_name_4)
TNF_DEFINE_RECORD_5(c_type, tnf_type, tnf_member_type_1, c_member_name_1, tnf_member_type_2, c_member_name_2, tnf_member_type_3, c_member_name_3, tnf_member_type_4, c_member_name_4, tnf_member_type_5, c_member_name_5)
There should be only one TNF_DECLARE_RECORD and one TNF_DEFINE_RECORD per new type being defined. The TNF_DECLARE_RECORD should precede the TNF_DEFINE_RECORD. It can be in a header file that multiple source files share if those source files need to use the tnf_type being defined. The TNF_DEFINE_RECORD should only appear in one of the source files.
The TNF_DEFINE_RECORD macro interface defines a function as well as a couple of data structures. Hence, this interface has to be used in a source file (.c or .cc file) at file scope and not inside a function.
Note that there is no semicolon after the TNF_DEFINE_RECORD interface. Having one will generate a compiler warning.
Compiling with the preprocessor option -DNPROBE (see cc(1B) ), or with the preprocessor control statement #define NPROBE ahead of the #include <tnf/probe.h> statement, will stop the TNF type extension code from being compiled into the program.
#include <tnf/probe.h> typedef struct pal_header { long size; char * descriptor; struct pal_header *next; } pal_header_t; TNF_DECLARE_RECORD(pal_header_t, pal_tnf_header); TNF_DEFINE_RECORD_2(pal_header_t, pal_tnf_header, tnf_long, size, tnf_string, descriptor) /* * Note: name space prefixed by pal_tnf_header should not be used by this * client anymore. */ void pal_free(pal_header_t *header_p) { int state; TNF_PROBE_2(pal_free_start, "palloc pal_free", "sunw%debug entering pal_free", tnf_long, state_var, state, pal_tnf_header, header_var, header_p); . . . }