From e32d20e94c6c0acb82cfacda4652fd566960c575 Mon Sep 17 00:00:00 2001 From: Wolfgang Puffitsch Date: Fri, 1 Jun 2012 12:04:37 -0400 Subject: [PATCH] Fix: Block all signals in listener thread The listener thread does not block signals and receives signals that are intended for the application. As this can cause applications to fail, the listener thread should block all signals. The attached patch is derived from an old commit and fixes the issue. Fixes #241 Signed-off-by: Mathieu Desnoyers --- liblttng-ust/lttng-ust-comm.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c index 0116b5f7..0d4f5ef9 100644 --- a/liblttng-ust/lttng-ust-comm.c +++ b/liblttng-ust/lttng-ust-comm.c @@ -837,6 +837,7 @@ int get_timeout(struct timespec *constructor_timeout) void __attribute__((constructor)) lttng_ust_init(void) { struct timespec constructor_timeout; + sigset_t sig_all_blocked, orig_parent_mask; int timeout_mode; int ret; @@ -873,6 +874,18 @@ void __attribute__((constructor)) lttng_ust_init(void) if (ret) { ERR("Error setting up to local apps"); } + + /* A new thread created by pthread_create inherits the signal mask + * from the parent. To avoid any signal being received by the + * listener thread, we block all signals temporarily in the parent, + * while we create the listener thread. + */ + sigfillset(&sig_all_blocked); + ret = pthread_sigmask(SIG_SETMASK, &sig_all_blocked, &orig_parent_mask); + if (ret) { + PERROR("pthread_sigmask: %s", strerror(ret)); + } + ret = pthread_create(&local_apps.ust_listener, NULL, ust_listener_thread, &local_apps); @@ -883,6 +896,12 @@ void __attribute__((constructor)) lttng_ust_init(void) handle_register_done(&local_apps); } + /* Restore original signal mask in parent */ + ret = pthread_sigmask(SIG_SETMASK, &orig_parent_mask, NULL); + if (ret) { + PERROR("pthread_sigmask: %s", strerror(ret)); + } + switch (timeout_mode) { case 1: /* timeout wait */ do { -- 2.34.1