Add CTF enum type support to tracepoint event
[deliverable/lttng-ust.git] / include / lttng / ust-events.h
index ac412624054e16da6a0bc822ab03f82364e208b3..f7cbc1a6dd27c972f6ec195442c7c0bd8913de08 100644 (file)
 #include <urcu/list.h>
 #include <urcu/hlist.h>
 #include <stdint.h>
+#include <lttng/ust-config.h>
 #include <lttng/ust-abi.h>
 #include <lttng/ust-tracer.h>
 #include <lttng/ust-endian.h>
 #include <float.h>
+#include <errno.h>
+#include <urcu/ref.h>
+#include <pthread.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -172,7 +176,8 @@ struct lttng_float_type {
 union _lttng_basic_type {
        struct lttng_integer_type integer;
        struct {
-               const char *name;
+               const struct lttng_enum_desc *desc;     /* Enumeration mapping */
+               struct lttng_integer_type container_type;
        } enumeration;
        struct {
                enum lttng_string_encodings encoding;
@@ -206,11 +211,10 @@ struct lttng_type {
 };
 
 #define LTTNG_UST_ENUM_TYPE_PADDING    24
-struct lttng_enum {
+struct lttng_enum_desc {
        const char *name;
-       struct lttng_type container_type;
        const struct lttng_enum_entry *entries;
-       unsigned int len;
+       unsigned int nr_entries;
        char padding[LTTNG_UST_ENUM_TYPE_PADDING];
 };
 
@@ -236,6 +240,8 @@ union lttng_ctx_value {
        double d;
 };
 
+struct lttng_perf_counter_field;
+
 #define LTTNG_UST_CTX_FIELD_PADDING    40
 struct lttng_ctx_field {
        struct lttng_event_field event_field;
@@ -246,16 +252,18 @@ struct lttng_ctx_field {
        void (*get_value)(struct lttng_ctx_field *field,
                         union lttng_ctx_value *value);
        union {
+               struct lttng_perf_counter_field *perf_counter;
                char padding[LTTNG_UST_CTX_FIELD_PADDING];
        } u;
        void (*destroy)(struct lttng_ctx_field *field);
 };
 
-#define LTTNG_UST_CTX_PADDING  24
+#define LTTNG_UST_CTX_PADDING  20
 struct lttng_ctx {
        struct lttng_ctx_field *fields;
        unsigned int nr_fields;
        unsigned int allocated_fields;
+       unsigned int largest_align;
        char padding[LTTNG_UST_CTX_PADDING];
 };
 
@@ -399,8 +407,6 @@ struct lttng_event {
        void *_deprecated1;
        struct lttng_ctx *ctx;
        enum lttng_ust_instrumentation instrumentation;
-       union {
-       } u;
        struct cds_list_head node;              /* Event list in session */
        struct cds_list_head _deprecated2;
        void *_deprecated3;
@@ -416,6 +422,14 @@ struct lttng_event {
        int registered;                 /* has reg'd tracepoint probe */
 };
 
+struct lttng_enum {
+       const struct lttng_enum_desc *desc;
+       struct lttng_session *session;
+       struct cds_list_head node;      /* Enum list in session */
+       struct cds_hlist_node hlist;    /* Session ht of enums */
+       uint64_t id;                    /* Enumeration ID in sessiond */
+};
+
 struct channel;
 struct lttng_ust_shm_handle;
 
@@ -431,9 +445,13 @@ struct lttng_channel_ops {
                        unsigned int switch_timer_interval,
                        unsigned int read_timer_interval,
                        unsigned char *uuid,
-                       uint32_t chan_id);
+                       uint32_t chan_id,
+                       const int *stream_fds, int nr_stream_fds);
        void (*channel_destroy)(struct lttng_channel *chan);
-       void *_deprecated1;
+       union {
+               void *_deprecated1;
+               unsigned long has_strcpy:1;             /* ABI has strcpy */
+       } u;
        void *_deprecated2;
        int (*event_reserve)(struct lttng_ust_lib_ring_buffer_ctx *ctx,
                             uint32_t event_id);
@@ -452,6 +470,8 @@ struct lttng_channel_ops {
        int (*is_finalized)(struct channel *chan);
        int (*is_disabled)(struct channel *chan);
        int (*flush_buffer)(struct channel *chan, struct lttng_ust_shm_handle *handle);
+       void (*event_strcpy)(struct lttng_ust_lib_ring_buffer_ctx *ctx,
+                       const char *src, size_t len);
 };
 
 /*
@@ -494,6 +514,13 @@ struct lttng_ust_event_ht {
        struct cds_hlist_head table[LTTNG_UST_EVENT_HT_SIZE];
 };
 
+#define LTTNG_UST_ENUM_HT_BITS         12
+#define LTTNG_UST_ENUM_HT_SIZE         (1U << LTTNG_UST_ENUM_HT_BITS)
+
+struct lttng_ust_enum_ht {
+       struct cds_hlist_head table[LTTNG_UST_ENUM_HT_SIZE];
+};
+
 /*
  * IMPORTANT: this structure is part of the ABI between the probe and
  * UST. Fields need to be only added at the end, never reordered, never
@@ -520,6 +547,10 @@ struct lttng_session {
 
        /* New UST 2.4 */
        int statedump_pending:1;
+
+       /* New UST 2.8 */
+       struct lttng_ust_enum_ht enums_ht;      /* ht of enumerations */
+       struct cds_list_head enums_head;
 };
 
 struct lttng_transport {
@@ -578,6 +609,7 @@ void lttng_probes_exit(void);
 int lttng_find_context(struct lttng_ctx *ctx, const char *name);
 int lttng_get_context_index(struct lttng_ctx *ctx, const char *name);
 struct lttng_ctx_field *lttng_append_context(struct lttng_ctx **ctx_p);
+void lttng_context_update(struct lttng_ctx *ctx);
 void lttng_remove_context_field(struct lttng_ctx **ctx_p,
                                struct lttng_ctx_field *field);
 void lttng_destroy_context(struct lttng_ctx *ctx);
@@ -586,9 +618,37 @@ int lttng_add_vpid_to_ctx(struct lttng_ctx **ctx);
 int lttng_add_pthread_id_to_ctx(struct lttng_ctx **ctx);
 int lttng_add_procname_to_ctx(struct lttng_ctx **ctx);
 int lttng_add_ip_to_ctx(struct lttng_ctx **ctx);
+int lttng_add_cpu_id_to_ctx(struct lttng_ctx **ctx);
 void lttng_context_vtid_reset(void);
 void lttng_context_vpid_reset(void);
 
+#ifdef LTTNG_UST_HAVE_PERF_EVENT
+int lttng_add_perf_counter_to_ctx(uint32_t type,
+                                 uint64_t config,
+                                 const char *name,
+                                 struct lttng_ctx **ctx);
+int lttng_perf_counter_init(void);
+void lttng_perf_counter_exit(void);
+#else /* #ifdef LTTNG_UST_HAVE_PERF_EVENT */
+static inline
+int lttng_add_perf_counter_to_ctx(uint32_t type,
+                                 uint64_t config,
+                                 const char *name,
+                                 struct lttng_ctx **ctx)
+{
+       return -ENOSYS;
+}
+static inline
+int lttng_perf_counter_init(void)
+{
+       return 0;
+}
+static inline
+void lttng_perf_counter_exit(void)
+{
+}
+#endif /* #else #ifdef LTTNG_UST_HAVE_PERF_EVENT */
+
 extern const struct lttng_ust_client_lib_ring_buffer_client_cb *lttng_client_callbacks_metadata;
 extern const struct lttng_ust_client_lib_ring_buffer_client_cb *lttng_client_callbacks_discard;
 extern const struct lttng_ust_client_lib_ring_buffer_client_cb *lttng_client_callbacks_overwrite;
@@ -616,6 +676,8 @@ int lttng_session_active(void);
 typedef int (*t_statedump_func_ptr)(struct lttng_session *session);
 void lttng_handle_pending_statedump(void *owner);
 struct cds_list_head *_lttng_get_sessions(void);
+struct lttng_enum *lttng_ust_enum_get(struct lttng_session *session,
+               const char *enum_name);
 
 #ifdef __cplusplus
 }
This page took 0.02574 seconds and 5 git commands to generate.