|
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 #include "prio.h" |
|
7 #include "prprf.h" |
|
8 #include "pratom.h" |
|
9 |
|
10 /* |
|
11 * TODO: create a macro to generate the six lines of code that are repeated |
|
12 * for every test. Also rewrite the statement |
|
13 * result = result | ((EXPRESSION) ? 0 : 1); |
|
14 * as |
|
15 * result |= !(EXPRESSION); |
|
16 */ |
|
17 |
|
18 int main(int argc, char **argv) |
|
19 { |
|
20 PRInt32 rv, oldval, test, result = 0; |
|
21 PRFileDesc *output = PR_GetSpecialFD(PR_StandardOutput); |
|
22 |
|
23 /***********************/ |
|
24 /* Test the functions. */ |
|
25 /***********************/ |
|
26 |
|
27 oldval = test = -2; |
|
28 rv = PR_AtomicIncrement(&test); |
|
29 result = result | ((rv == -1) ? 0 : 1); |
|
30 PR_fprintf( |
|
31 output, "PR_AtomicIncrement(%d) == %d: %s\n", |
|
32 oldval, rv, (rv == -1) ? "PASSED" : "FAILED"); |
|
33 oldval = test; |
|
34 rv = PR_AtomicIncrement(&test); |
|
35 result = result | ((rv == 0) ? 0 : 1); |
|
36 PR_fprintf( |
|
37 output, "PR_AtomicIncrement(%d) == %d: %s\n", |
|
38 oldval, rv, (rv == 0) ? "PASSED" : "FAILED"); |
|
39 oldval = test; |
|
40 rv = PR_AtomicIncrement(&test); |
|
41 result = result | ((rv == 1) ? 0 : 1); |
|
42 PR_fprintf( |
|
43 output, "PR_AtomicIncrement(%d) == %d: %s\n", |
|
44 oldval, rv, (rv == 1) ? "PASSED" : "FAILED"); |
|
45 |
|
46 oldval = test = -2; |
|
47 rv = PR_AtomicAdd(&test,1); |
|
48 result = result | ((rv == -1) ? 0 : 1); |
|
49 PR_fprintf( |
|
50 output, "PR_AtomicAdd(%d,%d) == %d: %s\n", |
|
51 oldval, 1, rv, (rv == -1) ? "PASSED" : "FAILED"); |
|
52 oldval = test; |
|
53 rv = PR_AtomicAdd(&test, 4); |
|
54 result = result | ((rv == 3) ? 0 : 1); |
|
55 PR_fprintf( |
|
56 output, "PR_AtomicAdd(%d,%d) == %d: %s\n", |
|
57 oldval, 4, rv, (rv == 3) ? "PASSED" : "FAILED"); |
|
58 oldval = test; |
|
59 rv = PR_AtomicAdd(&test, -6); |
|
60 result = result | ((rv == -3) ? 0 : 1); |
|
61 PR_fprintf( |
|
62 output, "PR_AtomicAdd(%d,%d) == %d: %s\n", |
|
63 oldval, -6, rv, (rv == -3) ? "PASSED" : "FAILED"); |
|
64 |
|
65 oldval = test = 2; |
|
66 rv = PR_AtomicDecrement(&test); |
|
67 result = result | ((rv == 1) ? 0 : 1); |
|
68 PR_fprintf( |
|
69 output, "PR_AtomicDecrement(%d) == %d: %s\n", |
|
70 oldval, rv, (rv == 1) ? "PASSED" : "FAILED"); |
|
71 oldval = test; |
|
72 rv = PR_AtomicDecrement(&test); |
|
73 result = result | ((rv == 0) ? 0 : 1); |
|
74 PR_fprintf( |
|
75 output, "PR_AtomicDecrement(%d) == %d: %s\n", |
|
76 oldval, rv, (rv == 0) ? "PASSED" : "FAILED"); |
|
77 oldval = test; |
|
78 rv = PR_AtomicDecrement(&test); |
|
79 result = result | ((rv == -1) ? 0 : 1); |
|
80 PR_fprintf( |
|
81 output, "PR_AtomicDecrement(%d) == %d: %s\n", |
|
82 oldval, rv, (rv == -1) ? "PASSED" : "FAILED"); |
|
83 |
|
84 /* set to a different value */ |
|
85 oldval = test = -2; |
|
86 rv = PR_AtomicSet(&test, 2); |
|
87 result = result | (((rv == -2) && (test == 2)) ? 0 : 1); |
|
88 PR_fprintf( |
|
89 output, "PR_AtomicSet(%d, %d) == %d: %s\n", |
|
90 oldval, 2, rv, ((rv == -2) && (test == 2)) ? "PASSED" : "FAILED"); |
|
91 |
|
92 /* set to the same value */ |
|
93 oldval = test = -2; |
|
94 rv = PR_AtomicSet(&test, -2); |
|
95 result = result | (((rv == -2) && (test == -2)) ? 0 : 1); |
|
96 PR_fprintf( |
|
97 output, "PR_AtomicSet(%d, %d) == %d: %s\n", |
|
98 oldval, -2, rv, ((rv == -2) && (test == -2)) ? "PASSED" : "FAILED"); |
|
99 |
|
100 /***********************/ |
|
101 /* Test the macros. */ |
|
102 /***********************/ |
|
103 |
|
104 oldval = test = -2; |
|
105 rv = PR_ATOMIC_INCREMENT(&test); |
|
106 result = result | ((rv == -1) ? 0 : 1); |
|
107 PR_fprintf( |
|
108 output, "PR_ATOMIC_INCREMENT(%d) == %d: %s\n", |
|
109 oldval, rv, (rv == -1) ? "PASSED" : "FAILED"); |
|
110 oldval = test; |
|
111 rv = PR_ATOMIC_INCREMENT(&test); |
|
112 result = result | ((rv == 0) ? 0 : 1); |
|
113 PR_fprintf( |
|
114 output, "PR_ATOMIC_INCREMENT(%d) == %d: %s\n", |
|
115 oldval, rv, (rv == 0) ? "PASSED" : "FAILED"); |
|
116 oldval = test; |
|
117 rv = PR_ATOMIC_INCREMENT(&test); |
|
118 result = result | ((rv == 1) ? 0 : 1); |
|
119 PR_fprintf( |
|
120 output, "PR_ATOMIC_INCREMENT(%d) == %d: %s\n", |
|
121 oldval, rv, (rv == 1) ? "PASSED" : "FAILED"); |
|
122 |
|
123 oldval = test = -2; |
|
124 rv = PR_ATOMIC_ADD(&test,1); |
|
125 result = result | ((rv == -1) ? 0 : 1); |
|
126 PR_fprintf( |
|
127 output, "PR_ATOMIC_ADD(%d,%d) == %d: %s\n", |
|
128 oldval, 1, rv, (rv == -1) ? "PASSED" : "FAILED"); |
|
129 oldval = test; |
|
130 rv = PR_ATOMIC_ADD(&test, 4); |
|
131 result = result | ((rv == 3) ? 0 : 1); |
|
132 PR_fprintf( |
|
133 output, "PR_ATOMIC_ADD(%d,%d) == %d: %s\n", |
|
134 oldval, 4, rv, (rv == 3) ? "PASSED" : "FAILED"); |
|
135 oldval = test; |
|
136 rv = PR_ATOMIC_ADD(&test, -6); |
|
137 result = result | ((rv == -3) ? 0 : 1); |
|
138 PR_fprintf( |
|
139 output, "PR_ATOMIC_ADD(%d,%d) == %d: %s\n", |
|
140 oldval, -6, rv, (rv == -3) ? "PASSED" : "FAILED"); |
|
141 |
|
142 oldval = test = 2; |
|
143 rv = PR_ATOMIC_DECREMENT(&test); |
|
144 result = result | ((rv == 1) ? 0 : 1); |
|
145 PR_fprintf( |
|
146 output, "PR_ATOMIC_DECREMENT(%d) == %d: %s\n", |
|
147 oldval, rv, (rv == 1) ? "PASSED" : "FAILED"); |
|
148 oldval = test; |
|
149 rv = PR_ATOMIC_DECREMENT(&test); |
|
150 result = result | ((rv == 0) ? 0 : 1); |
|
151 PR_fprintf( |
|
152 output, "PR_ATOMIC_DECREMENT(%d) == %d: %s\n", |
|
153 oldval, rv, (rv == 0) ? "PASSED" : "FAILED"); |
|
154 oldval = test; |
|
155 rv = PR_ATOMIC_DECREMENT(&test); |
|
156 result = result | ((rv == -1) ? 0 : 1); |
|
157 PR_fprintf( |
|
158 output, "PR_ATOMIC_DECREMENT(%d) == %d: %s\n", |
|
159 oldval, rv, (rv == -1) ? "PASSED" : "FAILED"); |
|
160 |
|
161 /* set to a different value */ |
|
162 oldval = test = -2; |
|
163 rv = PR_ATOMIC_SET(&test, 2); |
|
164 result = result | (((rv == -2) && (test == 2)) ? 0 : 1); |
|
165 PR_fprintf( |
|
166 output, "PR_ATOMIC_SET(%d, %d) == %d: %s\n", |
|
167 oldval, 2, rv, ((rv == -2) && (test == 2)) ? "PASSED" : "FAILED"); |
|
168 |
|
169 /* set to the same value */ |
|
170 oldval = test = -2; |
|
171 rv = PR_ATOMIC_SET(&test, -2); |
|
172 result = result | (((rv == -2) && (test == -2)) ? 0 : 1); |
|
173 PR_fprintf( |
|
174 output, "PR_ATOMIC_SET(%d, %d) == %d: %s\n", |
|
175 oldval, -2, rv, ((rv == -2) && (test == -2)) ? "PASSED" : "FAILED"); |
|
176 |
|
177 PR_fprintf( |
|
178 output, "Atomic operations test %s\n", |
|
179 (result == 0) ? "PASSED" : "FAILED"); |
|
180 return result; |
|
181 } /* main */ |
|
182 |
|
183 /* atomic.c */ |