sequence type: use previous field for length if length_name is NULL
[lttng-ust.git] / include / lttng / ust-events.h
index ca3d19818b2bc6dd19134d950afc889dfa52395f..6920306846f2bc273d883b027403d97281492adb 100644 (file)
@@ -9,8 +9,6 @@
 #ifndef _LTTNG_UST_EVENTS_H
 #define _LTTNG_UST_EVENTS_H
 
-#include <urcu/list.h>
-#include <urcu/hlist.h>
 #include <stddef.h>
 #include <stdint.h>
 #include <lttng/ust-abi.h>
@@ -20,6 +18,7 @@
 #include <errno.h>
 #include <urcu/ref.h>
 #include <pthread.h>
+#include <limits.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -38,8 +37,9 @@ extern "C" {
 
 struct lttng_ust_channel_buffer;
 struct lttng_ust_session;
-struct lttng_ust_lib_ring_buffer_ctx;
+struct lttng_ust_ring_buffer_ctx;
 struct lttng_ust_event_field;
+struct lttng_ust_registered_probe;
 
 /*
  * Data structures used by tracepoint event declarations, and by the
@@ -117,15 +117,15 @@ struct lttng_ust_type_integer {
 };
 
 #define lttng_ust_type_integer_define(_type, _byte_order, _base)       \
-       ((struct lttng_ust_type_common *) __LTTNG_COMPOUND_LITERAL(struct lttng_ust_type_integer, { \
+       ((struct lttng_ust_type_common *) LTTNG_UST_COMPOUND_LITERAL(struct lttng_ust_type_integer, { \
                .parent = {                                             \
                        .type = lttng_ust_type_integer,                 \
                },                                                      \
                .struct_size = sizeof(struct lttng_ust_type_integer),   \
                .size = sizeof(_type) * CHAR_BIT,                       \
-               .alignment = lttng_alignof(_type) * CHAR_BIT,           \
-               .signedness = lttng_is_signed_type(_type),              \
-               .reverse_byte_order = _byte_order != BYTE_ORDER,        \
+               .alignment = lttng_ust_rb_alignof(_type) * CHAR_BIT,    \
+               .signedness = lttng_ust_is_signed_type(_type),          \
+               .reverse_byte_order = _byte_order != LTTNG_UST_BYTE_ORDER,      \
                .base = _base,                                          \
        }))
 
@@ -148,7 +148,7 @@ struct lttng_ust_type_float {
                : 0))
 
 #define lttng_ust_type_float_define(_type)                             \
-       ((struct lttng_ust_type_common *) __LTTNG_COMPOUND_LITERAL(struct lttng_ust_type_float, { \
+       ((struct lttng_ust_type_common *) LTTNG_UST_COMPOUND_LITERAL(struct lttng_ust_type_float, { \
                .parent = {                                             \
                        .type = lttng_ust_type_float,                   \
                },                                                      \
@@ -156,8 +156,8 @@ struct lttng_ust_type_float {
                .exp_dig = sizeof(_type) * CHAR_BIT                     \
                        - lttng_ust_float_mant_dig(_type),              \
                .mant_dig = lttng_ust_float_mant_dig(_type),            \
-               .alignment = lttng_alignof(_type) * CHAR_BIT,           \
-               .reverse_byte_order = BYTE_ORDER != FLOAT_WORD_ORDER,   \
+               .alignment = lttng_ust_rb_alignof(_type) * CHAR_BIT,    \
+               .reverse_byte_order = LTTNG_UST_BYTE_ORDER != LTTNG_UST_FLOAT_WORD_ORDER,       \
        }))
 
 
@@ -170,25 +170,32 @@ struct lttng_ust_type_string {
 struct lttng_ust_type_enum {
        struct lttng_ust_type_common parent;
        uint32_t struct_size;
-       struct lttng_ust_enum_desc *desc;       /* Enumeration mapping */
-       struct lttng_ust_type_common *container_type;
+       const struct lttng_ust_enum_desc *desc; /* Enumeration mapping */
+       const struct lttng_ust_type_common *container_type;
 };
 
