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