X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=src%2Fworkqueue.c;h=1039d7297b9ce13446c4b81aee86fa217a005eab;hb=ea3a28a3f71dd02fb34ed4e3108f93275dbef89a;hp=c9f03b56fbb3ac85c58e5ef21330e03d0377d340;hpb=80c34c2de3d970eb82049798357743cfa71e8b54;p=urcu.git diff --git a/src/workqueue.c b/src/workqueue.c index c9f03b5..1039d72 100644 --- a/src/workqueue.c +++ b/src/workqueue.c @@ -129,8 +129,6 @@ static int set_thread_cpu_affinity(struct urcu_workqueue *workqueue __attribute_ static void futex_wait(int32_t *futex) { - int ret; - /* Read condition before read futex */ cmm_smp_mb(); while (uatomic_read(futex) == -1) { @@ -286,6 +284,7 @@ struct urcu_workqueue *urcu_workqueue_create(unsigned long flags, { struct urcu_workqueue *workqueue; int ret; + sigset_t newmask, oldmask; workqueue = malloc(sizeof(*workqueue)); if (workqueue == NULL) @@ -306,10 +305,20 @@ struct urcu_workqueue *urcu_workqueue_create(unsigned long flags, workqueue->cpu_affinity = cpu_affinity; workqueue->loop_count = 0; cmm_smp_mb(); /* Structure initialized before pointer is planted. */ + + ret = sigfillset(&newmask); + urcu_posix_assert(!ret); + ret = pthread_sigmask(SIG_BLOCK, &newmask, &oldmask); + urcu_posix_assert(!ret); + ret = pthread_create(&workqueue->tid, NULL, workqueue_thread, workqueue); if (ret) { urcu_die(ret); } + + ret = pthread_sigmask(SIG_SETMASK, &oldmask, NULL); + urcu_posix_assert(!ret); + return workqueue; } @@ -466,13 +475,23 @@ void urcu_workqueue_resume_worker(struct urcu_workqueue *workqueue) void urcu_workqueue_create_worker(struct urcu_workqueue *workqueue) { int ret; + sigset_t newmask, oldmask; /* Clear workqueue state from parent. */ workqueue->flags &= ~URCU_WORKQUEUE_PAUSED; workqueue->flags &= ~URCU_WORKQUEUE_PAUSE; workqueue->tid = 0; + + ret = sigfillset(&newmask); + urcu_posix_assert(!ret); + ret = pthread_sigmask(SIG_BLOCK, &newmask, &oldmask); + urcu_posix_assert(!ret); + ret = pthread_create(&workqueue->tid, NULL, workqueue_thread, workqueue); if (ret) { urcu_die(ret); } + + ret = pthread_sigmask(SIG_SETMASK, &oldmask, NULL); + urcu_posix_assert(!ret); }