aboutsummaryrefslogtreecommitdiff
path: root/audio/sdlaudio.c
diff options
context:
space:
mode:
authorths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>2007-07-11 23:23:15 +0000
committerths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>2007-07-11 23:23:15 +0000
commite784ba70e016eed3203e403256f87b34dd6ef48b (patch)
treeacb8b64af36c8467796568b5e70b9dac672c4880 /audio/sdlaudio.c
parentaf3a9031061251fbbee2c1f06b876c3732cfee71 (diff)
Ensure signals are properly masked for new SDL Audio threads, by Andrzej
Zaborowski. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3069 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'audio/sdlaudio.c')
-rw-r--r--audio/sdlaudio.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/audio/sdlaudio.c b/audio/sdlaudio.c
index f2a6896a52..11edab08d8 100644
--- a/audio/sdlaudio.c
+++ b/audio/sdlaudio.c
@@ -25,6 +25,13 @@
#include <SDL_thread.h>
#include "vl.h"
+#ifndef _WIN32
+#ifdef __sun__
+#define _POSIX_PTHREAD_SEMANTICS 1
+#endif
+#include <signal.h>
+#endif
+
#define AUDIO_CAP "sdl"
#include "audio_int.h"
@@ -177,11 +184,22 @@ static int sdl_to_audfmt (int sdlfmt, audfmt_e *fmt, int *endianess)
static int sdl_open (SDL_AudioSpec *req, SDL_AudioSpec *obt)
{
int status;
+#ifndef _WIN32
+ sigset_t new, old;
+
+ /* Make sure potential threads created by SDL don't hog signals. */
+ sigfillset (&new);
+ pthread_sigmask (SIG_BLOCK, &new, &old);
+#endif
status = SDL_OpenAudio (req, obt);
if (status) {
sdl_logerr ("SDL_OpenAudio failed\n");
}
+
+#ifndef _WIN32
+ pthread_sigmask (SIG_SETMASK, &old, 0);
+#endif
return status;
}