+/*
+ * The alignment field in structure, array, and sequence types is a
+ * minimum alignment requirement. The actual alignment of a type may be
+ * larger than this explicit alignment value if its nested types have a
+ * larger alignment.
+ */
+
 struct lttng_ust_type_array {
        struct lttng_ust_type_common parent;
        uint32_t struct_size;
-       struct lttng_ust_type_common *elem_type;
-       unsigned int length;                    /* Num. elems. */
-       unsigned int alignment;
+       const struct lttng_ust_type_common *elem_type;
+       unsigned int length;            /* Num. elems. */
+       unsigned int alignment;         /* Minimum alignment for this type. */
        enum lttng_ust_string_encoding encoding;
 };
 
 struct lttng_ust_type_sequence {
        struct lttng_ust_type_common parent;
        uint32_t struct_size;
-       const char *length_name;        /* Length field name. */
-       struct lttng_ust_type_common *elem_type;
-       unsigned int alignment;         /* Alignment before elements. */
+       const char *length_name;        /* Length field name. If NULL, use previous field. */
+       const struct lttng_ust_type_common *elem_type;
+       unsigned int alignment;         /* Minimum alignment before elements. */
        enum lttng_ust_string_encoding encoding;
 };
 
@@ -196,8 +203,8 @@ struct lttng_ust_type_struct {
        struct lttng_ust_type_common parent;
        uint32_t struct_size;
        unsigned int nr_fields;
-       struct lttng_ust_event_field **fields;  /* Array of pointers to fields. */
-       unsigned int alignment;
+       const struct lttng_ust_event_field * const *fields;     /* Array of pointers to fields. */
+       unsigned int alignment;                                 /* Minimum alignment for this type. */
 };
 
 /*
@@ -216,7 +223,7 @@ struct lttng_ust_enum_desc {
        uint32_t struct_size;
 
        const char *name;
-       struct lttng_ust_enum_entry **entries;
+       const struct lttng_ust_enum_entry * const *entries;
        unsigned int nr_entries;
 
        /* End of base ABI. Fields below should be used after checking struct_size. */
