*/
extern DECLARE_URCU_TLS(struct rcu_reader *, rcu_reader);
+extern int urcu_bp_has_sys_membarrier;
+
+static inline void urcu_bp_smp_mb_slave(void)
+{
+ if (caa_likely(urcu_bp_has_sys_membarrier))
+ cmm_barrier();
+ else
+ cmm_smp_mb();
+}
+
static inline enum rcu_state rcu_reader_state(unsigned long *ctr)
{
unsigned long v;
{
if (caa_likely(!(tmp & RCU_GP_CTR_NEST_MASK))) {
_CMM_STORE_SHARED(URCU_TLS(rcu_reader)->ctr, _CMM_LOAD_SHARED(rcu_gp.ctr));
- cmm_smp_mb();
+ urcu_bp_smp_mb_slave();
} else
_CMM_STORE_SHARED(URCU_TLS(rcu_reader)->ctr, tmp + RCU_GP_COUNT);
}
rcu_bp_register(); /* If not yet registered. */
cmm_barrier(); /* Ensure the compiler does not reorder us with mutex */
tmp = URCU_TLS(rcu_reader)->ctr;
+ urcu_assert((tmp & RCU_GP_CTR_NEST_MASK) != RCU_GP_CTR_NEST_MASK);
_rcu_read_lock_update(tmp);
}
tmp = URCU_TLS(rcu_reader)->ctr;
urcu_assert(tmp & RCU_GP_CTR_NEST_MASK);
/* Finish using rcu before decrementing the pointer. */
- cmm_smp_mb();
+ urcu_bp_smp_mb_slave();
_CMM_STORE_SHARED(URCU_TLS(rcu_reader)->ctr, tmp - RCU_GP_COUNT);
cmm_barrier(); /* Ensure the compiler does not reorder us with mutex */
}
return URCU_TLS(rcu_reader)->ctr & RCU_GP_CTR_NEST_MASK;
}
-#ifdef __cplusplus
+#ifdef __cplusplus
}
#endif