changes
[model-checker-benchmarks.git] / seqlock / seqlock.h
index f263bec082614274e56a4d584b73505b25fc4112..73e471f350618e6310e9eb8cea8e942a0802c0ea 100644 (file)
@@ -1,5 +1,6 @@
 #include <stdatomic.h>
 #include <threads.h>
+#include "common.h"
 
 typedef struct seqlock {
        // Sequence for reader consistency check
@@ -17,7 +18,7 @@ typedef struct seqlock {
                        int old_seq = _seq.load(memory_order_acquire); // acquire
                        if (old_seq % 2 == 1) continue;
 
-                       int res = _data.load(memory_order_acquire); // acquire
+                       int res = _data.load(memory_order_acquire); 
                        if (_seq.load(memory_order_relaxed) == old_seq) { // relaxed
                                return res;
                        }
@@ -26,19 +27,20 @@ typedef struct seqlock {
        
        void write(int new_data) {
                while (true) {
-                       // This might be a relaxed too
+                       // #1: either here or #2 must be acquire
                        int old_seq = _seq.load(memory_order_acquire); // acquire
+                       // This might be a relaxed too
                        if (old_seq % 2 == 1)
                                continue; // Retry
 
-                       // Should be relaxed!!! 
+                       // #2
                        if (_seq.compare_exchange_strong(old_seq, old_seq + 1,
-                               memory_order_relaxed, memory_order_relaxed)) // relaxed 
+                               memory_order_relaxed, memory_order_relaxed)) 
                                break;
                }
 
                // Update the data
-               _data.store(new_data, memory_order_release); // release
+               _data.store(new_data, memory_order_release); // Can be relaxed
 
                _seq.fetch_add(1, memory_order_release); // release
        }