X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-events.c;h=8d316b27c7ba4304529ab241a8cba1612a7251d4;hb=00b217e613614b8addc4ee2bbcdec473275842fd;hp=95082ceda6fadd21827db61cde7f56945c3dcdcf;hpb=e58095efc3a51a505fc533e3e56b9b5ed8743a8b;p=lttng-ust.git diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c index 95082ced..8d316b27 100644 --- a/liblttng-ust/lttng-events.c +++ b/liblttng-ust/lttng-events.c @@ -127,7 +127,7 @@ void synchronize_trace(void) struct lttng_session *lttng_session_create(void) { struct lttng_session *session; - int ret; + int ret, i; session = zmalloc(sizeof(struct lttng_session)); if (!session) @@ -135,6 +135,8 @@ struct lttng_session *lttng_session_create(void) CDS_INIT_LIST_HEAD(&session->chan_head); CDS_INIT_LIST_HEAD(&session->events_head); CDS_INIT_LIST_HEAD(&session->enablers_head); + for (i = 0; i < LTTNG_UST_EVENT_HT_SIZE; i++) + CDS_INIT_HLIST_HEAD(&session->events_ht.table[i]); ret = lttng_ust_uuid_generate(session->uuid); if (ret != 0) { session->uuid[0] = '\0'; @@ -329,17 +331,19 @@ int lttng_event_create(const struct lttng_event_desc *desc, { const char *event_name = desc->name; struct lttng_event *event; + struct cds_hlist_head *head; + struct cds_hlist_node *node; int ret = 0; + size_t name_len = strlen(event_name); + uint32_t hash; if (chan->used_event_id == -1U) { ret = -ENOMEM; goto full; } - /* - * This is O(n^2) (for each event, the loop is called at event - * creation). Might require a hash if we have lots of events. - */ - cds_list_for_each_entry(event, &chan->session->events_head, node) { + hash = jhash(event_name, name_len, 0); + head = &chan->session->events_ht.table[hash & (LTTNG_UST_EVENT_HT_SIZE - 1)]; + cds_hlist_for_each_entry(event, node, head, hlist) { assert(event->desc); if (!strncmp(event->desc->name, desc->name, @@ -380,13 +384,13 @@ int lttng_event_create(const struct lttng_event_desc *desc, if (ret) goto statedump_error; cds_list_add(&event->node, &chan->session->events_head); + cds_hlist_add_head(&event->hlist, head); return 0; statedump_error: WARN_ON_ONCE(__tracepoint_probe_unregister(event_name, desc->probe_callback, event)); - lttng_event_put(event->desc); register_error: free(event); cache_error: @@ -499,17 +503,24 @@ void lttng_create_event_if_missing(struct lttng_enabler *enabler) cds_list_for_each_entry(probe_desc, probe_list, head) { for (i = 0; i < probe_desc->nr_events; i++) { int found = 0, ret; + struct cds_hlist_head *head; + struct cds_hlist_node *node; + const char *event_name; + size_t name_len; + uint32_t hash; desc = probe_desc->event_desc[i]; if (!lttng_desc_match_enabler(desc, enabler)) continue; + event_name = desc->name; + name_len = strlen(event_name); /* - * For each event in session event list, - * check if already created. + * Check if already created. */ - cds_list_for_each_entry(event, - &session->events_head, node) { + hash = jhash(event_name, name_len, 0); + head = &session->events_ht.table[hash & (LTTNG_UST_EVENT_HT_SIZE - 1)]; + cds_hlist_for_each_entry(event, node, head, hlist) { if (event->desc == desc) found = 1; } @@ -610,7 +621,6 @@ void _lttng_event_destroy(struct lttng_event *event) { struct lttng_enabler_ref *enabler_ref, *tmp_enabler_ref; - lttng_event_put(event->desc); cds_list_del(&event->node); lttng_destroy_context(event->ctx); lttng_free_event_filter_runtime(event); @@ -1379,7 +1389,7 @@ void lttng_session_sync_enablers(struct lttng_session *session) cds_list_for_each_entry(event, &session->events_head, node) { struct lttng_enabler_ref *enabler_ref; struct lttng_bytecode_runtime *runtime; - int enabled = 0; + int enabled = 0, has_enablers_without_bytecode = 0; /* Enable events */ cds_list_for_each_entry(enabler_ref, @@ -1391,12 +1401,23 @@ void lttng_session_sync_enablers(struct lttng_session *session) } event->enabled = enabled; + /* Check if has enablers without bytecode enabled */ + cds_list_for_each_entry(enabler_ref, + &event->enablers_ref_head, node) { + if (enabler_ref->ref->enabled + && cds_list_empty(&enabler_ref->ref->filter_bytecode_head)) { + has_enablers_without_bytecode = 1; + break; + } + } + event->has_enablers_without_bytecode = + has_enablers_without_bytecode; + /* Enable filters */ cds_list_for_each_entry(runtime, &event->bytecode_runtime_head, node) { lttng_filter_sync_state(runtime); } - } }