Skip to content

Commit 066e059

Browse files
vector-of-boolrcsanchez97
authored andcommitted
Check that 'weak' will succeeded, even if it takes many tries
Follow-up for: a0cd4f8
1 parent 20b294d commit 066e059

File tree

1 file changed

+36
-31
lines changed

1 file changed

+36
-31
lines changed

src/libbson/tests/test-atomic.c

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -22,37 +22,42 @@
2222
#define ATOMIC(Kind, Operation) BSON_CONCAT4 (bson_atomic_, Kind, _, Operation)
2323

2424

25-
#define TEST_KIND_WITH_MEMORDER(Kind, TypeName, MemOrder, Assert) \
26-
do { \
27-
TypeName got; \
28-
TypeName value = 0; \
29-
got = ATOMIC (Kind, fetch) (&value, MemOrder); \
30-
Assert (got, ==, 0); \
31-
got = ATOMIC (Kind, fetch_add) (&value, 42, MemOrder); \
32-
Assert (got, ==, 0); \
33-
Assert (value, ==, 42); \
34-
got = ATOMIC (Kind, fetch_sub) (&value, 7, MemOrder); \
35-
Assert (got, ==, 42); \
36-
Assert (value, ==, 35); \
37-
got = ATOMIC (Kind, exchange) (&value, 77, MemOrder); \
38-
Assert (got, ==, 35); \
39-
Assert (value, ==, 77); \
40-
/* Compare-exchange fail: */ \
41-
got = ATOMIC (Kind, compare_exchange_strong) (&value, 4, 9, MemOrder); \
42-
Assert (got, ==, 77); \
43-
Assert (value, ==, 77); \
44-
/* Compare-exchange succeed: */ \
45-
got = ATOMIC (Kind, compare_exchange_strong) (&value, 77, 9, MemOrder); \
46-
Assert (got, ==, 77); \
47-
Assert (value, ==, 9); \
48-
/* Compare-exchange fail: */ \
49-
got = ATOMIC (Kind, compare_exchange_weak) (&value, 8, 12, MemOrder); \
50-
Assert (got, ==, 9); \
51-
Assert (value, ==, 9); \
52-
/* Compare-exchange succeed: */ \
53-
got = ATOMIC (Kind, compare_exchange_weak) (&value, 9, 53, MemOrder); \
54-
Assert (got, ==, 9); \
55-
Assert (value, ==, 53); \
25+
#define TEST_KIND_WITH_MEMORDER(Kind, TypeName, MemOrder, Assert) \
26+
do { \
27+
int i; \
28+
TypeName got; \
29+
TypeName value = 0; \
30+
got = ATOMIC (Kind, fetch) (&value, MemOrder); \
31+
Assert (got, ==, 0); \
32+
got = ATOMIC (Kind, fetch_add) (&value, 42, MemOrder); \
33+
Assert (got, ==, 0); \
34+
Assert (value, ==, 42); \
35+
got = ATOMIC (Kind, fetch_sub) (&value, 7, MemOrder); \
36+
Assert (got, ==, 42); \
37+
Assert (value, ==, 35); \
38+
got = ATOMIC (Kind, exchange) (&value, 77, MemOrder); \
39+
Assert (got, ==, 35); \
40+
Assert (value, ==, 77); \
41+
/* Compare-exchange fail: */ \
42+
got = ATOMIC (Kind, compare_exchange_strong) (&value, 4, 9, MemOrder); \
43+
Assert (got, ==, 77); \
44+
Assert (value, ==, 77); \
45+
/* Compare-exchange succeed: */ \
46+
got = ATOMIC (Kind, compare_exchange_strong) (&value, 77, 9, MemOrder); \
47+
Assert (got, ==, 77); \
48+
Assert (value, ==, 9); \
49+
/* Compare-exchange fail: */ \
50+
got = ATOMIC (Kind, compare_exchange_weak) (&value, 8, 12, MemOrder); \
51+
Assert (got, ==, 9); \
52+
Assert (value, ==, 9); \
53+
/* Compare-exchange-weak succeed: */ \
54+
/* 'weak' may fail spuriously, so it must *eventually* succeed */ \
55+
for (i = 0; i < 10000 && value != 53; ++i) { \
56+
got = ATOMIC (Kind, compare_exchange_weak) (&value, 9, 53, MemOrder); \
57+
Assert (got, ==, 9); \
58+
} \
59+
/* Check that it evenutally succeeded */ \
60+
Assert (value, ==, 53); \
5661
} while (0)
5762

5863
#define TEST_INTEGER_KIND(Kind, TypeName, Assert) \

0 commit comments

Comments
 (0)