gallium: block signals for new thread when spawning threads
authorDave Airlie <airlied@redhat.com>
Sun, 15 May 2011 06:41:54 +0000 (16:41 +1000)
committerDave Airlie <airlied@redhat.com>
Sun, 15 May 2011 20:40:26 +0000 (06:40 +1000)
I'm hard pressed to think of any reason a gallium thread would want to
receive a signal, especially considering its probably loaded as a library
and you don't want the threads interfering with the main threads signal
handling.

This solves a problem loading llvmpipe into the X server for AIGLX,
where the X server relies on the SIGIO signal going to the main thread,
but once llvmpipe loads the SIGIO can end up in any of its threads.

Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/auxiliary/os/os_thread.h

index 8173d4cc37ff2a124f55f59f057cf9c84ccb1db1..6b4281ad661cceecf7181ea298c880ab75636e19 100644 (file)
@@ -56,7 +56,14 @@ typedef pthread_t pipe_thread;
 static INLINE pipe_thread pipe_thread_create( void *(* routine)( void *), void *param )
 {
    pipe_thread thread;
-   if (pthread_create( &thread, NULL, routine, param ))
+   sigset_t saved_set, new_set;
+   int ret;
+
+   sigfillset(&new_set);
+   pthread_sigmask(SIG_SETMASK, &new_set, &saved_set);
+   ret = pthread_create( &thread, NULL, routine, param );
+   pthread_sigmask(SIG_SETMASK, &saved_set, NULL);
+   if (ret)
       return 0;
    return thread;
 }