diff options
author | Dave Airlie <[email protected]> | 2011-05-15 16:41:54 +1000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2011-05-16 06:40:26 +1000 |
commit | bc16c73407d11bb6702cf7de9925bfaeb80a5272 (patch) | |
tree | 12ee481ed773ffb80d695f6c50097cb7b91af544 /src/gallium/auxiliary | |
parent | bd5b7a6f7113da38a2c1f07a4a71e9993666a567 (diff) |
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 <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary')
-rw-r--r-- | src/gallium/auxiliary/os/os_thread.h | 9 |
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 8173d4cc37f..6b4281ad661 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; } |