Fix: Block all signals in listener thread
authorWolfgang Puffitsch <Wolfgang.Puffitsch@onera.fr>
Fri, 1 Jun 2012 16:04:37 +0000 (12:04 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 1 Jun 2012 16:07:55 +0000 (12:07 -0400)
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 <mathieu.desnoyers@efficios.com>
liblttng-ust/lttng-ust-comm.c

index 0116b5f744160cab7d4077146d4a532f606359d8..0d4f5ef9e9c389656b23016c8e63191ce9dce923 100644 (file)
@@ -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 {
This page took 0.030605 seconds and 4 git commands to generate.