diff options
author | malc <av1474@comtv.ru> | 2010-08-06 13:08:46 +0400 |
---|---|---|
committer | malc <av1474@comtv.ru> | 2010-08-06 13:15:22 +0400 |
commit | 4b7c0418c0d33b8e5c690a33dce9c6664a714a24 (patch) | |
tree | cb9739515f4cdec05c99d10837552c52403e6c57 /audio/audio_pt_int.c | |
parent | 748a4ee311b8353292e85851034cb917906aac14 (diff) | |
download | qemu-4b7c0418c0d33b8e5c690a33dce9c6664a714a24.tar.gz qemu-4b7c0418c0d33b8e5c690a33dce9c6664a714a24.tar.bz2 qemu-4b7c0418c0d33b8e5c690a33dce9c6664a714a24.zip |
audio: make audio_pt_init block all signals
Signed-off-by: malc <av1474@comtv.ru>
Diffstat (limited to 'audio/audio_pt_int.c')
-rw-r--r-- | audio/audio_pt_int.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/audio/audio_pt_int.c b/audio/audio_pt_int.c index e889a983b1..f15cc7015b 100644 --- a/audio/audio_pt_int.c +++ b/audio/audio_pt_int.c @@ -6,6 +6,8 @@ #include "audio_int.h" #include "audio_pt_int.h" +#include <signal.h> + static void logerr (struct audio_pt *pt, int err, const char *fmt, ...) { va_list ap; @@ -23,9 +25,16 @@ int audio_pt_init (struct audio_pt *p, void *(*func) (void *), { int err, err2; const char *efunc; + sigset_t set, old_set; p->drv = drv; + err = sigfillset (&set); + if (err) { + logerr (p, errno, "%s(%s): sigfillset failed", cap, AUDIO_FUNC); + return -1; + } + err = pthread_mutex_init (&p->mutex, NULL); if (err) { efunc = "pthread_mutex_init"; @@ -38,7 +47,23 @@ int audio_pt_init (struct audio_pt *p, void *(*func) (void *), goto err1; } + err = pthread_sigmask (SIG_BLOCK, &set, &old_set); + if (err) { + efunc = "pthread_sigmask"; + goto err2; + } + err = pthread_create (&p->thread, NULL, func, opaque); + + err2 = pthread_sigmask (SIG_SETMASK, &old_set, NULL); + if (err2) { + logerr (p, err2, "%s(%s): pthread_sigmask (restore) failed", + cap, AUDIO_FUNC); + /* We have failed to restore original signal mask, all bets are off, + so terminate the process */ + exit (EXIT_FAILURE); + } + if (err) { efunc = "pthread_create"; goto err2; |