summaryrefslogtreecommitdiff
path: root/audio/audio_pt_int.c
diff options
context:
space:
mode:
authormalc <av1474@comtv.ru>2010-08-06 13:08:46 +0400
committermalc <av1474@comtv.ru>2010-08-06 13:15:22 +0400
commit4b7c0418c0d33b8e5c690a33dce9c6664a714a24 (patch)
treecb9739515f4cdec05c99d10837552c52403e6c57 /audio/audio_pt_int.c
parent748a4ee311b8353292e85851034cb917906aac14 (diff)
downloadqemu-4b7c0418c0d33b8e5c690a33dce9c6664a714a24.tar.gz
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.c25
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;