} else {
__atomic_thread_fence(__ATOMIC_SEQ_CST);
}
- if (__atomic_load_n(&gp_state->futex, __ATOMIC_RELAXED) != -1)
- return;
- while (futex(&gp_state->futex, FUTEX_WAIT, -1, NULL, NULL, 0)) {
+ while (__atomic_load_n(&gp_state->futex, __ATOMIC_RELAXED) == -1) {
+ if (!futex(&gp_state->futex, FUTEX_WAIT, -1, NULL, NULL, 0)) {
+ /*
+ * May be awakened by either spurious wake up or
+ * because the state is now as expected.
+ */
+ continue;
+ }
switch (errno) {
case EWOULDBLOCK:
/* Value already changed. */
if (!rcu_gp->nr_cpus)
abort();
pthread_mutex_init(&rcu_gp->gp_lock, NULL);
- rcu_gp->percpu_state = calloc(rcu_gp->nr_cpus, sizeof(struct side_rcu_cpu_gp_state));
+ rcu_gp->percpu_state = (struct side_rcu_cpu_gp_state *)
+ calloc(rcu_gp->nr_cpus, sizeof(struct side_rcu_cpu_gp_state));
if (!rcu_gp->percpu_state)
abort();
if (!membarrier(MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED, 0, 0))