@@ -238,7 +245,7 @@ struct lttng_ust_event_field {
        uint32_t struct_size;
 
        const char *name;
-       struct lttng_ust_type_common *type;
+       const struct lttng_ust_type_common *type;
        unsigned int nowrite:1,         /* do not write into trace */
                nofilter:1;             /* do not consider for filter */
 
@@ -256,15 +263,15 @@ struct lttng_ust_event_field {
  * at the end of the structure.
  */
 struct lttng_ust_event_desc {
-       uint32_t struct_size;                   /* Size of this structure. */
+       uint32_t struct_size;                           /* Size of this structure. */
 
-       const char *name;
+       const char *event_name;
+       const struct lttng_ust_probe_desc *probe_desc;
        void (*probe_callback)(void);
-       struct lttng_event_ctx *ctx;            /* context */
-       struct lttng_ust_event_field **fields;  /* event payload */
+       const struct lttng_ust_event_field * const *fields;     /* event payload */
        unsigned int nr_fields;
        const int **loglevel;
-       const char *signature;                  /* Argument types/names received */
+       const char *signature;                          /* Argument types/names received */
        const char **model_emf_uri;
 
        /* End of base ABI. Fields below should be used after checking struct_size. */
@@ -282,12 +289,9 @@ struct lttng_ust_event_desc {
 struct lttng_ust_probe_desc {
        uint32_t struct_size;                   /* Size of this structure. */
 
-       const char *provider;
-       struct lttng_ust_event_desc **event_desc;
+       const char *provider_name;
+       const struct lttng_ust_event_desc * const *event_desc;
        unsigned int nr_events;
-       struct cds_list_head head;              /* chain registered probes */
-       struct cds_list_head lazy_init_head;
-       int lazy;                               /* lazy registration */
        uint32_t major;
        uint32_t minor;
 
@@ -296,6 +300,26 @@ struct lttng_ust_probe_desc {
 
 /* Data structures used by the tracer. */
 
+/*
+ * 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
+ * removed.
+ *
+ * The field @struct_size should be used to determine the size of the
+ * structure. It should be queried before using additional fields added
+ * at the end of the structure.
+ *
+ * The probe_ctx is not const because it may be extended to add future
+ * fields which could be modified by callbacks.
+ */
+struct lttng_ust_probe_ctx {
+       uint32_t struct_size;                   /* Size of this structure. */
+
+       void *ip;                               /* caller ip address */
+
+       /* End of base ABI. Fields below should be used after checking struct_size. */
+};
+
 /*
  * lttng_event structure is referred to by the tracing fast path. It
  * must be kept small.
@@ -305,7 +329,6 @@ struct lttng_ust_probe_desc {
  * removed.
  */
 
-struct lttng_ust_ctx;
 struct lttng_ust_event_common_private;
 
 enum lttng_ust_event_type {
@@ -346,8 +369,9 @@ struct lttng_ust_event_common {
 
        int enabled;
        int eval_filter;                                /* Need to evaluate filters */
-       int (*run_filter)(struct lttng_ust_event_common *event,
+       int (*run_filter)(const struct lttng_ust_event_common *event,
                const char *stack_data,
+               struct lttng_ust_probe_ctx *probe_ctx,
                void *filter_ctx);
 
        /* End of base ABI. Fields below should be used after checking struct_size. */
@@ -375,7 +399,6 @@ struct lttng_ust_event_recorder {
        struct lttng_ust_event_common *parent;          /* Inheritance by aggregation. */
        struct lttng_ust_event_recorder_private *priv;  /* Private event record interface */
 
-       unsigned int id;
        struct lttng_ust_channel_buffer *chan;
 
        /* End of base ABI. Fields below should be used after checking struct_size. */
@@ -393,7 +416,6 @@ struct lttng_ust_event_recorder {
 struct lttng_ust_notification_ctx {
        uint32_t struct_size;           /* Size of this structure. */
        int eval_capture;               /* Capture evaluation available. */
-
        /* End of base ABI. Fields below should be used after checking struct_size. */
 };
 
@@ -420,14 +442,15 @@ struct lttng_ust_event_notifier {
        struct lttng_ust_event_notifier_private *priv;  /* Private event notifier interface */
 
        int eval_capture;                               /* Need to evaluate capture */
-       void (*notification_send)(struct lttng_ust_event_notifier *event_notifier,
+       void (*notification_send)(const struct lttng_ust_event_notifier *event_notifier,
                const char *stack_data,
+               struct lttng_ust_probe_ctx *probe_ctx,
                struct lttng_ust_notification_ctx *notif_ctx);
 
        /* End of base ABI. Fields below should be used after checking struct_size. */
 };
 
-struct lttng_ust_lib_ring_buffer_channel;
+struct lttng_ust_ring_buffer_channel;
 struct lttng_ust_channel_buffer_ops_private;
 
 /*
@@ -444,14 +467,13 @@ struct lttng_ust_channel_buffer_ops {
 
        struct lttng_ust_channel_buffer_ops_private *priv;      /* Private channel buffer ops interface */
 
-       int (*event_reserve)(struct lttng_ust_lib_ring_buffer_ctx *ctx,
-                            uint32_t event_id);
-       void (*event_commit)(struct lttng_ust_lib_ring_buffer_ctx *ctx);
-       void (*event_write)(struct lttng_ust_lib_ring_buffer_ctx *ctx,
-                       const void *src, size_t len);
-       void (*event_strcpy)(struct lttng_ust_lib_ring_buffer_ctx *ctx,
+       int (*event_reserve)(struct lttng_ust_ring_buffer_ctx *ctx);
+       void (*event_commit)(struct lttng_ust_ring_buffer_ctx *ctx);
+       void (*event_write)(struct lttng_ust_ring_buffer_ctx *ctx,
+                       const void *src, size_t len, size_t alignment);
+       void (*event_strcpy)(struct lttng_ust_ring_buffer_ctx *ctx,
                        const char *src, size_t len);
-       void (*event_strcpy_pad)(struct lttng_ust_lib_ring_buffer_ctx *ctx,
+       void (*event_pstrcpy_pad)(struct lttng_ust_ring_buffer_ctx *ctx,
                        const char *src, size_t len);
 
        /* End of base ABI. Fields below should be used after checking struct_size. */
@@ -504,8 +526,6 @@ struct lttng_ust_channel_buffer {
        struct lttng_ust_channel_buffer_private *priv;  /* Private channel buffer interface */
 
        struct lttng_ust_channel_buffer_ops *ops;
-       struct lttng_ust_lib_ring_buffer_channel *chan; /* Channel buffers */
-       struct lttng_ust_shm_handle *handle;            /* shared-memory handle */
 
        /* End of base ABI. Fields below should be used after checking struct_size. */
 };
@@ -548,8 +568,15 @@ struct lttng_ust_session {
        /* End of base ABI. Fields below should be used after checking struct_size. */
 };
 
-int lttng_ust_probe_register(struct lttng_ust_probe_desc *desc);
-void lttng_ust_probe_unregister(struct lttng_ust_probe_desc *desc);
+/*
+ * On successful registration of a probe, a pointer to an opaque
+ * structure is returned. This pointer should be passed to
+ * lttng_ust_probe_unregister for unregistration.
+ * lttng_ust_probe_register returns NULL on error.
+ */
+struct lttng_ust_registered_probe *lttng_ust_probe_register(const struct lttng_ust_probe_desc *desc);
+
+void lttng_ust_probe_unregister(struct lttng_ust_registered_probe *reg_probe);
 
 /*
  * Applications that change their procname and need the new value to be
This page took 0.028251 seconds and 4 git commands to generate.