block all signals in listener thread
authorPierre-Marc Fournier <pierre-marc.fournier@polymtl.ca>
Thu, 27 May 2010 16:01:12 +0000 (12:01 -0400)
committerPierre-Marc Fournier <pierre-marc.fournier@polymtl.ca>
Thu, 27 May 2010 16:01:12 +0000 (12:01 -0400)
Not doing this can result in a situation where all the other application
threads have a signal blocked, and the listener thread, not having it blocked,
lets the signal handler execute. Therefore, in order to be as transparent as
possible to the application, we have to block signals.

libust/tracectl.c

index 3624b867f6d9f7a39bcae586878b00ae3abdd0b2..7a5cf9562282ce7fe90cc3d5e4c405d3bf44b8c6 100644 (file)
@@ -19,6 +19,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
+#include <pthread.h>
 #include <signal.h>
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -1031,17 +1032,38 @@ static pthread_t listener_thread;
 void create_listener(void)
 {
        int result;
+       sigset_t sig_all_blocked;
+       sigset_t orig_parent_mask;
 
        if(have_listener) {
                WARN("not creating listener because we already had one");
                return;
        }
 
+       /* 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);
+
+       result = pthread_sigmask(SIG_SETMASK, &sig_all_blocked, &orig_parent_mask);
+       if(result) {
+               PERROR("pthread_sigmask: %s", strerror(result));
+       }
+
        result = pthread_create(&listener_thread, NULL, listener_main, NULL);
        if(result == -1) {
                PERROR("pthread_create");
        }
 
+       /* Restore original signal mask in parent */
+       result = pthread_sigmask(SIG_SETMASK, &orig_parent_mask, NULL);
+       if(result) {
+               PERROR("pthread_sigmask: %s", strerror(result));
+       }
+
        have_listener = 1;
 }
 
This page took 0.028802 seconds and 4 git commands to generate.