X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=liblttng-ust%2Flttng-events.c;h=140e5caeea00cb27f5ddfc9df055ba5fc171ad50;hb=d0c8f180cac01b888a81ce8abb47ce9e57925a53;hp=d5fd9fee2f04b5636a4288e590a901ff8adf72d7;hpb=f0fde1c3984721c0660c7d5a1377db74b6c03a70;p=lttng-ust.git diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c index d5fd9fee..140e5cae 100644 --- a/liblttng-ust/lttng-events.c +++ b/liblttng-ust/lttng-events.c @@ -53,6 +53,7 @@ #include "ust-events-internal.h" #include "wait.h" #include "../libringbuffer/shm.h" +#include "../libringbuffer/frontend_types.h" #include "../libcounter/counter.h" #include "jhash.h" #include @@ -83,6 +84,22 @@ void lttng_event_notifier_group_sync_enablers( static void lttng_enabler_destroy(struct lttng_enabler *enabler); +bool lttng_ust_validate_event_name(const struct lttng_ust_event_desc *desc) +{ + if (strlen(desc->probe_desc->provider_name) + 1 + + strlen(desc->event_name) >= LTTNG_UST_ABI_SYM_NAME_LEN) + return false; + return true; +} + +void lttng_ust_format_event_name(const struct lttng_ust_event_desc *desc, + char *name) +{ + strcpy(name, desc->probe_desc->provider_name); + strcat(name, ":"); + strcat(name, desc->event_name); +} + /* * Called with ust lock held. */ @@ -230,16 +247,18 @@ struct lttng_event_notifier_group *lttng_event_notifier_group_create(void) * Only used internally at session destruction. */ static -void _lttng_channel_unmap(struct lttng_channel *lttng_chan) +void _lttng_channel_unmap(struct lttng_ust_channel_buffer *lttng_chan) { struct lttng_ust_lib_ring_buffer_channel *chan; struct lttng_ust_shm_handle *handle; - cds_list_del(<tng_chan->node); - lttng_destroy_context(lttng_chan->ctx); - chan = lttng_chan->chan; - handle = lttng_chan->handle; + cds_list_del(<tng_chan->priv->node); + lttng_destroy_context(lttng_chan->priv->ctx); + chan = lttng_chan->priv->rb_chan; + handle = chan->handle; channel_destroy(chan, handle, 0); + free(lttng_chan->parent); + free(lttng_chan->priv); free(lttng_chan); } @@ -248,10 +267,12 @@ void register_event(struct lttng_ust_event_common *event) { int ret; struct lttng_ust_event_desc *desc; + char name[LTTNG_UST_ABI_SYM_NAME_LEN]; assert(event->priv->registered == 0); desc = event->priv->desc; - ret = lttng_ust_tp_probe_register_queue_release(desc->name, + lttng_ust_format_event_name(desc, name); + ret = lttng_ust_tp_probe_register_queue_release(name, desc->probe_callback, event, desc->signature); WARN_ON_ONCE(ret); @@ -264,10 +285,12 @@ void unregister_event(struct lttng_ust_event_common *event) { int ret; struct lttng_ust_event_desc *desc; + char name[LTTNG_UST_ABI_SYM_NAME_LEN]; assert(event->priv->registered == 1); desc = event->priv->desc; - ret = lttng_ust_tp_probe_unregister_queue_release(desc->name, + lttng_ust_format_event_name(desc, name); + ret = lttng_ust_tp_probe_unregister_queue_release(name, desc->probe_callback, event); WARN_ON_ONCE(ret); @@ -284,7 +307,7 @@ void _lttng_event_unregister(struct lttng_ust_event_common *event) void lttng_session_destroy(struct lttng_ust_session *session) { - struct lttng_channel *chan, *tmpchan; + struct lttng_ust_channel_buffer_private *chan, *tmpchan; struct lttng_ust_event_recorder_private *event_recorder_priv, *tmpevent_recorder_priv; struct lttng_enum *_enum, *tmp_enum; struct lttng_event_enabler *event_enabler, *event_tmpenabler; @@ -305,7 +328,7 @@ void lttng_session_destroy(struct lttng_ust_session *session) &session->priv->enums_head, node) _lttng_enum_destroy(_enum); cds_list_for_each_entry_safe(chan, tmpchan, &session->priv->chan_head, node) - _lttng_channel_unmap(chan); + _lttng_channel_unmap(chan->pub); cds_list_del(&session->priv->node); lttng_destroy_context(session->priv->ctx); free(session->priv); @@ -544,7 +567,7 @@ int lttng_session_statedump(struct lttng_ust_session *session) int lttng_session_enable(struct lttng_ust_session *session) { int ret = 0; - struct lttng_channel *chan; + struct lttng_ust_channel_buffer_private *chan; int notify_socket; if (session->active) { @@ -589,7 +612,7 @@ int lttng_session_enable(struct lttng_ust_session *session) ret = ustcomm_register_channel(notify_socket, session, session->priv->objd, - chan->objd, + chan->parent.objd, nr_fields, fields, &chan_id, @@ -634,36 +657,36 @@ end: return ret; } -int lttng_channel_enable(struct lttng_channel *channel) +int lttng_channel_enable(struct lttng_ust_channel_common *lttng_channel) { int ret = 0; - if (channel->enabled) { + if (lttng_channel->enabled) { ret = -EBUSY; goto end; } /* Set transient enabler state to "enabled" */ - channel->tstate = 1; - lttng_session_sync_event_enablers(channel->session); + lttng_channel->priv->tstate = 1; + lttng_session_sync_event_enablers(lttng_channel->session); /* Set atomically the state to "enabled" */ - CMM_ACCESS_ONCE(channel->enabled) = 1; + CMM_ACCESS_ONCE(lttng_channel->enabled) = 1; end: return ret; } -int lttng_channel_disable(struct lttng_channel *channel) +int lttng_channel_disable(struct lttng_ust_channel_common *lttng_channel) { int ret = 0; - if (!channel->enabled) { + if (!lttng_channel->enabled) { ret = -EBUSY; goto end; } /* Set atomically the state to "disabled" */ - CMM_ACCESS_ONCE(channel->enabled) = 0; + CMM_ACCESS_ONCE(lttng_channel->enabled) = 0; /* Set transient enabler state to "enabled" */ - channel->tstate = 0; - lttng_session_sync_event_enablers(channel->session); + lttng_channel->priv->tstate = 0; + lttng_session_sync_event_enablers(lttng_channel->session); end: return ret; } @@ -674,14 +697,14 @@ struct cds_hlist_head *borrow_hash_table_bucket( unsigned int hash_table_size, struct lttng_ust_event_desc *desc) { - const char *event_name; + char name[LTTNG_UST_ABI_SYM_NAME_LEN]; size_t name_len; uint32_t hash; - event_name = desc->name; - name_len = strlen(event_name); + lttng_ust_format_event_name(desc, name); + name_len = strlen(name); - hash = jhash(event_name, name_len, 0); + hash = jhash(name, name_len, 0); return &hash_table[hash & (hash_table_size - 1)]; } @@ -690,17 +713,18 @@ struct cds_hlist_head *borrow_hash_table_bucket( */ static int lttng_event_recorder_create(struct lttng_ust_event_desc *desc, - struct lttng_channel *chan) + struct lttng_ust_channel_buffer *chan) { + char name[LTTNG_UST_ABI_SYM_NAME_LEN]; struct lttng_ust_event_recorder *event_recorder; struct lttng_ust_event_recorder_private *event_recorder_priv; - struct lttng_ust_session *session = chan->session; + struct lttng_ust_session *session = chan->parent->session; struct cds_hlist_head *head; int ret = 0; int notify_socket, loglevel; const char *uri; - head = borrow_hash_table_bucket(chan->session->priv->events_ht.table, + head = borrow_hash_table_bucket(chan->parent->session->priv->events_ht.table, LTTNG_UST_EVENT_HT_SIZE, desc); notify_socket = lttng_get_notify_socket(session->priv->owner); @@ -748,9 +772,10 @@ int lttng_event_recorder_create(struct lttng_ust_event_desc *desc, event_recorder->chan = chan; /* Event will be enabled by enabler sync. */ + event_recorder->parent->run_filter = lttng_ust_interpret_event_filter; event_recorder->parent->enabled = 0; event_recorder->parent->priv->registered = 0; - CDS_INIT_LIST_HEAD(&event_recorder->parent->filter_bytecode_runtime_head); + CDS_INIT_LIST_HEAD(&event_recorder->parent->priv->filter_bytecode_runtime_head); CDS_INIT_LIST_HEAD(&event_recorder->parent->priv->enablers_ref_head); event_recorder->parent->priv->desc = desc; @@ -763,12 +788,14 @@ int lttng_event_recorder_create(struct lttng_ust_event_desc *desc, else uri = NULL; + lttng_ust_format_event_name(desc, name); + /* Fetch event ID from sessiond */ ret = ustcomm_register_event(notify_socket, session, session->priv->objd, - chan->objd, - desc->name, + chan->priv->parent.objd, + name, loglevel, desc->signature, desc->nr_fields, @@ -780,7 +807,7 @@ int lttng_event_recorder_create(struct lttng_ust_event_desc *desc, goto sessiond_register_error; } - cds_list_add(&event_recorder_priv->node, &chan->session->priv->events_head); + cds_list_add(&event_recorder_priv->node, &chan->parent->session->priv->events_head); cds_hlist_add_head(&event_recorder_priv->hlist, head); return 0; @@ -845,11 +872,12 @@ int lttng_event_notifier_create(struct lttng_ust_event_desc *desc, event_notifier_priv->error_counter_index = error_counter_index; /* Event notifier will be enabled by enabler sync. */ + event_notifier->parent->run_filter = lttng_ust_interpret_event_filter; event_notifier->parent->enabled = 0; event_notifier_priv->parent.registered = 0; - CDS_INIT_LIST_HEAD(&event_notifier->parent->filter_bytecode_runtime_head); - CDS_INIT_LIST_HEAD(&event_notifier->capture_bytecode_runtime_head); + CDS_INIT_LIST_HEAD(&event_notifier->parent->priv->filter_bytecode_runtime_head); + CDS_INIT_LIST_HEAD(&event_notifier->priv->capture_bytecode_runtime_head); CDS_INIT_LIST_HEAD(&event_notifier_priv->parent.enablers_ref_head); event_notifier_priv->parent.desc = desc; event_notifier->notification_send = lttng_event_notifier_notification_send; @@ -872,12 +900,14 @@ static int lttng_desc_match_star_glob_enabler(struct lttng_ust_event_desc *desc, struct lttng_enabler *enabler) { + char name[LTTNG_UST_ABI_SYM_NAME_LEN]; int loglevel = 0; unsigned int has_loglevel = 0; + lttng_ust_format_event_name(desc, name); assert(enabler->format_type == LTTNG_ENABLER_FORMAT_STAR_GLOB); if (!strutils_star_glob_match(enabler->event_param.name, SIZE_MAX, - desc->name, SIZE_MAX)) + name, SIZE_MAX)) return 0; if (desc->loglevel) { loglevel = *(*desc->loglevel); @@ -895,11 +925,13 @@ static int lttng_desc_match_event_enabler(struct lttng_ust_event_desc *desc, struct lttng_enabler *enabler) { + char name[LTTNG_UST_ABI_SYM_NAME_LEN]; int loglevel = 0; unsigned int has_loglevel = 0; + lttng_ust_format_event_name(desc, name); assert(enabler->format_type == LTTNG_ENABLER_FORMAT_EVENT); - if (strcmp(desc->name, enabler->event_param.name)) + if (strcmp(name, enabler->event_param.name)) return 0; if (desc->loglevel) { loglevel = *(*desc->loglevel); @@ -940,8 +972,14 @@ int lttng_desc_match_enabler(struct lttng_ust_event_desc *desc, excluder_name = (char *) (excluder->excluder.names) + count * LTTNG_UST_ABI_SYM_NAME_LEN; len = strnlen(excluder_name, LTTNG_UST_ABI_SYM_NAME_LEN); - if (len > 0 && strutils_star_glob_match(excluder_name, len, desc->name, SIZE_MAX)) - return 0; + if (len > 0) { + char name[LTTNG_UST_ABI_SYM_NAME_LEN]; + + lttng_ust_format_event_name(desc, name); + if (strutils_star_glob_match(excluder_name, len, name, SIZE_MAX)) { + return 0; + } + } } } return 1; @@ -1001,7 +1039,7 @@ struct lttng_enabler_ref *lttng_enabler_ref( static void lttng_create_event_recorder_if_missing(struct lttng_event_enabler *event_enabler) { - struct lttng_ust_session *session = event_enabler->chan->session; + struct lttng_ust_session *session = event_enabler->chan->parent->session; struct lttng_ust_probe_desc *probe_desc; struct lttng_ust_event_desc *desc; struct lttng_ust_event_recorder_private *event_recorder_priv; @@ -1047,8 +1085,9 @@ void lttng_create_event_recorder_if_missing(struct lttng_event_enabler *event_en ret = lttng_event_recorder_create(probe_desc->event_desc[i], event_enabler->chan); if (ret) { - DBG("Unable to create event %s, error %d\n", - probe_desc->event_desc[i]->name, ret); + DBG("Unable to create event \"%s:%s\", error %d\n", + probe_desc->provider_name, + probe_desc->event_desc[i]->event_name, ret); } } } @@ -1132,7 +1171,7 @@ void _event_enum_destroy(struct lttng_ust_event_common *event) case LTTNG_UST_EVENT_TYPE_RECORDER: { struct lttng_ust_event_recorder *event_recorder = event->child; - struct lttng_ust_session *session = event_recorder->chan->session; + struct lttng_ust_session *session = event_recorder->chan->parent->session; unsigned int i; /* Destroy enums of the current event. */ @@ -1199,7 +1238,7 @@ void lttng_probe_provider_unregister_events( static int lttng_event_enabler_ref_event_recorders(struct lttng_event_enabler *event_enabler) { - struct lttng_ust_session *session = event_enabler->chan->session; + struct lttng_ust_session *session = event_enabler->chan->parent->session; struct lttng_ust_event_recorder_private *event_recorder_priv; if (!lttng_event_enabler_as_enabler(event_enabler)->enabled) @@ -1236,7 +1275,7 @@ int lttng_event_enabler_ref_event_recorders(struct lttng_event_enabler *event_en */ lttng_enabler_link_bytecode(event_recorder_priv->parent.desc, &session->priv->ctx, - &event_recorder_priv->pub->parent->filter_bytecode_runtime_head, + &event_recorder_priv->parent.filter_bytecode_runtime_head, <tng_event_enabler_as_enabler(event_enabler)->filter_bytecode_head); /* TODO: merge event context. */ @@ -1319,7 +1358,7 @@ void _lttng_event_destroy(struct lttng_ust_event_common *event) /* Remove from event hash table. */ cds_hlist_del(&event_recorder->priv->hlist); - lttng_destroy_context(event_recorder->ctx); + lttng_destroy_context(event_recorder->priv->ctx); free(event_recorder->parent); free(event_recorder->priv); free(event_recorder); @@ -1366,7 +1405,7 @@ void lttng_ust_abi_events_exit(void) struct lttng_event_enabler *lttng_event_enabler_create( enum lttng_enabler_format_type format_type, struct lttng_ust_abi_event *event_param, - struct lttng_channel *chan) + struct lttng_ust_channel_buffer *chan) { struct lttng_event_enabler *event_enabler; @@ -1381,8 +1420,8 @@ struct lttng_event_enabler *lttng_event_enabler_create( event_enabler->chan = chan; /* ctx left NULL */ event_enabler->base.enabled = 0; - cds_list_add(&event_enabler->node, &event_enabler->chan->session->priv->enablers_head); - lttng_session_lazy_sync_event_enablers(event_enabler->chan->session); + cds_list_add(&event_enabler->node, &event_enabler->chan->parent->session->priv->enablers_head); + lttng_session_lazy_sync_event_enablers(event_enabler->chan->parent->session); return event_enabler; } @@ -1430,7 +1469,7 @@ struct lttng_event_notifier_enabler *lttng_event_notifier_enabler_create( int lttng_event_enabler_enable(struct lttng_event_enabler *event_enabler) { lttng_event_enabler_as_enabler(event_enabler)->enabled = 1; - lttng_session_lazy_sync_event_enablers(event_enabler->chan->session); + lttng_session_lazy_sync_event_enablers(event_enabler->chan->parent->session); return 0; } @@ -1438,7 +1477,7 @@ int lttng_event_enabler_enable(struct lttng_event_enabler *event_enabler) int lttng_event_enabler_disable(struct lttng_event_enabler *event_enabler) { lttng_event_enabler_as_enabler(event_enabler)->enabled = 0; - lttng_session_lazy_sync_event_enablers(event_enabler->chan->session); + lttng_session_lazy_sync_event_enablers(event_enabler->chan->parent->session); return 0; } @@ -1459,7 +1498,7 @@ int lttng_event_enabler_attach_filter_bytecode(struct lttng_event_enabler *event _lttng_enabler_attach_filter_bytecode( lttng_event_enabler_as_enabler(event_enabler), bytecode); - lttng_session_lazy_sync_event_enablers(event_enabler->chan->session); + lttng_session_lazy_sync_event_enablers(event_enabler->chan->parent->session); return 0; } @@ -1479,7 +1518,7 @@ int lttng_event_enabler_attach_exclusion(struct lttng_event_enabler *event_enabl _lttng_enabler_attach_exclusion( lttng_event_enabler_as_enabler(event_enabler), excluder); - lttng_session_lazy_sync_event_enablers(event_enabler->chan->session); + lttng_session_lazy_sync_event_enablers(event_enabler->chan->parent->session); return 0; } @@ -1652,7 +1691,8 @@ void lttng_session_sync_event_enablers(struct lttng_ust_session *session) cds_list_for_each_entry(event_recorder_priv, &session->priv->events_head, node) { struct lttng_enabler_ref *enabler_ref; struct lttng_ust_bytecode_runtime *runtime; - int enabled = 0, has_enablers_without_bytecode = 0; + int enabled = 0, has_enablers_without_filter_bytecode = 0; + int nr_filters = 0; /* Enable events */ cds_list_for_each_entry(enabler_ref, @@ -1667,7 +1707,7 @@ void lttng_session_sync_event_enablers(struct lttng_ust_session *session) * intesection of session and channel transient enable * states. */ - enabled = enabled && session->priv->tstate && event_recorder_priv->pub->chan->tstate; + enabled = enabled && session->priv->tstate && event_recorder_priv->pub->chan->priv->parent.tstate; CMM_STORE_SHARED(event_recorder_priv->pub->parent->enabled, enabled); /* @@ -1687,18 +1727,21 @@ void lttng_session_sync_event_enablers(struct lttng_ust_session *session) &event_recorder_priv->parent.enablers_ref_head, node) { if (enabler_ref->ref->enabled && cds_list_empty(&enabler_ref->ref->filter_bytecode_head)) { - has_enablers_without_bytecode = 1; + has_enablers_without_filter_bytecode = 1; break; } } - event_recorder_priv->pub->parent->has_enablers_without_bytecode = - has_enablers_without_bytecode; + event_recorder_priv->parent.has_enablers_without_filter_bytecode = + has_enablers_without_filter_bytecode; /* Enable filters */ cds_list_for_each_entry(runtime, - &event_recorder_priv->pub->parent->filter_bytecode_runtime_head, node) { - lttng_bytecode_filter_sync_state(runtime); + &event_recorder_priv->parent.filter_bytecode_runtime_head, node) { + lttng_bytecode_sync_state(runtime); + nr_filters++; } + CMM_STORE_SHARED(event_recorder_priv->parent.pub->eval_filter, + !(has_enablers_without_filter_bytecode || !nr_filters)); } lttng_ust_tp_probe_prune_release_queue(); } @@ -1763,12 +1806,12 @@ void lttng_create_event_notifier_if_missing( /* Check that the probe supports event notifiers, else report the error. */ if (!lttng_ust_probe_supports_event_notifier(probe_desc)) { - ERR("Probe \"%s\" contains event \"%s\" which matches an enabled event notifier, " + ERR("Probe \"%s\" contains event \"%s:%s\" which matches an enabled event notifier, " "but its version (%u.%u) is too old and does not implement event notifiers. " "It needs to be recompiled against a newer version of LTTng-UST, otherwise " "this event will not generate any notification.", - probe_desc->provider, - desc->name, + probe_desc->provider_name, + probe_desc->provider_name, desc->event_name, probe_desc->major, probe_desc->minor); continue; @@ -1781,8 +1824,9 @@ void lttng_create_event_notifier_if_missing( event_notifier_enabler->error_counter_index, event_notifier_group); if (ret) { - DBG("Unable to create event_notifier %s, error %d\n", - probe_desc->event_desc[i]->name, ret); + DBG("Unable to create event_notifier \"%s:%s\", error %d\n", + probe_desc->provider_name, + probe_desc->event_desc[i]->event_name, ret); } } } @@ -1838,14 +1882,14 @@ int lttng_event_notifier_enabler_ref_event_notifiers( */ lttng_enabler_link_bytecode(event_notifier_priv->parent.desc, &event_notifier_group->ctx, - &event_notifier_priv->pub->parent->filter_bytecode_runtime_head, + &event_notifier_priv->parent.filter_bytecode_runtime_head, <tng_event_notifier_enabler_as_enabler(event_notifier_enabler)->filter_bytecode_head); /* * Link capture bytecodes if not linked yet. */ lttng_enabler_link_bytecode(event_notifier_priv->parent.desc, - &event_notifier_group->ctx, &event_notifier_priv->pub->capture_bytecode_runtime_head, + &event_notifier_group->ctx, &event_notifier_priv->capture_bytecode_runtime_head, &event_notifier_enabler->capture_bytecode_head); event_notifier_priv->num_captures = event_notifier_enabler->num_captures; @@ -1870,7 +1914,8 @@ void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group cds_list_for_each_entry(event_notifier_priv, &event_notifier_group->event_notifiers_head, node) { struct lttng_enabler_ref *enabler_ref; struct lttng_ust_bytecode_runtime *runtime; - int enabled = 0, has_enablers_without_bytecode = 0; + int enabled = 0, has_enablers_without_filter_bytecode = 0; + int nr_filters = 0, nr_captures = 0; /* Enable event_notifiers */ cds_list_for_each_entry(enabler_ref, @@ -1899,24 +1944,30 @@ void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group &event_notifier_priv->parent.enablers_ref_head, node) { if (enabler_ref->ref->enabled && cds_list_empty(&enabler_ref->ref->filter_bytecode_head)) { - has_enablers_without_bytecode = 1; + has_enablers_without_filter_bytecode = 1; break; } } - event_notifier_priv->pub->parent->has_enablers_without_bytecode = - has_enablers_without_bytecode; + event_notifier_priv->parent.has_enablers_without_filter_bytecode = + has_enablers_without_filter_bytecode; /* Enable filters */ cds_list_for_each_entry(runtime, - &event_notifier_priv->pub->parent->filter_bytecode_runtime_head, node) { - lttng_bytecode_filter_sync_state(runtime); + &event_notifier_priv->parent.filter_bytecode_runtime_head, node) { + lttng_bytecode_sync_state(runtime); + nr_filters++; } + CMM_STORE_SHARED(event_notifier_priv->parent.pub->eval_filter, + !(has_enablers_without_filter_bytecode || !nr_filters)); /* Enable captures. */ cds_list_for_each_entry(runtime, - &event_notifier_priv->pub->capture_bytecode_runtime_head, node) { - lttng_bytecode_capture_sync_state(runtime); + &event_notifier_priv->capture_bytecode_runtime_head, node) { + lttng_bytecode_sync_state(runtime); + nr_captures++; } + CMM_STORE_SHARED(event_notifier_priv->pub->eval_capture, + !!nr_captures); } lttng_ust_tp_probe_prune_release_queue(); } @@ -1947,14 +1998,14 @@ void lttng_ust_context_set_session_provider(const char *name, size_t (*get_size)(struct lttng_ust_ctx_field *field, size_t offset), void (*record)(struct lttng_ust_ctx_field *field, struct lttng_ust_lib_ring_buffer_ctx *ctx, - struct lttng_channel *chan), + struct lttng_ust_channel_buffer *chan), void (*get_value)(struct lttng_ust_ctx_field *field, struct lttng_ust_ctx_value *value)) { struct lttng_ust_session_private *session_priv; cds_list_for_each_entry(session_priv, &sessions, node) { - struct lttng_channel *chan; + struct lttng_ust_channel_buffer_private *chan; struct lttng_ust_event_recorder_private *event_recorder_priv; int ret; @@ -1969,7 +2020,7 @@ void lttng_ust_context_set_session_provider(const char *name, abort(); } cds_list_for_each_entry(event_recorder_priv, &session_priv->events_head, node) { - ret = lttng_ust_context_set_provider_rcu(&event_recorder_priv->pub->ctx, + ret = lttng_ust_context_set_provider_rcu(&event_recorder_priv->ctx, name, get_size, record, get_value); if (ret) abort(); @@ -1988,7 +2039,7 @@ void lttng_ust_context_set_event_notifier_group_provider(const char *name, size_t (*get_size)(struct lttng_ust_ctx_field *field, size_t offset), void (*record)(struct lttng_ust_ctx_field *field, struct lttng_ust_lib_ring_buffer_ctx *ctx, - struct lttng_channel *chan), + struct lttng_ust_channel_buffer *chan), void (*get_value)(struct lttng_ust_ctx_field *field, struct lttng_ust_ctx_value *value)) { @@ -2004,3 +2055,21 @@ void lttng_ust_context_set_event_notifier_group_provider(const char *name, abort(); } } + +int lttng_ust_session_uuid_validate(struct lttng_ust_session *session, + unsigned char *uuid) +{ + if (!session) + return 0; + /* Compare UUID with session. */ + if (session->priv->uuid_set) { + if (memcmp(session->priv->uuid, uuid, LTTNG_UST_UUID_LEN)) { + return -1; + } + } else { + memcpy(session->priv->uuid, uuid, LTTNG_UST_UUID_LEN); + session->priv->uuid_set = true; + } + return 0; + +}