tracepoint: split provider and event name
[lttng-ust.git] / include / lttng / tracepoint.h
index 927b1a3cd9ef83a48ec40053506d9cce20ed9e1f..98c3c8dd89bfd2b6419bca7f6e15b255967209aa 100644 (file)
@@ -20,6 +20,8 @@
 #include <lttng/ust-compiler.h>
 #include <lttng/ust-tracer.h>
 
+#define LTTNG_UST_TRACEPOINT_NAME_LEN_MAX      256
+
 #ifdef LTTNG_UST_HAVE_SDT_INTEGRATION
 /*
  * Instead of using SDT_USE_VARIADIC from 'sys/sdt.h', use our own namespaced
  */
 #include <sys/sdt.h>
 
-#define _LTTNG_SDT_NARG(...) \
-       __LTTNG_SDT_NARG(__VA_ARGS__, 12,11,10,9,8,7,6,5,4,3,2,1,0)
+#define _LTTNG_UST_SDT_NARG(...) \
+       __LTTNG_UST_SDT_NARG(__VA_ARGS__, 12,11,10,9,8,7,6,5,4,3,2,1,0)
 
-#define __LTTNG_SDT_NARG(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12, N, ...) N
+#define __LTTNG_UST_SDT_NARG(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12, N, ...) N
 
-#define _LTTNG_SDT_PROBE_N(provider, name, N, ...) \
+#define _LTTNG_UST_SDT_PROBE_N(provider, name, N, ...) \
        _SDT_PROBE(provider, name, N, (__VA_ARGS__))
 
