X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=seqlock%2Fseqlock.h;h=73e471f350618e6310e9eb8cea8e942a0802c0ea;hb=d634d19b6134309ed0893c6fd58d815cbafecd16;hp=c5a965cb8243bbb191ebe0620a72bdc50c0e4105;hpb=f8c46d903b303b81ef0d25cb8495de22d299466b;p=model-checker-benchmarks.git diff --git a/seqlock/seqlock.h b/seqlock/seqlock.h index c5a965c..73e471f 100644 --- a/seqlock/seqlock.h +++ b/seqlock/seqlock.h @@ -1,5 +1,6 @@ #include #include +#include "common.h" typedef struct seqlock { // Sequence for reader consistency check @@ -25,14 +26,16 @@ typedef struct seqlock { } void write(int new_data) { - int old_seq = _seq.load(memory_order_acquire); // acquire while (true) { + // #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 + // #2 if (_seq.compare_exchange_strong(old_seq, old_seq + 1, - memory_order_acq_rel, memory_order_acquire)) + memory_order_relaxed, memory_order_relaxed)) break; }