Tracepoint: evaluate arguments within test block
[lttng-ust.git] / include / lttng / tracepoint.h
index ffc37c175c1a7ac9aabcd5dfea38341219fd1bf8..8e3b604437e08040d249c7590d80dd17e0880d4b 100644 (file)
@@ -35,8 +35,11 @@ extern "C" {
  * Tracepoints should be added to the instrumented code using the
  * "tracepoint()" macro.
  */
-#define tracepoint(provider, name, args...)    \
-               __trace_##provider##___##name(args)
+#define tracepoint(provider, name, args...)                                    \
+       do {                                                                    \
+               if (caa_unlikely(__tracepoint_##provider##___##name.state))     \
+                       __trace_##provider##___##name(args);                    \
+       } while (0)
 
 /*
  * it_func[0] is never NULL because there is at least one element in the array
@@ -73,7 +76,9 @@ extern "C" {
 #define TP_COMBINE_TOKENS(_tokena, _tokenb)        TP_COMBINE_TOKENS1(_tokena, _tokenb)
 
 /* _TP_EVEN* extracts the vars names. */
+/* 0 and 1 are for void */
 #define _TP_EVEN0()
+#define _TP_EVEN1(a)
 #define _TP_EVEN2(a,b)                                         b
 #define _TP_EVEN4(a,b,c,d)                                     b,d
 #define _TP_EVEN6(a,b,c,d,e,f)                                 b,d,f
@@ -85,7 +90,9 @@ extern "C" {
 #define _TP_EVEN18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r)                b,d,f,h,j,l,n,p,r
 #define _TP_EVEN20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t)    b,d,f,h,j,l,n,p,r,t
 
+/* 0 and 1 are for void */
 #define _TP_EVEN_DATA0()                                               __tp_cb_data
+#define _TP_EVEN_DATA1(a)                                              __tp_cb_data
 #define _TP_EVEN_DATA2(a,b)                                            __tp_cb_data,b
 #define _TP_EVEN_DATA4(a,b,c,d)                                                __tp_cb_data,b,d
 #define _TP_EVEN_DATA6(a,b,c,d,e,f)                                    __tp_cb_data,b,d,f
@@ -98,7 +105,9 @@ extern "C" {
 #define _TP_EVEN_DATA20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t)       __tp_cb_data,b,d,f,h,j,l,n,p,r,t
 
 /* _TP_SPLIT extracts tuples of type, var */
+/* 0 and 1 are for void */
 #define _TP_SPLIT0()
+#define _TP_SPLIT1(a)
 #define _TP_SPLIT2(a,b)                                                a b
 #define _TP_SPLIT4(a,b,c,d)                                    a b,c d
 #define _TP_SPLIT6(a,b,c,d,e,f)                                        a b,c d,e f
@@ -110,7 +119,9 @@ extern "C" {
 #define _TP_SPLIT18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r)       a b,c d,e f,g h,i j,k l,m n,o p,q r
 #define _TP_SPLIT20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t)   a b,c d,e f,g h,i j,k l,m n,o p,q r,s t
 
+/* 0 and 1 are for void */
 #define _TP_SPLIT_DATA0()                                              void *__tp_cb_data
+#define _TP_SPLIT_DATA1(a)                                             void *__tp_cb_data
 #define _TP_SPLIT_DATA2(a,b)                                           void *__tp_cb_data,a b
 #define _TP_SPLIT_DATA4(a,b,c,d)                                       void *__tp_cb_data,a b,c d
 #define _TP_SPLIT_DATA6(a,b,c,d,e,f)                                   void *__tp_cb_data,a b,c d,e f
@@ -140,13 +151,6 @@ extern "C" {
 #define _TP_ARGS_PROTO_DATA(...)       _TP_PROTO_DATA_N(_TP_NARGS(0, ##__VA_ARGS__), ##__VA_ARGS__)
 #define _TP_ARGS_VARS_DATA(...)                _TP_VARS_DATA_N(_TP_NARGS(0, ##__VA_ARGS__), ##__VA_ARGS__)
 
-#define __CHECK_TRACE(provider, name, proto, args)                     \
-       do {                                                            \
-               if (caa_unlikely(__tracepoint_##provider##___##name.state))     \
-                       __DO_TRACE(&__tracepoint_##provider##___##name, \
-                               TP_PARAMS(proto), TP_PARAMS(args));     \
-       } while (0)
-
 /*
  * Make sure the alignment of the structure in the __tracepoints section will
  * not add unwanted padding between the beginning of the section and the
@@ -156,8 +160,8 @@ extern "C" {
        extern struct tracepoint __tracepoint_##provider##___##name;    \
        static inline void __trace_##provider##___##name(proto)         \
        {                                                               \
-               __CHECK_TRACE(provider, name, TP_PARAMS(data_proto),    \
-                             TP_PARAMS(data_args));                    \
+               __DO_TRACE(&__tracepoint_##provider##___##name,         \
+                       TP_PARAMS(data_proto), TP_PARAMS(data_args));   \
        }                                                               \
        static inline int                                               \
        __register_trace_##provider##___##name(void (*probe)(data_proto), void *data)   \
This page took 0.024884 seconds and 4 git commands to generate.