1 module ut.core.atomic;
2 import numem.core.hooks;
3 
4 @("load: i32")
5 unittest {
6     if (!nu_atomic_supported)
7         return;
8 
9     uint value = 42;
10     assert(nu_atomic_load_32(value) == 42);
11 }
12 
13 @("store: i32")
14 unittest {
15     if (!nu_atomic_supported)
16         return;
17 
18     uint value = 128;
19     nu_atomic_store_32(value, 42);
20     assert(nu_atomic_load_32(value) == 42);
21 }
22 
23 @("add: i32")
24 unittest {
25     if (!nu_atomic_supported)
26         return;
27 
28     uint value = 41;
29     assert(nu_atomic_add_32(value, 1) == 41);
30     assert(nu_atomic_load_32(value) == 42);
31 }
32 
33 @("sub: i32")
34 unittest {
35     if (!nu_atomic_supported)
36         return;
37 
38     uint value = 42;
39     assert(nu_atomic_sub_32(value, 1) == 42);
40     assert(nu_atomic_load_32(value) == 41);
41 }
42 
43 @("load: ptr")
44 unittest {
45     if (!nu_atomic_supported)
46         return;
47 
48     size_t value = 42;
49     assert(cast(size_t)nu_atomic_load_ptr(cast(void**)&value) == 42);
50 }
51 
52 @("store: ptr")
53 unittest {
54     if (!nu_atomic_supported)
55         return;
56 
57     size_t value = 128;
58     nu_atomic_store_ptr(cast(void**)&value, cast(void*)42);
59     assert(cast(size_t)nu_atomic_load_ptr(cast(void**)&value) == 42);
60 }
61 
62 @("cmpxhg: ptr")
63 unittest {
64     if (!nu_atomic_supported)
65         return;
66 
67     size_t value = 128;
68 
69     nu_atomic_cmpxhg_ptr(cast(void**)&value, cast(void*)128, cast(void*)42);
70     assert(cast(size_t)nu_atomic_load_ptr(cast(void**)&value) == 42);
71 }
72 
73 shared static this() {
74     import std.stdio : writeln;
75     if (!nu_atomic_supported) {
76         writeln("Atomics are disabled, skipping tests...");
77     }
78 }