Fix: liblttng-ust-fork Makefile flags mismatch
[lttng-ust.git] / liblttng-ust / lttng-events.c
index 95082ceda6fadd21827db61cde7f56945c3dcdcf..980cfa766ef00163a2f015dad3e646b32e9e3091 100644 (file)
@@ -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:
@@ -400,7 +404,7 @@ int lttng_desc_match_wildcard_enabler(const struct lttng_event_desc *desc,
                struct lttng_enabler *enabler)
 {
        int loglevel = 0;
-       unsigned int has_loglevel;
+       unsigned int has_loglevel = 0;
 
        assert(enabler->type == LTTNG_ENABLER_WILDCARD);
        /* Compare excluding final '*' */
@@ -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);
                }
-
        }
 }
 
This page took 0.024206 seconds and 4 git commands to generate.