101a28ca7SPavel Labath #include <atomic> 2*85d6edb2SJonas Devlieghere 3*85d6edb2SJonas Devlieghere // Note that although hogging the CPU while waiting for a variable to change 4*85d6edb2SJonas Devlieghere // would be terrible in production code, it's great for testing since it avoids 5*85d6edb2SJonas Devlieghere // a lot of messy context switching to get multiple threads synchronized. 601a28ca7SPavel Labath 701a28ca7SPavel Labath typedef std::atomic<int> pseudo_barrier_t; 801a28ca7SPavel Labath 9*85d6edb2SJonas Devlieghere #define pseudo_barrier_wait(barrier) \ 10*85d6edb2SJonas Devlieghere do \ 11*85d6edb2SJonas Devlieghere { \ 12*85d6edb2SJonas Devlieghere --(barrier); \ 13*85d6edb2SJonas Devlieghere while ((barrier).load() > 0) \ 14*85d6edb2SJonas Devlieghere ; \ 15*85d6edb2SJonas Devlieghere } while (0) 16e44f2eb3SJonas Devlieghere 17*85d6edb2SJonas Devlieghere #define pseudo_barrier_init(barrier, count) \ 18*85d6edb2SJonas Devlieghere do \ 19*85d6edb2SJonas Devlieghere { \ 20*85d6edb2SJonas Devlieghere (barrier) = (count); \ 21*85d6edb2SJonas Devlieghere } while (0) 22