-#define LTTNG_STAP_PROBEV(provider, name, ...) \
-       _LTTNG_SDT_PROBE_N(provider, name, _LTTNG_SDT_NARG(0, ##__VA_ARGS__), ##__VA_ARGS__)
+#define LTTNG_UST_STAP_PROBEV(provider, name, ...) \
+       _LTTNG_UST_SDT_PROBE_N(provider, name, _LTTNG_UST_SDT_NARG(0, ##__VA_ARGS__), ##__VA_ARGS__)
 
 #else
-#define LTTNG_STAP_PROBEV(...)
+#define LTTNG_UST_STAP_PROBEV(...)
 #endif
 
 #ifdef __cplusplus
@@ -55,7 +57,7 @@ extern "C" {
 
 #define tracepoint(provider, name, ...)                                            \
        do {                                                                \
-               LTTNG_STAP_PROBEV(provider, name, ## __VA_ARGS__);          \
+               LTTNG_UST_STAP_PROBEV(provider, name, ## __VA_ARGS__);      \
                if (tracepoint_enabled(provider, name))                     \
                        do_tracepoint(provider, name, __VA_ARGS__);         \
        } while (0)
@@ -154,6 +156,25 @@ extern "C" {
 #define _TP_ARGS_DATA_VAR(...)         _TP_DATA_VAR_N(_TP_NARGS(0, ##__VA_ARGS__), ##__VA_ARGS__)
 #define _TP_PARAMS(...)                        __VA_ARGS__
 
+/*
+ * sizeof(#_provider) - 1 : length of the provider string (excluding \0).
+ * sizeof(#_name) - 1     : length of the name string (excluding \0).
+ * + 1                    : separator between provider and event name.
+ *
+ * Upper bound (inclusive) is LTTNG_UST_TRACEPOINT_NAME_LEN_MAX - 1 to
+ * account for \0.
+ *
+ * The comparison is:
+ *   left hand side:   sizeof(#_provider) - 1 + sizeof(#_name) - 1 + 1
+ *   right hand side:  LTTNG_UST_TRACEPOINT_NAME_LEN_MAX - 1
+ *   operator:         <=  (inclusive)
+ * Simplified in the code below.
+ */
+#define lttng_ust_tracepoint_validate_name_len(_provider, _name)                                               \
+       lttng_ust_static_assert(sizeof(#_provider) + sizeof(#_name) <= LTTNG_UST_TRACEPOINT_NAME_LEN_MAX,       \
+               "Tracepoint name length is too long",                                                           \
+               Tracepoint_name_length_is_too_long)
+
 /*
  * The tracepoint cb is marked always inline so we can distinguish
  * between caller's ip addresses within the probe using the return
@@ -185,30 +206,32 @@ void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__))         \
 end:                                                                                   \
        tp_rcu_read_unlock();                                                           \
 }                                                                                      \
-static inline lttng_ust_notrace                                                                \
-void __tracepoint_register_##_provider##___##_name(char *name,                         \
-               void (*func)(void), void *data);                                        \
 static inline                                                                          \
-void __tracepoint_register_##_provider##___##_name(char *name,                         \
+void __tracepoint_register_##_provider##___##_name(char *provider_name, char *event_name, \
+               void (*func)(void), void *data)                                         \
+       lttng_ust_notrace;                                                              \
+static inline                                                                          \
+void __tracepoint_register_##_provider##___##_name(char *provider_name, char *event_name, \
                void (*func)(void), void *data)                                         \
 {                                                                                      \
-       __tracepoint_probe_register(name, func, data,                                   \
+       __tracepoint_probe_register(provider_name, event_name, func, data,              \
                __tracepoint_##_provider##___##_name.signature);                        \
 }                                                                                      \
-static inline lttng_ust_notrace                                                                \
-void __tracepoint_unregister_##_provider##___##_name(char *name,                       \
-               void (*func)(void), void *data);                                        \
 static inline                                                                          \
-void __tracepoint_unregister_##_provider##___##_name(char *name,                       \
+void __tracepoint_unregister_##_provider##___##_name(char *provider_name, char *event_name, \
+               void (*func)(void), void *data)                                         \
+       lttng_ust_notrace;                                                              \
+static inline                                                                          \
+void __tracepoint_unregister_##_provider##___##_name(char *provider_name, char *event_name, \
                void (*func)(void), void *data)                                         \
 {                                                                                      \
-       __tracepoint_probe_unregister(name, func, data);                                \
+       __tracepoint_probe_unregister(provider_name, event_name, func, data);           \
 }
 
-extern int __tracepoint_probe_register(const char *name, void (*func)(void),
-               void *data, const char *signature);
-extern int __tracepoint_probe_unregister(const char *name, void (*func)(void),
-               void *data);
+extern int __tracepoint_probe_register(const char *provider_name, const char *event_name,
+               void (*func)(void), void *data, const char *signature);
+extern int __tracepoint_probe_unregister(const char *provider_name, const char *event_name,
+               void (*func)(void), void *data);
 
 /*
  * tracepoint dynamic linkage handling (callbacks). Hidden visibility:
@@ -310,8 +333,9 @@ static inline void tracepoint_disable_destructors(void)
 }
 
 #ifndef _LGPL_SOURCE
-static inline void lttng_ust_notrace
-__tracepoint__init_urcu_sym(void);
+static inline void
+__tracepoint__init_urcu_sym(void)
+       lttng_ust_notrace;
 static inline void
 __tracepoint__init_urcu_sym(void)
 {
@@ -338,8 +362,9 @@ __tracepoint__init_urcu_sym(void)
                                        "tp_rcu_dereference_sym"));
 }
 #else
-static inline void lttng_ust_notrace
-__tracepoint__init_urcu_sym(void);
+static inline void
+__tracepoint__init_urcu_sym(void)
+       lttng_ust_notrace;
 static inline void
 __tracepoint__init_urcu_sym(void)
 {
@@ -442,14 +467,19 @@ extern struct lttng_ust_tracepoint * const __stop___tracepoints_ptrs[]
 #define _TP_EXTRACT_STRING(...)        #__VA_ARGS__
 
 #define _DEFINE_TRACEPOINT(_provider, _name, _args)                            \
+       lttng_ust_tracepoint_validate_name_len(_provider, _name);               \
        extern int __tracepoint_provider_##_provider;                           \
-       static const char __tp_strtab_##_provider##___##_name[]                 \
+       static const char __tp_provider_strtab_##_provider##___##_name[]        \
+               __attribute__((section("__tracepoints_strings"))) =             \
+                       #_provider;                                             \
+       static const char __tp_name_strtab_##_provider##___##_name[]            \
                __attribute__((section("__tracepoints_strings"))) =             \
-                       #_provider ":" #_name;                                  \
+                       #_name;                                                 \
        struct lttng_ust_tracepoint __tracepoint_##_provider##___##_name        \
                __attribute__((section("__tracepoints"))) = {                   \
                        sizeof(struct lttng_ust_tracepoint),                    \
-                       __tp_strtab_##_provider##___##_name,                    \
+                       __tp_provider_strtab_##_provider##___##_name,           \
+                       __tp_name_strtab_##_provider##___##_name,               \
                        0,                                                      \
                        NULL,                                                   \
                        _TRACEPOINT_UNDEFINED_REF(_provider),                   \
This page took 0.025736 seconds and 4 git commands to generate.