X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=include%2Flttng%2Fust-events.h;h=41164ac348eb1edf14e83960f07027205cb037ca;hb=70f9f7f95a5a36231e4a71191bcd88d582c3ca81;hp=1e359b004791d9225fbbb15cff33e56b392ca854;hpb=92495593f8a331d04f993e396de9f2caa748fb6f;p=lttng-ust.git diff --git a/include/lttng/ust-events.h b/include/lttng/ust-events.h index 1e359b00..41164ac3 100644 --- a/include/lttng/ust-events.h +++ b/include/lttng/ust-events.h @@ -360,6 +360,7 @@ struct lttng_event_desc { union { struct { const char **model_emf_uri; + void (*event_notifier_callback)(void); } ext; char padding[LTTNG_UST_EVENT_DESC_PADDING]; } u; @@ -425,11 +426,11 @@ struct ust_pending_probe; struct lttng_event; /* - * Filter return value masks. + * Bytecode interpreter return value masks. */ -enum lttng_filter_ret { - LTTNG_FILTER_DISCARD = 0, - LTTNG_FILTER_RECORD_FLAG = (1ULL << 0), +enum lttng_bytecode_interpreter_ret { + LTTNG_INTERPRETER_DISCARD = 0, + LTTNG_INTERPRETER_RECORD_FLAG = (1ULL << 0), /* Other bits are kept for future use. */ }; @@ -441,19 +442,28 @@ enum lttng_filter_ret { */ struct lttng_bytecode_runtime { /* Associated bytecode */ - struct lttng_ust_filter_bytecode_node *bc; - uint64_t (*filter)(void *filter_data, const char *filter_stack_data); + struct lttng_ust_bytecode_node *bc; + union { + uint64_t (*filter)(void *interpreter_data, + const char *interpreter_stack_data); + } interpreter_funcs; int link_failed; struct cds_list_head node; /* list of bytecode runtime in event */ /* - * Pointer to a `struct lttng_session`-owned and URCU-protected - * pointer. + * Pointer to a URCU-protected pointer owned by an `struct + * lttng_session`or `struct lttng_event_notifier_group`. */ struct lttng_ctx **pctx; }; /* - * Objects in a linked-list of enablers, owned by an event. + * Objects in a linked-list of enablers, owned by an event or event_notifier. + * This is used because an event (or a event_notifier) 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 */ @@ -484,7 +494,7 @@ struct lttng_event { /* LTTng-UST 2.1 starts here */ /* list of struct lttng_bytecode_runtime, sorted by seqnum */ - struct cds_list_head bytecode_runtime_head; + struct cds_list_head filter_bytecode_runtime_head; int has_enablers_without_bytecode; /* Backward references: list of lttng_enabler_ref (ref to enablers) */ struct cds_list_head enablers_ref_head; @@ -492,6 +502,19 @@ struct lttng_event { int registered; /* has reg'd tracepoint probe */ }; +struct lttng_event_notifier { + uint64_t user_token; + int enabled; + int registered; /* has reg'd tracepoint probe */ + struct cds_list_head filter_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 event_notifiers */ + struct cds_list_head node; /* event_notifier list in session */ + struct lttng_event_notifier_group *group; /* weak ref */ +}; + struct lttng_enum { const struct lttng_enum_desc *desc; struct lttng_session *session; @@ -600,6 +623,12 @@ struct lttng_ust_event_ht { struct cds_hlist_head table[LTTNG_UST_EVENT_HT_SIZE]; }; +#define LTTNG_UST_EVENT_NOTIFIER_HT_BITS 12 +#define LTTNG_UST_EVENT_NOTIFIER_HT_SIZE (1U << LTTNG_UST_EVENT_NOTIFIER_HT_BITS) +struct lttng_ust_event_notifier_ht { + struct cds_hlist_head table[LTTNG_UST_EVENT_NOTIFIER_HT_SIZE]; +}; + #define LTTNG_UST_ENUM_HT_BITS 12 #define LTTNG_UST_ENUM_HT_SIZE (1U << LTTNG_UST_ENUM_HT_BITS) @@ -640,6 +669,17 @@ struct lttng_session { struct lttng_ctx *ctx; /* contexts for filters. */ }; +struct lttng_event_notifier_group { + int objd; + void *owner; + int notification_fd; + struct cds_list_head node; /* Event notifier group handle list */ + struct cds_list_head enablers_head; + struct cds_list_head event_notifiers_head; /* list of event_notifiers */ + struct lttng_ust_event_notifier_ht event_notifiers_ht; /* hashtable of event_notifiers */ + struct lttng_ctx *ctx; /* contexts for filters. */ +}; + struct lttng_transport { char *name; struct cds_list_head node; @@ -653,6 +693,9 @@ 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_event_notifier_notification_send( + struct lttng_event_notifier *event_notifier); + struct lttng_channel *lttng_channel_create(struct lttng_session *session, const char *transport_name, void *buf_addr, @@ -771,7 +814,6 @@ struct lttng_ust_field_iter * lttng_ust_field_list_get_iter_next(struct lttng_ust_field_list *list); void lttng_free_event_filter_runtime(struct lttng_event *event); -void lttng_filter_sync_state(struct lttng_bytecode_runtime *runtime); struct cds_list_head *lttng_get_probe_list_head(void); int lttng_session_active(void); @@ -807,6 +849,7 @@ 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); +void lttng_filter_sync_state(struct lttng_bytecode_runtime *runtime); #ifdef __cplusplus }