- /*
- * The data dependency "read urcu_gp_ctr, write urcu_active_readers",
- * serializes those two memory operations. The memory barrier in the
- * signal handler ensures we receive the proper memory commit barriers
- * required by _STORE_SHARED and _LOAD_SHARED whenever communication
- * with the writer is needed.
- */
- if (likely(!(tmp & RCU_GP_CTR_NEST_MASK)))
- _STORE_SHARED(urcu_active_readers, _LOAD_SHARED(urcu_gp_ctr));
- else
- _STORE_SHARED(urcu_active_readers, tmp + RCU_GP_COUNT);
- /*
- * Increment active readers count before accessing the pointer.
- * See force_mb_all_threads().
- */
- reader_barrier();
+ if (likely(!(tmp & RCU_GP_CTR_NEST_MASK))) {
+ _STORE_SHARED(urcu_reader.ctr, _LOAD_SHARED(urcu_gp_ctr));
+ /*
+ * Set active readers count for outermost nesting level before
+ * accessing the pointer. See force_mb_all_threads().
+ */
+ reader_barrier();
+ } else {
+ _STORE_SHARED(urcu_reader.ctr, tmp + RCU_GP_COUNT);
+ }