]>
Commit | Line | Data |
---|---|---|
86951993 AM |
1 | /* Test __atomic routines for existence and execution with each valid |
2 | memory model. */ | |
3 | /* { dg-options "-w" } */ | |
4 | /* { dg-do run } */ | |
5 | /* { dg-additional-sources "atomic-lockfree-aux.c" } */ | |
6 | ||
7 | /* Test that __atomic_{is,always}_lock_free builtins execute. | |
8 | sync-mem-lockfree-aux.c supplies and external entry point for | |
9 | __atomic_is_lock_free which always returns a 2. We can detect the | |
10 | external routine was called if 2 is returned since that is not a valid | |
11 | result normally. */ | |
12 | ||
13 | #include <stdlib.h> | |
14 | ||
15 | extern void abort(); | |
16 | ||
17 | int r1, r2; | |
18 | ||
19 | /* Test for consistency on sizes 1, 2, 4, 8, 16 and 32. */ | |
722516b8 | 20 | int |
86951993 AM |
21 | main () |
22 | { | |
23 | ||
24 | r1 = __atomic_always_lock_free (sizeof(char), 0); | |
25 | r2 = __atomic_is_lock_free (sizeof(char), 0); | |
26 | /* If always lock free, then is_lock_free must also be true. */ | |
27 | if (r1) | |
28 | { | |
29 | if (r2 != 1) | |
30 | abort (); | |
31 | } | |
32 | else | |
33 | { | |
34 | /* If it is not lock free, then the external routine must be called. */ | |
35 | if (r2 != 2) | |
36 | abort (); | |
37 | } | |
38 | ||
39 | r1 = __atomic_always_lock_free (2, 0); | |
40 | r2 = __atomic_is_lock_free (2, 0); | |
41 | /* If always lock free, then is_lock_free must also be true. */ | |
42 | if (r1) | |
43 | { | |
44 | if (r2 != 1) | |
45 | abort (); | |
46 | } | |
47 | else | |
48 | { | |
49 | /* If it is not lock free, then the external routine must be called. */ | |
50 | if (r2 != 2) | |
51 | abort (); | |
52 | } | |
53 | ||
54 | ||
55 | r1 = __atomic_always_lock_free (4, 0); | |
56 | r2 = __atomic_is_lock_free (4, 0); /* Try passing in a variable. */ | |
57 | /* If always lock free, then is_lock_free must also be true. */ | |
58 | if (r1) | |
59 | { | |
60 | if (r2 != 1) | |
61 | abort (); | |
62 | } | |
63 | else | |
64 | { | |
65 | /* If it is not lock free, then the external routine must be called. */ | |
66 | if (r2 != 2) | |
67 | abort (); | |
68 | } | |
69 | ||
70 | ||
71 | r1 = __atomic_always_lock_free (8, 0); | |
72 | r2 = __atomic_is_lock_free (8, 0); | |
73 | /* If always lock free, then is_lock_free must also be true. */ | |
74 | if (r1) | |
75 | { | |
76 | if (r2 != 1) | |
77 | abort (); | |
78 | } | |
79 | else | |
80 | { | |
81 | /* If it is not lock free, then the external routine must be called. */ | |
82 | if (r2 != 2) | |
83 | abort (); | |
84 | } | |
85 | ||
86 | ||
87 | r1 = __atomic_always_lock_free (16, 0); | |
88 | r2 = __atomic_is_lock_free (16, 0); | |
89 | /* If always lock free, then is_lock_free must also be true. */ | |
90 | if (r1) | |
91 | { | |
92 | if (r2 != 1) | |
93 | abort (); | |
94 | } | |
95 | else | |
96 | { | |
97 | /* If it is not lock free, then the external routine must be called. */ | |
98 | if (r2 != 2) | |
99 | abort (); | |
100 | } | |
101 | ||
102 | ||
103 | r1 = __atomic_always_lock_free (32, 0); | |
104 | r2 = __atomic_is_lock_free (32, 0); | |
105 | /* If always lock free, then is_lock_free must also be true. */ | |
106 | if (r1) | |
107 | { | |
108 | if (r2 != 1) | |
109 | abort (); | |
110 | } | |
111 | else | |
112 | { | |
113 | /* If it is not lock free, then the external routine must be called. */ | |
114 | if (r2 != 2) | |
115 | abort (); | |
116 | } | |
117 | ||
118 | ||
119 | return 0; | |
120 | } | |
121 |