{
if (caa_likely(rcu_has_sys_membarrier))
(void) membarrier(MEMBARRIER_CMD_SHARED, 0);
{
if (caa_likely(rcu_has_sys_membarrier))
(void) membarrier(MEMBARRIER_CMD_SHARED, 0);
if (uatomic_read(&rcu_gp.futex) != -1)
return;
while (futex_async(&rcu_gp.futex, FUTEX_WAIT, -1,
if (uatomic_read(&rcu_gp.futex) != -1)
return;
while (futex_async(&rcu_gp.futex, FUTEX_WAIT, -1,
if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
uatomic_dec(&rcu_gp.futex);
/* Write futex before read reader_gp */
if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
uatomic_dec(&rcu_gp.futex);
/* Write futex before read reader_gp */
}
cds_list_for_each_entry_safe(index, tmp, input_readers, node) {
}
cds_list_for_each_entry_safe(index, tmp, input_readers, node) {
if (cds_list_empty(input_readers)) {
if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
/* Read reader_gp before write futex */
if (cds_list_empty(input_readers)) {
if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
/* Read reader_gp before write futex */
if (cds_list_empty(input_readers)) {
if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
/* Read reader_gp before write futex */
if (cds_list_empty(input_readers)) {
if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
/* Read reader_gp before write futex */
uatomic_set(&rcu_gp.futex, 0);
}
break;
} else {
if (wait_gp_loops == KICK_READER_LOOPS) {
uatomic_set(&rcu_gp.futex, 0);
}
break;
} else {
if (wait_gp_loops == KICK_READER_LOOPS) {
rcu_init(); /* In case gcc does not support constructor attribute */
cds_list_add(&URCU_TLS(rcu_reader).node, ®istry);
mutex_unlock(&rcu_registry_lock);
rcu_init(); /* In case gcc does not support constructor attribute */
cds_list_add(&URCU_TLS(rcu_reader).node, ®istry);
mutex_unlock(&rcu_registry_lock);