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
main(int argc,char ** argv)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 */
184