X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=liblttng-ust%2Flttng-events.c;h=6e16cf2548f04087ec3d1b6805736d3da1f179b5;hb=76b82fc001c026d676057dd5772db3eb55f9b0ba;hp=61021f3a696334558654b0990b91415c6aec1670;hpb=ed5b5bbd98b60355e8dec0d1e6507b0c6a132b0a;p=lttng-ust.git diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c index 61021f3a..6e16cf25 100644 --- a/liblttng-ust/lttng-events.c +++ b/liblttng-ust/lttng-events.c @@ -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. */