make urcu_free_no_rmb | tee urcu_free_no_rmb.log
make urcu_free_no_wmb | tee urcu_free_no_wmb.log
make urcu_free_no_mb | tee urcu_free_no_mb.log
+ make urcu_free_single_flip | tee urcu_free_single_flip.log
make asserts | tee asserts.log
make summary
urcu_free_no_mb_define:
cp urcu_free_no_mb.define .input.define
+urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run
+ cp .input.spin $@.spin.input
+ -cp .input.spin.trail $@.spin.input.trail
+
+urcu_free_single_flip_define:
+ cp urcu_free_single_flip.define .input.define
+
urcu_free_ltl:
touch .input.define
cat DEFINES > pan.ltl
/* Promela validation variables. */
#define NR_READERS 1
-#define NR_WRITERS 1
+#define NR_WRITERS 2
-#define NR_PROCS 2
+#define NR_PROCS 3
#define get_pid() (_pid)
byte read_generation = 1;
bit data_access = 0;
+bit write_lock = 0;
+
inline ooo_mem(i)
{
atomic {
}
ooo_mem(i);
+ do
+ :: write_lock == 0 ->
+ write_lock = 1;
+ break;
+ :: else ->
+ skip;
+ od;
smp_mb(i);
ooo_mem(i);
tmp = READ_CACHED_VAR(urcu_gp_ctr);
//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);
//smp_mc(i);
ooo_mem(i);
wait_for_quiescent_state(tmp, i, j);
+#endif
ooo_mem(i);
smp_mb(i);
/* free-up step, e.g., kfree(). */
atomic {
last_free_gen = old_gen;
free_done = 1;
+ write_lock = 0;
}
}