Add CTF enum type support to tracepoint event
[deliverable/lttng-ust.git] / include / lttng / tracepoint.h
index 1734c1b7ac8d6c0a5aaedcc9c5e9c4f3db8effc4..16348b86106c98e15abe58cf62b8fc11cdc43a4c 100644 (file)
@@ -28,6 +28,7 @@
 #include <lttng/tracepoint-types.h>
 #include <lttng/tracepoint-rcu.h>
 #include <urcu/compiler.h>
+#include <urcu/system.h>
 #include <dlfcn.h>     /* for dlopen */
 #include <string.h>    /* for memset */
 #include <lttng/ust-config.h>  /* for sdt */
@@ -36,8 +37,9 @@
 #ifdef LTTNG_UST_HAVE_SDT_INTEGRATION
 #define SDT_USE_VARIADIC
 #include <sys/sdt.h>
+#define LTTNG_STAP_PROBEV STAP_PROBEV
 #else
-#define STAP_PROBEV(...)
+#define LTTNG_STAP_PROBEV(...)
 #endif
 
 #ifdef __cplusplus
@@ -45,14 +47,14 @@ extern "C" {
 #endif
 
 #define tracepoint_enabled(provider, name) \
-       caa_unlikely(__tracepoint_##provider##___##name.state)
+       caa_unlikely(CMM_LOAD_SHARED(__tracepoint_##provider##___##name.state))
 
 #define do_tracepoint(provider, name, ...) \
        __tracepoint_cb_##provider##___##name(__VA_ARGS__)
 
 #define tracepoint(provider, name, ...)                                            \
        do {                                                                \
-               STAP_PROBEV(provider, name, ## __VA_ARGS__);                \
+               LTTNG_STAP_PROBEV(provider, name, ## __VA_ARGS__);          \
                if (tracepoint_enabled(provider, name))                     \
                        do_tracepoint(provider, name, __VA_ARGS__);         \
        } while (0)
@@ -428,6 +430,50 @@ __tracepoints__ptrs_destroy(void)
 
 /* The following declarations must be outside re-inclusion protection. */
 
+#ifndef TRACEPOINT_ENUM
+
+/*
+ * Tracepoint Enumerations
+ *
+ * The enumeration is a mapping between an integer, or range of integers, and
+ * a string. It can be used to have a more compact trace in cases where the
+ * possible values for a field are limited:
+ *
+ * An example:
+ *
+ * TRACEPOINT_ENUM(someproject_component, enumname,
+ *     TP_ENUM_VALUES(
+ *             ctf_enum_value("even", 0)
+ *             ctf_enum_value("uneven", 1)
+ *             ctf_enum_range("twoto4", 2, 4)
+ *             ctf_enum_value("five", 5)
+ *     )
+ * )
+ *
+ * Where "someproject_component" is the name of the component this enumeration
+ * belongs to and "enumname" identifies this enumeration. Inside the
+ * TP_ENUM_VALUES macro is the actual mapping. Each string value can map
+ * to either a single value with ctf_enum_value or a range of values
+ * with ctf_enum_range.
+ *
+ * Enumeration ranges may overlap, but the behavior is implementation-defined,
+ * each trace reader will handle overlapping as it wishes.
+ *
+ * That enumeration can then be used in a field inside the TP_FIELD macro using
+ * the following line:
+ *
+ * ctf_enum(someproject_component, enumname, enumtype, enumfield, enumval)
+ *
+ * Where "someproject_component" and "enumname" match those in the
+ * TRACEPOINT_ENUM, "enumtype" is a signed or unsigned integer type
+ * backing the enumeration, "enumfield" is the name of the field and
+ * "enumval" is the value.
+ */
+
+#define TRACEPOINT_ENUM(provider, name, values)
+
+#endif /* #ifndef TRACEPOINT_ENUM */
+
 #ifndef TRACEPOINT_EVENT
 
 /*
@@ -451,6 +497,9 @@ __tracepoints__ptrs_destroy(void)
  *         * Integer, printed with 0x base 16 * 
  *         ctf_integer_hex(unsigned long, field_d, arg1)
  *
+ *         * Enumeration *
+ *         ctf_enum(someproject_component, enum_name, int, field_e, arg0)
+ *
  *         * Array Sequence, printed as UTF8-encoded array of bytes * 
  *         ctf_array_text(char, field_b, string, FIXED_LEN)
  *         ctf_sequence_text(char, field_c, string, size_t, strlen)
This page took 0.025816 seconds and 5 git commands to generate.