[Mesa-dev] [PATCH] gallium: block signals for new thread when spawning threads
Jose Fonseca
jfonseca at vmware.com
Sun May 15 00:27:02 PDT 2011
Looks good to me. At least on llvmpipe rasterizer threads we don't want to handle any signal, and I agree it will be so in the general case.
Jose
----- Original Message -----
> From: Dave Airlie <airlied at redhat.com>
>
> 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 at redhat.com>
> ---
> 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 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;
> }
> --
> 1.7.4.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
More information about the mesa-dev
mailing list