+ ooo_mem(i);
+
+ do
+ :: 1 ->
+ atomic {
+ if
+ :: write_lock == 0 ->
+ write_lock = 1;
+ break;
+ :: else ->
+ skip;
+ fi;
+ }
+ od;
+ smp_mb(i);
+ ooo_mem(i);
+ tmp = READ_CACHED_VAR(urcu_gp_ctr);
+ ooo_mem(i);
+ WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT);
+ ooo_mem(i);
+ //smp_mc(i);
+ wait_for_quiescent_state(tmp, i, j);
+ //smp_mc(i);
+ #ifndef SINGLE_FLIP
+ ooo_mem(i);
+ tmp = READ_CACHED_VAR(urcu_gp_ctr);
+ ooo_mem(i);
+ WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT);
+ //smp_mc(i);
+ ooo_mem(i);
+ wait_for_quiescent_state(tmp, i, j);
+ #endif
+ ooo_mem(i);
+ smp_mb(i);
+ ooo_mem(i);
+ write_lock = 0;
+ /* free-up step, e.g., kfree(). */
+ atomic {
+ last_free_gen = old_gen;
+ free_done = 1;
+ }
+ :: else -> break;