baddr: get session under lock
[lttng-ust.git] / liblttng-ust / lttng-events.c
index 61021f3a696334558654b0990b91415c6aec1670..6e16cf2548f04087ec3d1b6805736d3da1f179b5 100644 (file)
@@ -54,6 +54,7 @@
 #include "tracepoint-internal.h"
 #include "lttng-tracer.h"
 #include "lttng-tracer-core.h"
+#include "lttng-ust-baddr.h"
 #include "wait.h"
 #include "../libringbuffer/shm.h"
 #include "jhash.h"
@@ -77,6 +78,11 @@ void ust_unlock(void)
 
 static CDS_LIST_HEAD(sessions);
 
+struct cds_list_head *_lttng_get_sessions(void)
+{
+       return &sessions;
+}
+
 static void _lttng_event_destroy(struct lttng_event *event);
 
 static
@@ -293,6 +299,9 @@ int lttng_session_enable(struct lttng_session *session)
        /* Set atomically the state to "active" */
        CMM_ACCESS_ONCE(session->active) = 1;
        CMM_ACCESS_ONCE(session->been_active) = 1;
+
+       session->statedump_pending = 1;
+       lttng_ust_sockinfo_session_enabled(session->owner);
 end:
        return ret;
 }
@@ -672,6 +681,31 @@ int lttng_fix_pending_events(void)
        return 0;
 }
 
+/*
+ * For each session of the owner thread, execute pending statedump.
+ * Only dump state for the sessions owned by the caller thread, because
+ * we don't keep ust_lock across the entire iteration.
+ */
+int lttng_handle_pending_statedump(void *owner)
+{
+       struct lttng_session *session;
+
+       /* Execute state dump */
+       lttng_ust_baddr_statedump(owner);
+
+       /* Clear pending state dump */
+       ust_lock();
+       cds_list_for_each_entry(session, &sessions, node) {
+               if (session->owner != owner)
+                       continue;
+               if (!session->statedump_pending)
+                       continue;
+               session->statedump_pending = 0;
+       }
+       ust_unlock();
+       return 0;
+}
+
 /*
  * Only used internally at session destruction.
  */
This page took 0.024882 seconds and 4 git commands to generate.