#define YIELD_WRITE (1 << 1)
/*
- * Updates without CONFIG_URCU_AVOID_SIGNALS are much slower. Account this in
+ * Updates without URCU_MB are much slower. Account this in
* the delay.
*/
-#ifdef CONFIG_URCU_AVOID_SIGNALS
+#ifdef URCU_MB
/* maximum sleep delay, in us */
#define MAX_SLEEP 50
#else
}
#endif
-#ifdef CONFIG_URCU_AVOID_SIGNALS
+#ifdef URCU_MB
static inline void reader_barrier()
{
smp_mb();
STORE_SHARED(p, v); \
})
+/**
+ * _rcu_cmpxchg_pointer - same as rcu_assign_pointer, but tests if the pointer
+ * is as expected by "old". If succeeds, returns the previous pointer to the
+ * data structure, which can be safely freed after waiting for a quiescent state
+ * using synchronize_rcu(). If fails (unexpected value), returns old (which
+ * should not be freed !).
+ */
+
+#define _rcu_cmpxchg_pointer(p, old, _new) \
+ ({ \
+ if (!__builtin_constant_p(_new) || \
+ ((_new) != NULL)) \
+ wmb(); \
+ cmpxchg(p, old, _new); \
+ })
+
/**
* _rcu_xchg_pointer - same as rcu_assign_pointer, but returns the previous
* pointer to the data structure, which can be safely freed after waiting for a