]> git.proxmox.com Git - qemu.git/commitdiff
posix-aio-compat: avoid signal race when spawning a thread
authormalc <av1474@comtv.ru>
Thu, 24 Sep 2009 20:20:44 +0000 (00:20 +0400)
committermalc <av1474@comtv.ru>
Sun, 27 Sep 2009 00:16:02 +0000 (04:16 +0400)
Signed-off-by: malc <av1474@comtv.ru>
posix-aio-compat.c

index 68cbec8bd150edce8bfb100fa7bff5747a691737..400d898e5cda532d09aca571fdd1630200398032 100644 (file)
@@ -301,14 +301,9 @@ static size_t handle_aiocb_rw(struct qemu_paiocb *aiocb)
 static void *aio_thread(void *unused)
 {
     pid_t pid;
-    sigset_t set;
 
     pid = getpid();
 
-    /* block all signals */
-    if (sigfillset(&set)) die("sigfillset");
-    if (sigprocmask(SIG_BLOCK, &set, NULL)) die("sigprocmask");
-
     while (1) {
         struct qemu_paiocb *aiocb;
         size_t ret = 0;
@@ -369,9 +364,18 @@ static void *aio_thread(void *unused)
 
 static void spawn_thread(void)
 {
+    sigset_t set, oldset;
+
     cur_threads++;
     idle_threads++;
+
+    /* block all signals */
+    if (sigfillset(&set)) die("sigfillset");
+    if (sigprocmask(SIG_SETMASK, &set, &oldset)) die("sigprocmask");
+
     thread_create(&thread_id, &attr, aio_thread, NULL);
+
+    if (sigprocmask(SIG_SETMASK, &oldset, NULL)) die("sigprocmask restore");
 }
 
 static void qemu_paio_submit(struct qemu_paiocb *aiocb)