X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu-call-rcu-impl.h;h=63edcef89c28455d519ed0ec5f1e16857eded07f;hp=82fec80fc2c857032a1d7831c568e47cc0e528c8;hb=1494da881dc07bbe749fd37b1d2448b14d729f3f;hpb=2870aa1ec4cc2472ec09f72e2d758bc8d4739181 diff --git a/urcu-call-rcu-impl.h b/urcu-call-rcu-impl.h index 82fec80..63edcef 100644 --- a/urcu-call-rcu-impl.h +++ b/urcu-call-rcu-impl.h @@ -26,11 +26,11 @@ #include #include #include +#include #include #include #include #include -#include #include #include @@ -39,14 +39,14 @@ #include "urcu-call-rcu.h" #include "urcu-pointer.h" #include "urcu/list.h" -#include "urcu/urcu-futex.h" +#include "urcu/futex.h" /* Data structure that identifies a call_rcu thread. */ struct call_rcu_data { struct cds_wfq_queue cbs; unsigned long flags; - int futex; + int32_t futex; unsigned long qlen; /* maintained for debugging. */ pthread_t tid; int cpu_affinity; @@ -211,12 +211,12 @@ static void *call_rcu_thread(void *arg) } thread_call_rcu_data = crdp; + if (!rt) { + uatomic_dec(&crdp->futex); + /* Decrement futex before reading call_rcu list */ + cmm_smp_mb(); + } for (;;) { - if (!rt) { - uatomic_dec(&crdp->futex); - /* Decrement futex before reading call_rcu list */ - cmm_smp_mb(); - } if (&crdp->cbs.head != _CMM_LOAD_SHARED(crdp->cbs.tail)) { while ((cbs = _CMM_LOAD_SHARED(crdp->cbs.head)) == NULL) poll(NULL, 0, 1); @@ -240,21 +240,32 @@ static void *call_rcu_thread(void *arg) } while (cbs != NULL); uatomic_sub(&crdp->qlen, cbcount); } - if (uatomic_read(&crdp->flags) & URCU_CALL_RCU_STOP) { - if (!rt) { + if (uatomic_read(&crdp->flags) & URCU_CALL_RCU_STOP) + break; + if (!rt) { + if (&crdp->cbs.head + == _CMM_LOAD_SHARED(crdp->cbs.tail)) { + call_rcu_wait(crdp); + poll(NULL, 0, 10); + uatomic_dec(&crdp->futex); /* - * Read call_rcu list before write futex. + * Decrement futex before reading + * call_rcu list. */ cmm_smp_mb(); - uatomic_set(&crdp->futex, 0); + } else { + poll(NULL, 0, 10); } - break; - } - if (!rt) { - if (&crdp->cbs.head == _CMM_LOAD_SHARED(crdp->cbs.tail)) - call_rcu_wait(crdp); + } else { + poll(NULL, 0, 10); } - poll(NULL, 0, 10); + } + if (!rt) { + /* + * Read call_rcu list before write futex. + */ + cmm_smp_mb(); + uatomic_set(&crdp->futex, 0); } uatomic_or(&crdp->flags, URCU_CALL_RCU_STOPPED); return NULL;