X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=include%2Flttng%2Fust-events.h;fp=include%2Flttng%2Fust-events.h;h=03d53bae142e34c618d8f49dde8b4a6f79afb066;hb=d5fc322413227cc4750d8a458226f16018203f20;hp=fd27396fb62f1a703c5854622763fd20e890053c;hpb=6b32a5c3984c2f26d78a6776c093d4f0924e05fc;p=lttng-ust.git diff --git a/include/lttng/ust-events.h b/include/lttng/ust-events.h index fd27396f..03d53bae 100644 --- a/include/lttng/ust-events.h +++ b/include/lttng/ust-events.h @@ -326,6 +326,7 @@ struct lttng_event_desc { union { struct { const char **model_emf_uri; + void (*trigger_callback)(void); } ext; char padding[LTTNG_UST_EVENT_DESC_PADDING]; } u; @@ -346,9 +347,9 @@ struct lttng_probe_desc { /* Data structures used by the tracer. */ -enum lttng_enabler_type { - LTTNG_ENABLER_STAR_GLOB, - LTTNG_ENABLER_EVENT, +enum lttng_enabler_format_type { + LTTNG_ENABLER_FORMAT_STAR_GLOB, + LTTNG_ENABLER_FORMAT_EVENT, }; /* @@ -356,21 +357,14 @@ enum lttng_enabler_type { * backward reference. */ struct lttng_enabler { - enum lttng_enabler_type type; + enum lttng_enabler_format_type format_type; /* head list of struct lttng_ust_filter_bytecode_node */ struct cds_list_head filter_bytecode_head; /* head list of struct lttng_ust_excluder_node */ struct cds_list_head excluder_head; - struct cds_list_head node; /* per-session list of enablers */ struct lttng_ust_event event_param; - struct lttng_channel *chan; - /* - * Unused, but kept around to make it explicit that the tracer can do - * it. - */ - struct lttng_ctx *ctx; unsigned int enabled:1; }; @@ -431,11 +425,20 @@ struct lttng_bytecode_runtime { uint64_t (*filter)(void *filter_data, const char *filter_stack_data); int link_failed; struct cds_list_head node; /* list of bytecode runtime in event */ - struct lttng_session *session; + /* + * Pointer to a URCU-protected pointer owned by an `struct + * lttng_session`or `struct lttng_trigger_group`. + */ + struct lttng_ctx **ctx; }; /* - * Objects in a linked-list of enablers, owned by an event. + * Objects in a linked-list of enablers, owned by an event or trigger. + * This is used because an event (or a trigger) can be enabled by more than one + * enabler and we want a quick way to iterate over all enablers of an object. + * + * For example, event rules "my_app:a*" and "my_app:ab*" will both match the + * event with the name "my_app:abc". */ struct lttng_enabler_ref { struct cds_list_head node; /* enabler ref list */ @@ -474,6 +477,19 @@ struct lttng_event { int registered; /* has reg'd tracepoint probe */ }; +struct lttng_trigger { + uint64_t id; + int enabled; + int registered; /* has reg'd tracepoint probe */ + struct cds_list_head bytecode_runtime_head; + int has_enablers_without_bytecode; + struct cds_list_head enablers_ref_head; + const struct lttng_event_desc *desc; + struct cds_hlist_node hlist; /* hashtable of triggers */ + struct cds_list_head node; /* Trigger list in session */ + struct lttng_trigger_group *group; /* weak ref */ +}; + struct lttng_enum { const struct lttng_enum_desc *desc; struct lttng_session *session; @@ -575,6 +591,12 @@ struct lttng_ust_event_ht { struct cds_hlist_head table[LTTNG_UST_EVENT_HT_SIZE]; }; +#define LTTNG_UST_TRIGGER_HT_BITS 12 +#define LTTNG_UST_TRIGGER_HT_SIZE (1U << LTTNG_UST_TRIGGER_HT_BITS) +struct lttng_ust_trigger_ht { + struct cds_hlist_head table[LTTNG_UST_TRIGGER_HT_SIZE]; +}; + #define LTTNG_UST_ENUM_HT_BITS 12 #define LTTNG_UST_ENUM_HT_SIZE (1U << LTTNG_UST_ENUM_HT_BITS) @@ -615,6 +637,17 @@ struct lttng_session { struct lttng_ctx *ctx; /* contexts for filters. */ }; +struct lttng_trigger_group { + int objd; + void *owner; + int notification_fd; + struct cds_list_head node; /* Trigger group handle list */ + struct cds_list_head enablers_head; + struct cds_list_head triggers_head; /* list of triggers */ + struct lttng_ust_trigger_ht triggers_ht; /* hashtable of triggers */ + struct lttng_ctx *ctx; /* contexts for filters. */ +}; + struct lttng_transport { char *name; struct cds_list_head node; @@ -628,6 +661,8 @@ int lttng_session_disable(struct lttng_session *session); int lttng_session_statedump(struct lttng_session *session); void lttng_session_destroy(struct lttng_session *session); +void lttng_trigger_send_notification(struct lttng_trigger *trigger); + struct lttng_channel *lttng_channel_create(struct lttng_session *session, const char *transport_name, void *buf_addr, @@ -641,18 +676,6 @@ struct lttng_channel *lttng_channel_create(struct lttng_session *session, int lttng_channel_enable(struct lttng_channel *channel); int lttng_channel_disable(struct lttng_channel *channel); -struct lttng_enabler *lttng_enabler_create(enum lttng_enabler_type type, - struct lttng_ust_event *event_param, - struct lttng_channel *chan); -int lttng_enabler_enable(struct lttng_enabler *enabler); -int lttng_enabler_disable(struct lttng_enabler *enabler); -int lttng_enabler_attach_bytecode(struct lttng_enabler *enabler, - struct lttng_ust_filter_bytecode_node *bytecode); -int lttng_enabler_attach_context(struct lttng_enabler *enabler, - struct lttng_ust_context *ctx); -int lttng_enabler_attach_exclusion(struct lttng_enabler *enabler, - struct lttng_ust_excluder_node *excluder); - int lttng_attach_context(struct lttng_ust_context *context_param, union ust_args *uargs, struct lttng_ctx **ctx, struct lttng_session *session); @@ -755,8 +778,6 @@ void lttng_probes_prune_field_list(struct lttng_ust_field_list *list); struct lttng_ust_field_iter * lttng_ust_field_list_get_iter_next(struct lttng_ust_field_list *list); -void lttng_enabler_event_link_bytecode(struct lttng_event *event, - struct lttng_enabler *enabler); void lttng_free_event_filter_runtime(struct lttng_event *event); void lttng_filter_sync_state(struct lttng_bytecode_runtime *runtime); @@ -778,6 +799,20 @@ extern struct lttng_ctx *lttng_static_ctx; void lttng_context_init(void); void lttng_context_exit(void); void lttng_filter_event_link_bytecode(struct lttng_event *event); +struct lttng_enabler *lttng_enabler_create( + enum lttng_enabler_format_type format_type, + struct lttng_ust_event *event_param, + struct lttng_channel *chan); +int lttng_enabler_enable(struct lttng_enabler *enabler); +int lttng_enabler_disable(struct lttng_enabler *enabler); +int lttng_enabler_attach_bytecode(struct lttng_enabler *enabler, + struct lttng_ust_filter_bytecode_node *bytecode); +int lttng_enabler_attach_context(struct lttng_enabler *enabler, + struct lttng_ust_context *ctx); +int lttng_enabler_attach_exclusion(struct lttng_enabler *enabler, + struct lttng_ust_excluder_node *excluder); +void lttng_enabler_event_link_bytecode(struct lttng_event *event, + struct lttng_enabler *enabler); #ifdef __cplusplus }