2 * Dekker's critical section algorithm, implemented with fences.
3 * Translated to C by Patrick Lam <prof.lam@gmail.com>
6 * http://www.justsoftwaresolutions.co.uk/threading/
11 #include "libinterface.h"
13 /* atomic */ int flag0, flag1;
14 /* atomic */ int turn;
20 /* uint32_t */ int var = 0;
24 MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
25 store_32(&flag0, true);
26 // std::atomic_thread_fence(std::memory_order_seq_cst);
28 MCID _mt; MCID _fn0; int f1, t;
32 _fn0=MC2_nextOpLoad(MCID_NODEP), f1 = load_32(&flag1);
33 _fn0 = MC2_function(1, sizeof (f1), f1, _fn0);
36 _br0 = MC2_branchUsesID(_fn0, 1, 2, true);
39 _br0 = MC2_branchUsesID(_fn0, 0, 2, true);
44 if ((_mt=MC2_nextOpLoad(MCID_NODEP), t = load_32(&turn)) != 0)
46 MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
47 store_32(&flag0, false);
49 while ((_mt=MC2_nextOpLoad(MCID_NODEP), t = load_32(&turn)) != 0)
56 MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
57 store_32(&flag0, true);
58 // std::atomic_thread_fence(std::memory_order_seq_cst);
66 // std::atomic_thread_fence(std::memory_order_acquire);
69 MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
72 MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
74 // std::atomic_thread_fence(std::memory_order_release);
75 MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
76 store_32(&flag0, false);
81 MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
82 store_32(&flag1, true);
83 // std::atomic_thread_fence(std::memory_order_seq_cst);
89 MCID _mf0; _mf0=MC2_nextOpLoad(MCID_NODEP); int f0 = load_32(&flag0);
92 _br1 = MC2_branchUsesID(_mf0, 1, 2, true);
96 _br1 = MC2_branchUsesID(_mf0, 0, 2, true);
99 if ((_mt=MC2_nextOpLoad(MCID_NODEP), t = load_32(&turn)) != 1)
101 MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
102 store_32(&flag1, false);
104 while ((_mt=MC2_nextOpLoad(MCID_NODEP), t = load_32(&turn)) != 1)
110 MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
111 store_32(&flag1, true);
112 // std::atomic_thread_fence(std::memory_order_seq_cst);
120 // std::atomic_thread_fence(std::memory_order_acquire);
123 MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
126 MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
128 // std::atomic_thread_fence(std::memory_order_release);
129 MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
130 store_32(&flag1, false);
133 int user_main(int argc, char **argv)
141 thrd_create(&a, p0, NULL);
142 thrd_create(&b, p1, NULL);