/*
* Global grace period counter.
*/
-long urcu_gp_ctr = 0;
+unsigned long urcu_gp_ctr = RCU_GP_ONLINE;
/*
* Written to only by each individual reader. Read by both the reader and the
* writers.
*/
-long __thread rcu_reader_qs_gp;
+unsigned long __thread rcu_reader_qs_gp;
/* Thread IDs of registered readers */
#define INIT_NUM_THREADS 4
struct reader_registry {
pthread_t tid;
- long *rcu_reader_qs_gp;
+ unsigned long *rcu_reader_qs_gp;
};
#ifdef DEBUG_YIELD
void synchronize_rcu(void)
{
- int was_online;
+ unsigned long was_online;
- was_online = rcu_reader_qs_gp & 1;
+ was_online = rcu_reader_qs_gp;
/*
* Mark the writer thread offline to make sure we don't wait for
* our own quiescent state. This allows using synchronize_rcu() in
* threads registered as readers.
*/
+ smp_mb();
if (was_online)
- _rcu_thread_offline();
+ STORE_SHARED(rcu_reader_qs_gp, 0);
- smp_mb();
internal_urcu_lock();
- STORE_SHARED(urcu_gp_ctr, urcu_gp_ctr + 2);
+ STORE_SHARED(urcu_gp_ctr, urcu_gp_ctr + RCU_GP_CTR);
wait_for_quiescent_state();
internal_urcu_unlock();
- smp_mb();
if (was_online)
- _rcu_thread_online();
+ _STORE_SHARED(rcu_reader_qs_gp, LOAD_SHARED(urcu_gp_ctr));
+ smp_mb();
}
/*