X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=formal-model%2Furcu%2Furcu.spin;h=5ac2f02dd9d80c3abd8d08f2b20136dd9a604635;hb=710b09b7ba5203ea868240c1746d0ac0fc65f884;hp=cc84e51d09d623b330664a0e8a7ca2fbb8ff97ef;hpb=60a1db9d10aaca98e79a5126f168a37d00151845;p=urcu.git diff --git a/formal-model/urcu/urcu.spin b/formal-model/urcu/urcu.spin index cc84e51..5ac2f02 100644 --- a/formal-model/urcu/urcu.spin +++ b/formal-model/urcu/urcu.spin @@ -21,9 +21,9 @@ /* 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) @@ -123,6 +123,8 @@ bit free_done = 0; byte read_generation = 1; bit data_access = 0; +bit write_lock = 0; + inline ooo_mem(i) { atomic { @@ -222,6 +224,18 @@ active [NR_WRITERS] proctype urcu_writer() } 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); @@ -231,6 +245,7 @@ active [NR_WRITERS] proctype urcu_writer() //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); @@ -238,10 +253,12 @@ active [NR_WRITERS] proctype urcu_writer() //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(). */ ooo_mem(i); + write_lock = 0; + /* free-up step, e.g., kfree(). */ atomic { last_free_gen = old_gen; free_done = 1;