From ee3993069ff55fa6f1c64daf1e09963e340db8e4 Mon Sep 17 00:00:00 2001 From: malc Date: Fri, 25 Sep 2009 00:20:44 +0400 Subject: posix-aio-compat: avoid signal race when spawning a thread Signed-off-by: malc --- posix-aio-compat.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'posix-aio-compat.c') diff --git a/posix-aio-compat.c b/posix-aio-compat.c index 68cbec8bd..400d898e5 100644 --- a/posix-aio-compat.c +++ b/posix-aio-compat.c @@ -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) -- cgit v1.2.3