X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu-call-rcu-impl.h;h=38cc00190f018cf1afd7fac07e42bcedec484af3;hp=b9e57cd60a2ba731a2030cd36c9b9b6c211c416e;hb=765f3eadad5647e6fa853414fc652670f9e00966;hpb=a128aeb4a7b1a05c9ddbc8b0239c93ca00984f4a diff --git a/urcu-call-rcu-impl.h b/urcu-call-rcu-impl.h index b9e57cd..38cc001 100644 --- a/urcu-call-rcu-impl.h +++ b/urcu-call-rcu-impl.h @@ -215,6 +215,11 @@ static void *call_rcu_thread(void *arg) exit(-1); } + /* + * If callbacks take a read-side lock, we need to be registered. + */ + rcu_register_thread(); + thread_call_rcu_data = crdp; if (!rt) { uatomic_dec(&crdp->futex); @@ -247,6 +252,7 @@ static void *call_rcu_thread(void *arg) } if (uatomic_read(&crdp->flags) & URCU_CALL_RCU_STOP) break; + rcu_thread_offline(); if (!rt) { if (&crdp->cbs.head == _CMM_LOAD_SHARED(crdp->cbs.tail)) { @@ -264,6 +270,7 @@ static void *call_rcu_thread(void *arg) } else { poll(NULL, 0, 10); } + rcu_thread_online(); } if (!rt) { /* @@ -273,6 +280,7 @@ static void *call_rcu_thread(void *arg) uatomic_set(&crdp->futex, 0); } uatomic_or(&crdp->flags, URCU_CALL_RCU_STOPPED); + rcu_unregister_thread(); return NULL; }