dual writer fix
[urcu.git] / formal-model / urcu / urcu.spin
index cc84e51d09d623b330664a0e8a7ca2fbb8ff97ef..5ac2f02dd9d80c3abd8d08f2b20136dd9a604635 100644 (file)
@@ -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;
This page took 0.023303 seconds and 4 git commands to generate.