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:05:28 +0000 (12:05 -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 0765c9b538a6a9370570647fea6780fe49070705..76c8ee3da149ff49ecfe4633d7904927f1683de9 100644 (file)
@@ -832,6 +832,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;
 
@@ -868,6 +869,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);
 
@@ -878,6 +891,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.037341 seconds and 4 git commands to generate.