/* Data used by both reader and synchronize_rcu() */
unsigned long ctr;
/* Data used for registry */
- struct list_head head __attribute__((aligned(CACHE_LINE_SIZE)));
+ struct list_head node __attribute__((aligned(CACHE_LINE_SIZE)));
pthread_t tid;
};
}
}
-#if (BITS_PER_LONG < 64)
-static inline int rcu_gp_ongoing(unsigned long *value)
+static inline int rcu_gp_ongoing(unsigned long *ctr)
{
- unsigned long reader_gp;
+ unsigned long v;
- if (value == NULL)
- return 0;
- reader_gp = LOAD_SHARED(*value);
- return reader_gp && ((reader_gp ^ rcu_gp_ctr) & RCU_GP_CTR);
+ v = LOAD_SHARED(*ctr);
+ return v && (v != rcu_gp_ctr);
}
-#else /* !(BITS_PER_LONG < 64) */
-static inline int rcu_gp_ongoing(unsigned long *value)
-{
- unsigned long reader_gp;
-
- if (value == NULL)
- return 0;
- reader_gp = LOAD_SHARED(*value);
- return reader_gp && (reader_gp - rcu_gp_ctr > ULONG_MAX / 2);
-}
-#endif /* !(BITS_PER_LONG < 64) */
static inline void _rcu_read_lock(void)
{