summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/os/os_thread.h
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2011-05-15 16:41:54 +1000
committerDave Airlie <airlied@redhat.com>2011-05-16 06:40:26 +1000
commitbc16c73407d11bb6702cf7de9925bfaeb80a5272 (patch)
tree12ee481ed773ffb80d695f6c50097cb7b91af544 /src/gallium/auxiliary/os/os_thread.h
parentbd5b7a6f7113da38a2c1f07a4a71e9993666a567 (diff)
downloadexternal_mesa3d-bc16c73407d11bb6702cf7de9925bfaeb80a5272.zip
external_mesa3d-bc16c73407d11bb6702cf7de9925bfaeb80a5272.tar.gz
external_mesa3d-bc16c73407d11bb6702cf7de9925bfaeb80a5272.tar.bz2
gallium: block signals for new thread when spawning threads
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>
Diffstat (limited to 'src/gallium/auxiliary/os/os_thread.h')
-rw-r--r--src/gallium/auxiliary/os/os_thread.h9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/os/os_thread.h b/src/gallium/auxiliary/os/os_thread.h
index 8173d4c..6b4281a 100644
--- a/src/gallium/auxiliary/os/os_thread.h
+++ b/src/gallium/auxiliary/os/os_thread.h
@@ -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;
}