projects
/
userspace-rcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: auto-resize hash table destroy deadlock
[userspace-rcu.git]
/
src
/
workqueue.c
diff --git
a/src/workqueue.c
b/src/workqueue.c
index b6361adafb5b97f2116ac9b864111c8cc2a55d92..1039d7297b9ce13446c4b81aee86fa217a005eab 100644
(file)
--- a/
src/workqueue.c
+++ b/
src/workqueue.c
@@
-284,6
+284,7
@@
struct urcu_workqueue *urcu_workqueue_create(unsigned long flags,
{
struct urcu_workqueue *workqueue;
int ret;
{
struct urcu_workqueue *workqueue;
int ret;
+ sigset_t newmask, oldmask;
workqueue = malloc(sizeof(*workqueue));
if (workqueue == NULL)
workqueue = malloc(sizeof(*workqueue));
if (workqueue == NULL)
@@
-304,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. */
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_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;
}
return workqueue;
}
@@
-464,13
+475,23
@@
void urcu_workqueue_resume_worker(struct urcu_workqueue *workqueue)
void urcu_workqueue_create_worker(struct urcu_workqueue *workqueue)
{
int ret;
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;
/* 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_create(&workqueue->tid, NULL, workqueue_thread, workqueue);
if (ret) {
urcu_die(ret);
}
+
+ ret = pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
+ urcu_posix_assert(!ret);
}
}
This page took
0.023899 seconds
and
4
git commands to generate.