X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fmain.cpp;h=bfd53e7e47041818996b55d9bb15266901688ebf;hb=HEAD;hp=8d59952d6d404b408dba3c77eb0838615790baa4;hpb=28f23191dcbf047429d51950a337a57d7a3f866a;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/main.cpp b/src/bin/lttng-sessiond/main.cpp index 8d59952d6..0902969e7 100644 --- a/src/bin/lttng-sessiond/main.cpp +++ b/src/bin/lttng-sessiond/main.cpp @@ -52,6 +52,7 @@ #include #include #include +#include #include #include #include @@ -276,7 +277,6 @@ static void wait_consumer(struct consumer_data *consumer_data) static void sessiond_cleanup() { int ret; - struct ltt_session_list *session_list = session_get_list(); DBG("Cleanup sessiond"); @@ -326,8 +326,6 @@ static void sessiond_cleanup() DBG("Removing directory %s", the_config.consumerd64_path.value); (void) rmdir(the_config.consumerd64_path.value); - pthread_mutex_destroy(&session_list->lock); - DBG("Cleaning up all per-event notifier domain agents"); agent_by_event_notifier_domain_ht_destroy(); @@ -1281,38 +1279,38 @@ end: static void destroy_all_sessions_and_wait() { - struct ltt_session *session, *tmp; struct ltt_session_list *session_list; - session_list = session_get_list(); DBG("Initiating destruction of all sessions"); + auto list_lock = lttng::sessiond::lock_session_list(); + + session_list = session_get_list(); if (!session_list) { return; } - session_lock_list(); /* Initiate the destruction of all sessions. */ - cds_list_for_each_entry_safe (session, tmp, &session_list->head, list) { - if (!session_get(session)) { - continue; - } + for (auto raw_session_ptr : + lttng::urcu::list_iteration_adapter( + session_list->head)) { + const auto session = [raw_session_ptr]() { + session_get(raw_session_ptr); + raw_session_ptr->lock(); + return ltt_session::make_locked_ref(*raw_session_ptr); + }(); - session_lock(session); if (session->destroyed) { - goto unlock_session; + continue; } + (void) cmd_stop_trace(session); (void) cmd_destroy_session(session, nullptr); - unlock_session: - session_unlock(session); - session_put(session); } - session_unlock_list(); /* Wait for the destruction of all sessions to complete. */ DBG("Waiting for the destruction of all sessions to complete"); - session_list_wait_empty(); + session_list_wait_empty(std::move(list_lock)); DBG("Destruction of all sessions completed"); } @@ -1403,7 +1401,7 @@ static void sessiond_uuid_log() /* * main */ -int main(int argc, char **argv) +static int _main(int argc, char **argv) { int ret = 0, retval = 0; const char *env_app_timeout; @@ -1975,3 +1973,13 @@ exit_set_signal_handler: exit(EXIT_FAILURE); } } + +int main(int argc, char **argv) +{ + try { + return _main(argc, argv); + } catch (const std::exception& e) { + ERR_FMT("Unhandled exception caught by main thread: {}", e.what()); + abort(); + } +}