Fix: many-events registration/unregistration speed
[lttng-ust.git] / liblttng-ust / lttng-events.c
index d09c97ca2b1995a7de7d875145f7c9d79573f94e..64f70f92bd9701ff15936d9fb6ec84176d389187 100644 (file)
@@ -184,7 +184,7 @@ void register_event(struct lttng_event *event)
 
        assert(event->registered == 0);
        desc = event->desc;
-       ret = __tracepoint_probe_register(desc->name,
+       ret = __tracepoint_probe_register_queue_release(desc->name,
                        desc->probe_callback,
                        event, desc->signature);
        WARN_ON_ONCE(ret);
@@ -200,7 +200,7 @@ void unregister_event(struct lttng_event *event)
 
        assert(event->registered == 1);
        desc = event->desc;
-       ret = __tracepoint_probe_unregister(desc->name,
+       ret = __tracepoint_probe_unregister_queue_release(desc->name,
                        desc->probe_callback,
                        event);
        WARN_ON_ONCE(ret);
@@ -230,6 +230,7 @@ void lttng_session_destroy(struct lttng_session *session)
                _lttng_event_unregister(event);
        }
        synchronize_trace();    /* Wait for in-flight events to complete */
+       __tracepoint_probe_prune_release_queue();
        cds_list_for_each_entry_safe(enabler, tmpenabler,
                        &session->enablers_head, node)
                lttng_enabler_destroy(enabler);
@@ -384,6 +385,16 @@ int lttng_create_all_ctx_enums(size_t nr_fields,
        return 0;
 }
 
+/*
+ * Ensure that a state-dump will be performed for this session at the end
+ * of the current handle_message().
+ */
+int lttng_session_statedump(struct lttng_session *session)
+{
+       session->statedump_pending = 1;
+       lttng_ust_sockinfo_session_enabled(session->owner);
+       return 0;
+}
 
 int lttng_session_enable(struct lttng_session *session)
 {
@@ -453,8 +464,9 @@ int lttng_session_enable(struct lttng_session *session)
        CMM_ACCESS_ONCE(session->active) = 1;
        CMM_ACCESS_ONCE(session->been_active) = 1;
 
-       session->statedump_pending = 1;
-       lttng_ust_sockinfo_session_enabled(session->owner);
+       ret = lttng_session_statedump(session);
+       if (ret)
+               return ret;
 end:
        return ret;
 }
@@ -1114,6 +1126,7 @@ void lttng_session_sync_enablers(struct lttng_session *session)
                        lttng_filter_sync_state(runtime);
                }
        }
+       __tracepoint_probe_prune_release_queue();
 }
 
 /*
This page took 0.023941 seconds and 4 git commands to generate.