X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fsession.hpp;h=48f3532f182728fc1b7db8ef2cd23a91a9e613eb;hb=cd9adb8b829564212158943a0d279bb35322ab30;hp=0fad8132cc9661b6af65bd4bf4b3562ff5090fc7;hpb=c08136a3fab16fd3f620c8bcd93f25ea68382d00;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/session.hpp b/src/bin/lttng-sessiond/session.hpp index 0fad8132c..48f3532f1 100644 --- a/src/bin/lttng-sessiond/session.hpp +++ b/src/bin/lttng-sessiond/session.hpp @@ -14,6 +14,8 @@ #include #include +#include +#include #include #include #include @@ -22,12 +24,20 @@ #include "trace-kernel.hpp" #include "consumer.hpp" +#define ASSERT_SESSION_LIST_LOCKED() LTTNG_ASSERT(session_trylock_list()) + struct ltt_ust_session; -typedef void (*ltt_session_destroy_notifier)(const struct ltt_session *session, - void *user_data); -typedef void (*ltt_session_clear_notifier)(const struct ltt_session *session, - void *user_data); +using ltt_session_destroy_notifier = void (*)(const struct ltt_session *, void *); +using ltt_session_clear_notifier = void (*)(const struct ltt_session *, void *); + +namespace lttng { +namespace sessiond { +namespace details { +void locked_session_release(ltt_session *session); +} /* namespace details */ +} /* namespace sessiond */ +} /* namespace lttng */ /* * Tracing session list @@ -65,6 +75,12 @@ struct ltt_session_list { * session for both LTTng and UST. */ struct ltt_session { + using id_t = uint64_t; + using locked_ptr = std::unique_ptr::deleter>; + using sptr = std::shared_ptr; + char name[NAME_MAX]; bool has_auto_generated_name; bool name_contains_creation_time; @@ -82,7 +98,8 @@ struct ltt_session { */ pthread_mutex_t lock; struct cds_list_head list; - uint64_t id; /* session unique identifier */ + /* session unique identifier */ + id_t id; /* Indicates if the session has been added to the session list and ht.*/ bool published; /* Indicates if a destroy command has been applied to this session. */ @@ -212,9 +229,9 @@ void session_unlock(struct ltt_session *session); * In other words, it prevents tracer configurations from changing while they * are being transmitted to the various applications. */ -void session_lock_list(void); -int session_trylock_list(void); -void session_unlock_list(void); +void session_lock_list(); +int session_trylock_list(); +void session_unlock_list(); void session_destroy(struct ltt_session *session); int session_add_destroy_notifier(struct ltt_session *session, @@ -238,10 +255,10 @@ struct lttng_trace_archive_location *session_get_trace_archive_location( const struct ltt_session *session); struct ltt_session *session_find_by_name(const char *name); -struct ltt_session *session_find_by_id(uint64_t id); +struct ltt_session *session_find_by_id(ltt_session::id_t id); -struct ltt_session_list *session_get_list(void); -void session_list_wait_empty(void); +struct ltt_session_list *session_get_list(); +void session_list_wait_empty(); bool session_access_ok(struct ltt_session *session, uid_t uid); @@ -292,4 +309,26 @@ bool session_output_supports_trace_chunks(const struct ltt_session *session); */ bool sample_session_id_by_name(const char *name, uint64_t *id); +namespace lttng { +namespace sessiond { + +/* + * Session list lock must be acquired by the caller. + * The caller must not keep the ownership of the returned locked session + * for longer than strictly necessary. If your intention is to acquire + * a reference to an ltt_session, see `find_session_by_id()`. + */ +ltt_session::locked_ptr find_locked_session_by_id(ltt_session::id_t id); + +/* + * Session list lock must be acquired by the caller. + * The caller must not keep the ownership of the returned locked session + * for longer than strictly necessary. If your intention is to acquire + * a reference to an ltt_session, see `find_session_by_id()`. + */ +ltt_session::sptr find_session_by_id(ltt_session::id_t id); + +} /* namespace sessiond */ +} /* namespace lttng */ + #endif /* _LTT_SESSION_H */