RFC: This is necessary since we use the ust_app_ht_by_notify_sock to perform the cleanup operation. Since both ust_app_unregister and ust_app_ust_app_notify_unregister perform a remove of the app on the ust_ust_app_by_notify_sock but only ust_app_notify_unregister actually end up performing a close(call_rcu) on the socket.
Other way to do fix this problem? Could we simply not remove it on a ust_app_unregister? And always defer to the apps_notify_thread for cleanup? Update the value in the hash table to -1 and emit a close and remove from the hash table if the value is -1? We could also keep a local list of fd in apps_notify_thread and use it for cleanup instead of relying on ust_ust_app_by_notify_sock. I'm not sure what is the best/elegant solution here. I am not a fan of the current solution but it working. Obviously this commit will be reworded and modified accordingly. Signed-off-by: Jonathan Rajotte <[email protected]> --- src/bin/lttng-sessiond/main.c | 55 ++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c index 4a2a661f..216d0da6 100644 --- a/src/bin/lttng-sessiond/main.c +++ b/src/bin/lttng-sessiond/main.c @@ -6209,16 +6209,6 @@ int main(int argc, char **argv) } notification_thread_running = true; - /* Create thread to manage application notify socket */ - ret = pthread_create(&apps_notify_thread, default_pthread_attr(), - ust_thread_manage_notify, (void *) NULL); - if (ret) { - errno = ret; - PERROR("pthread_create notify"); - retval = -1; - stop_threads(); - goto exit_apps_notify; - } /* Create thread to manage application socket */ ret = pthread_create(&apps_thread, default_pthread_attr(), @@ -6231,6 +6221,17 @@ int main(int argc, char **argv) goto exit_apps; } + /* Create thread to manage application notify socket */ + ret = pthread_create(&apps_notify_thread, default_pthread_attr(), + ust_thread_manage_notify, (void *) NULL); + if (ret) { + errno = ret; + PERROR("pthread_create notify"); + retval = -1; + stop_threads(); + goto exit_apps_notify; + } + /* Create thread to dispatch registration */ ret = pthread_create(&dispatch_thread, default_pthread_attr(), thread_dispatch_ust_registration, (void *) NULL); @@ -6358,20 +6359,6 @@ exit_reg_apps: } exit_dispatch: - /* Instruct the apps thread to quit */ - ret = notify_thread_pipe(thread_apps_teardown_trigger_pipe[1]); - if (ret < 0) { - ERR("write error on thread quit pipe"); - } - - ret = pthread_join(apps_thread, &status); - if (ret) { - errno = ret; - PERROR("pthread_join apps"); - retval = -1; - } - -exit_apps: /* Instruct the apps_notify thread to quit */ ret = notify_thread_pipe(thread_apps_notify_teardown_trigger_pipe[1]); if (ret < 0) { @@ -6386,6 +6373,26 @@ exit_apps: } exit_apps_notify: + /* + * The barrier ensure that all previous resources, notify sockets in + * particular, are freed/closed. + */ + rcu_barrier(); + + /* Instruct the apps thread to quit */ + ret = notify_thread_pipe(thread_apps_teardown_trigger_pipe[1]); + if (ret < 0) { + ERR("write error on thread quit pipe"); + } + + ret = pthread_join(apps_thread, &status); + if (ret) { + errno = ret; + PERROR("pthread_join apps"); + retval = -1; + } + +exit_apps: exit_notification: exit_health: exit_init_data: -- 2.11.0 _______________________________________________ lttng-dev mailing list [email protected] https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
