comparison test/testatomic.c @ 3202:3aa519a5c676

I've made so many changes I don't dare continue until I check the current stuff in. /test/testatomic.c performs absolutely basic tests to show that the function work as expected. Need a second test to do more detailed tests. /include/SDL_atomic.h provides declarations for all included functions. /src/atomic/linux/SDL_atomic.c provided all the functions. On a generic built the 64 bit functions work, but they are emulated. On a build for -march=pentium and above the 64 bit functions use native instructions /src/atomic/dummy/SDL_atomic.c emulates all the operations using SDL_mutex.h. /src/atomic/win32/SDL_atomic.c is a copy of dummy /src/atomic/macosx/SDL_atomic.s is a copy of dummy These versions of SDL_atomic.c provide a frame work for building the library with a mixture of native and emulated functions. This allows the whole library to be provided on all platforms. (I hope.) I hope this fits with the SDL philosophy of either providing a common subset or emulating when the platform is missing a feature. I have not added dummy, macosx, or win32 to the build. They are there as place holders for future work. I have modified congifure.in to compile sources in /src/atomic/linux. (The SDL configure.in file is an amazing piece of work and I hope I didn't mess it up. :-)
author Bob Pendleton <bob@pendleton.com>
date Mon, 29 Jun 2009 19:54:43 +0000
parents c297230efc75
children 48a80f2a7ff2
comparison
equal deleted inserted replaced
3201:c297230efc75 3202:3aa519a5c676
1 #include "SDL.h" 1 #include "SDL.h"
2 2
3 /* 3 /*
4 Absolutely basic test just to see if we get the expected value after 4 Absolutely basic tests just to see if we get the expected value
5 calling each function. 5 after calling each function.
6 */ 6 */
7 7
8 char *
9 tf(SDL_bool tf)
10 {
11 static char *t = "true";
12 static char *f = "false";
13
14 if (tf)
15 {
16 return t;
17 }
18
19 return f;
20 }
21
8 int 22 int
9 main(int argc, char **argv) 23 main(int argc, char **argv)
10 { 24 {
11 25
26 Uint8 val8 = 0;
27 Uint8 ret8 = 0;
28
29 Uint16 val16 = 0;
30 Uint16 ret16 = 0;
31
12 Uint32 val32 = 0; 32 Uint32 val32 = 0;
13 Uint32 ret32 = 0; 33 Uint32 ret32 = 0;
14 34
15 Uint64 val64 = 0; 35 Uint64 val64 = 0;
16 Uint64 ret64 = 0; 36 Uint64 ret64 = 0;
17 37
18 SDL_bool tfval = SDL_FALSE; 38 SDL_bool tfret = SDL_FALSE;
39
40
41 printf("8 bit -----------------------------------------\n\n");
42
43 ret8 = SDL_AtomicExchange8(&val8, 10);
44 printf("Exchange8 ret=%d val=%d\n", ret8, val8);
45 ret8 = SDL_AtomicExchange8(&val8, 0);
46 printf("Exchange8 ret=%d val=%d\n", ret8, val8);
47
48 val8 = 10;
49 tfret = SDL_AtomicCompareThenSet8(&val8, 10, 20);
50 printf("CompareThenSet8 tfret=%s val=%d\n", tf(tfret), val8);
51 val8 = 10;
52 tfret = SDL_AtomicCompareThenSet8(&val8, 0, 20);
53 printf("CompareThenSet8 tfret=%s val=%d\n", tf(tfret), val8);
54
55 val8 = 0;
56 tfret = SDL_AtomicTestThenSet8(&val8);
57 printf("TestThenSet8 tfret=%s val=%d\n", tf(tfret), val8);
58 tfret = SDL_AtomicTestThenSet8(&val8);
59 printf("TestThenSet8 tfret=%s val=%d\n", tf(tfret), val8);
60
61 SDL_AtomicClear8(&val8);
62 printf("Clear8 val=%d\n", val8);
63
64 ret8 = SDL_AtomicFetchThenIncrement8(&val8);
65 printf("FetchThenIncrement8 ret=%d val=%d\n", ret8, val8);
66
67 ret8 = SDL_AtomicFetchThenDecrement8(&val8);
68 printf("FetchThenDecrement8 ret=%d val=%d\n", ret8, val8);
69
70 ret8 = SDL_AtomicFetchThenAdd8(&val8, 10);
71 printf("FetchThenAdd8 ret=%d val=%d\n", ret8, val8);
72
73 ret8 = SDL_AtomicFetchThenSubtract8(&val8, 10);
74 printf("FetchThenSubtract8 ret=%d val=%d\n", ret8, val8);
75
76 ret8 = SDL_AtomicIncrementThenFetch8(&val8);
77 printf("IncrementThenFetch8 ret=%d val=%d\n", ret8, val8);
78
79 ret8 = SDL_AtomicDecrementThenFetch8(&val8);
80 printf("DecrementThenFetch8 ret=%d val=%d\n", ret8, val8);
81
82 ret8 = SDL_AtomicAddThenFetch8(&val8, 10);
83 printf("AddThenFetch8 ret=%d val=%d\n", ret8, val8);
84
85 ret8 = SDL_AtomicSubtractThenFetch8(&val8, 10);
86 printf("SubtractThenFetch8 ret=%d val=%d\n", ret8, val8);
87
88
89 printf("16 bit -----------------------------------------\n\n");
90
91 ret16 = SDL_AtomicExchange16(&val16, 10);
92 printf("Exchange16 ret=%d val=%d\n", ret16, val16);
93 ret16 = SDL_AtomicExchange16(&val16, 0);
94 printf("Exchange16 ret=%d val=%d\n", ret16, val16);
95
96 val16 = 10;
97 tfret = SDL_AtomicCompareThenSet16(&val16, 10, 20);
98 printf("CompareThenSet16 tfret=%s val=%d\n", tf(tfret), val16);
99 val16 = 10;
100 tfret = SDL_AtomicCompareThenSet16(&val16, 0, 20);
101 printf("CompareThenSet16 tfret=%s val=%d\n", tf(tfret), val16);
102
103 val16 = 0;
104 tfret = SDL_AtomicTestThenSet16(&val16);
105 printf("TestThenSet16 tfret=%s val=%d\n", tf(tfret), val16);
106 tfret = SDL_AtomicTestThenSet16(&val16);
107 printf("TestThenSet16 tfret=%s val=%d\n", tf(tfret), val16);
108
109 SDL_AtomicClear16(&val16);
110 printf("Clear16 val=%d\n", val16);
111
112 ret16 = SDL_AtomicFetchThenIncrement16(&val16);
113 printf("FetchThenIncrement16 ret=%d val=%d\n", ret16, val16);
114
115 ret16 = SDL_AtomicFetchThenDecrement16(&val16);
116 printf("FetchThenDecrement16 ret=%d val=%d\n", ret16, val16);
117
118 ret16 = SDL_AtomicFetchThenAdd16(&val16, 10);
119 printf("FetchThenAdd16 ret=%d val=%d\n", ret16, val16);
120
121 ret16 = SDL_AtomicFetchThenSubtract16(&val16, 10);
122 printf("FetchThenSubtract16 ret=%d val=%d\n", ret16, val16);
123
124 ret16 = SDL_AtomicIncrementThenFetch16(&val16);
125 printf("IncrementThenFetch16 ret=%d val=%d\n", ret16, val16);
126
127 ret16 = SDL_AtomicDecrementThenFetch16(&val16);
128 printf("DecrementThenFetch16 ret=%d val=%d\n", ret16, val16);
129
130 ret16 = SDL_AtomicAddThenFetch16(&val16, 10);
131 printf("AddThenFetch16 ret=%d val=%d\n", ret16, val16);
132
133 ret16 = SDL_AtomicSubtractThenFetch16(&val16, 10);
134 printf("SubtractThenFetch16 ret=%d val=%d\n", ret16, val16);
135
136 printf("32 bit -----------------------------------------\n\n");
19 137
20 ret32 = SDL_AtomicExchange32(&val32, 10); 138 ret32 = SDL_AtomicExchange32(&val32, 10);
21 tfval = SDL_AtomicCompareThenSet32(&val32, 10, 20); 139 printf("Exchange32 ret=%d val=%d\n", ret32, val32);
22 tfval = SDL_AtomicTestThenSet32(&val32); 140 ret32 = SDL_AtomicExchange32(&val32, 0);
141 printf("Exchange32 ret=%d val=%d\n", ret32, val32);
142
143 val32 = 10;
144 tfret = SDL_AtomicCompareThenSet32(&val32, 10, 20);
145 printf("CompareThenSet32 tfret=%s val=%d\n", tf(tfret), val32);
146 val32 = 10;
147 tfret = SDL_AtomicCompareThenSet32(&val32, 0, 20);
148 printf("CompareThenSet32 tfret=%s val=%d\n", tf(tfret), val32);
149
150 val32 = 0;
151 tfret = SDL_AtomicTestThenSet32(&val32);
152 printf("TestThenSet32 tfret=%s val=%d\n", tf(tfret), val32);
153 tfret = SDL_AtomicTestThenSet32(&val32);
154 printf("TestThenSet32 tfret=%s val=%d\n", tf(tfret), val32);
155
23 SDL_AtomicClear32(&val32); 156 SDL_AtomicClear32(&val32);
157 printf("Clear32 val=%d\n", val32);
158
24 ret32 = SDL_AtomicFetchThenIncrement32(&val32); 159 ret32 = SDL_AtomicFetchThenIncrement32(&val32);
160 printf("FetchThenIncrement32 ret=%d val=%d\n", ret32, val32);
161
25 ret32 = SDL_AtomicFetchThenDecrement32(&val32); 162 ret32 = SDL_AtomicFetchThenDecrement32(&val32);
163 printf("FetchThenDecrement32 ret=%d val=%d\n", ret32, val32);
164
26 ret32 = SDL_AtomicFetchThenAdd32(&val32, 10); 165 ret32 = SDL_AtomicFetchThenAdd32(&val32, 10);
166 printf("FetchThenAdd32 ret=%d val=%d\n", ret32, val32);
167
27 ret32 = SDL_AtomicFetchThenSubtract32(&val32, 10); 168 ret32 = SDL_AtomicFetchThenSubtract32(&val32, 10);
169 printf("FetchThenSubtract32 ret=%d val=%d\n", ret32, val32);
170
28 ret32 = SDL_AtomicIncrementThenFetch32(&val32); 171 ret32 = SDL_AtomicIncrementThenFetch32(&val32);
172 printf("IncrementThenFetch32 ret=%d val=%d\n", ret32, val32);
173
29 ret32 = SDL_AtomicDecrementThenFetch32(&val32); 174 ret32 = SDL_AtomicDecrementThenFetch32(&val32);
175 printf("DecrementThenFetch32 ret=%d val=%d\n", ret32, val32);
176
30 ret32 = SDL_AtomicAddThenFetch32(&val32, 10); 177 ret32 = SDL_AtomicAddThenFetch32(&val32, 10);
178 printf("AddThenFetch32 ret=%d val=%d\n", ret32, val32);
179
31 ret32 = SDL_AtomicSubtractThenFetch32(&val32, 10); 180 ret32 = SDL_AtomicSubtractThenFetch32(&val32, 10);
32 181 printf("SubtractThenFetch32 ret=%d val=%d\n", ret32, val32);
33 /* #ifdef SDL_HAS_64BIT_TYPE */ 182
34 #if 0 183 #ifdef SDL_HAS_64BIT_TYPE
184 printf("64 bit -----------------------------------------\n\n");
35 185
36 ret64 = SDL_AtomicExchange64(&val64, 10); 186 ret64 = SDL_AtomicExchange64(&val64, 10);
37 tfval = SDL_AtomicCompareThenSet64(&val64, 10, 20); 187 printf("Exchange64 ret=%lld val=%lld\n", ret64, val64);
38 tfval = SDL_AtomicTestThenSet64(&val64); 188 ret64 = SDL_AtomicExchange64(&val64, 0);
189 printf("Exchange64 ret=%lld val=%lld\n", ret64, val64);
190
191 val64 = 10;
192 tfret = SDL_AtomicCompareThenSet64(&val64, 10, 20);
193 printf("CompareThenSet64 tfret=%s val=%lld\n", tf(tfret), val64);
194 val64 = 10;
195 tfret = SDL_AtomicCompareThenSet64(&val64, 0, 20);
196 printf("CompareThenSet64 tfret=%s val=%lld\n", tf(tfret), val64);
197
198 val64 = 0;
199 tfret = SDL_AtomicTestThenSet64(&val64);
200 printf("TestThenSet64 tfret=%s val=%lld\n", tf(tfret), val64);
201 tfret = SDL_AtomicTestThenSet64(&val64);
202 printf("TestThenSet64 tfret=%s val=%lld\n", tf(tfret), val64);
203
39 SDL_AtomicClear64(&val64); 204 SDL_AtomicClear64(&val64);
205 printf("Clear64 val=%lld\n", val64);
206
40 ret64 = SDL_AtomicFetchThenIncrement64(&val64); 207 ret64 = SDL_AtomicFetchThenIncrement64(&val64);
208 printf("FetchThenIncrement64 ret=%lld val=%lld\n", ret64, val64);
209
41 ret64 = SDL_AtomicFetchThenDecrement64(&val64); 210 ret64 = SDL_AtomicFetchThenDecrement64(&val64);
211 printf("FetchThenDecrement64 ret=%lld val=%lld\n", ret64, val64);
212
42 ret64 = SDL_AtomicFetchThenAdd64(&val64, 10); 213 ret64 = SDL_AtomicFetchThenAdd64(&val64, 10);
214 printf("FetchThenAdd64 ret=%lld val=%lld\n", ret64, val64);
215
43 ret64 = SDL_AtomicFetchThenSubtract64(&val64, 10); 216 ret64 = SDL_AtomicFetchThenSubtract64(&val64, 10);
217 printf("FetchThenSubtract64 ret=%lld val=%lld\n", ret64, val64);
218
44 ret64 = SDL_AtomicIncrementThenFetch64(&val64); 219 ret64 = SDL_AtomicIncrementThenFetch64(&val64);
220 printf("IncrementThenFetch64 ret=%lld val=%lld\n", ret64, val64);
221
45 ret64 = SDL_AtomicDecrementThenFetch64(&val64); 222 ret64 = SDL_AtomicDecrementThenFetch64(&val64);
223 printf("DecrementThenFetch64 ret=%lld val=%lld\n", ret64, val64);
224
46 ret64 = SDL_AtomicAddThenFetch64(&val64, 10); 225 ret64 = SDL_AtomicAddThenFetch64(&val64, 10);
226 printf("AddThenFetch64 ret=%lld val=%lld\n", ret64, val64);
227
47 ret64 = SDL_AtomicSubtractThenFetch64(&val64, 10); 228 ret64 = SDL_AtomicSubtractThenFetch64(&val64, 10);
229 printf("SubtractThenFetch64 ret=%lld val=%lld\n", ret64, val64);
48 #endif 230 #endif
49 231
50 return 0; 232 return 0;
51 } 233 }