Mercurial > sdl-ios-xcode
annotate test/testatomic.c @ 5126:d79ff339d1f2
Fixed bug #1056 (Frequent crashes in Touch events by simply touching the screen)
Joseba GarcĂa Echebarria 2010-12-15 01:55:22 PST
I believe the crash is caused by a check not being performed on wether an
SDL_Touch element is NULL before using it in the SDL_SendTouchMotion function
in src/events/SDL_touch.c around line 400.
Judging from the rest of the code, there's a missing
if (!touch) {
return 0;
}
before using "touch" as SDL_GetFinger(), SDL_GetFingerIndexId() use
touch->num_fingers without checking.
I can attach a patch if you like. It seems pretty straightforward, though.
I have yet to discover why touch is being returned as NULL as this error is
only triggered when an actual gesture has been performed, maybe something
related to SDL_AddTouch()?
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Fri, 28 Jan 2011 10:21:58 -0800 |
parents | 02b860cbc7ce |
children |
rev | line source |
---|---|
3338 | 1 #include <stdio.h> |
5006
8e8876e4aec6
Include windows.h in SDL_atomic.h by default, but don't include the atomic API in SDL.h
Sam Lantinga <slouken@libsdl.org>
parents:
5004
diff
changeset
|
2 |
3180
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
3 #include "SDL.h" |
5006
8e8876e4aec6
Include windows.h in SDL_atomic.h by default, but don't include the atomic API in SDL.h
Sam Lantinga <slouken@libsdl.org>
parents:
5004
diff
changeset
|
4 #include "SDL_atomic.h" |
5004
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
5 #include "SDL_assert.h" |
5118
02b860cbc7ce
Bump up the default cache line size.
Sam Lantinga <slouken@libsdl.org>
parents:
5117
diff
changeset
|
6 #include "SDL_cpuinfo.h" |
3180
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
7 |
3201
c297230efc75
Disabling 64 bit atomics operations until I figure out why they do not link.
Bob Pendleton <bob@pendleton.com>
parents:
3199
diff
changeset
|
8 /* |
3202
3aa519a5c676
I've made so many changes I don't dare continue until I check the current stuff in.
Bob Pendleton <bob@pendleton.com>
parents:
3201
diff
changeset
|
9 Absolutely basic tests just to see if we get the expected value |
3aa519a5c676
I've made so many changes I don't dare continue until I check the current stuff in.
Bob Pendleton <bob@pendleton.com>
parents:
3201
diff
changeset
|
10 after calling each function. |
3201
c297230efc75
Disabling 64 bit atomics operations until I figure out why they do not link.
Bob Pendleton <bob@pendleton.com>
parents:
3199
diff
changeset
|
11 */ |
c297230efc75
Disabling 64 bit atomics operations until I figure out why they do not link.
Bob Pendleton <bob@pendleton.com>
parents:
3199
diff
changeset
|
12 |
5004
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
13 static |
3338 | 14 char * |
3202
3aa519a5c676
I've made so many changes I don't dare continue until I check the current stuff in.
Bob Pendleton <bob@pendleton.com>
parents:
3201
diff
changeset
|
15 tf(SDL_bool tf) |
3aa519a5c676
I've made so many changes I don't dare continue until I check the current stuff in.
Bob Pendleton <bob@pendleton.com>
parents:
3201
diff
changeset
|
16 { |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
17 static char *t = "TRUE"; |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
18 static char *f = "FALSE"; |
3202
3aa519a5c676
I've made so many changes I don't dare continue until I check the current stuff in.
Bob Pendleton <bob@pendleton.com>
parents:
3201
diff
changeset
|
19 |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
20 if (tf) |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
21 { |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
22 return t; |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
23 } |
3202
3aa519a5c676
I've made so many changes I don't dare continue until I check the current stuff in.
Bob Pendleton <bob@pendleton.com>
parents:
3201
diff
changeset
|
24 |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
25 return f; |
3202
3aa519a5c676
I've made so many changes I don't dare continue until I check the current stuff in.
Bob Pendleton <bob@pendleton.com>
parents:
3201
diff
changeset
|
26 } |
3338 | 27 |
5004
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
28 static |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
29 void RunBasicTest() |
3180
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
30 { |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
31 int value; |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
32 SDL_SpinLock lock = 0; |
3261
72b542f34739
The new, cleaner, version of the atomic operations. The dummy code is what you should start working with to port atomic ops.
Bob Pendleton <bob@pendleton.com>
parents:
3237
diff
changeset
|
33 |
5013 | 34 SDL_atomic_t v; |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
35 SDL_bool tfret = SDL_FALSE; |
3202
3aa519a5c676
I've made so many changes I don't dare continue until I check the current stuff in.
Bob Pendleton <bob@pendleton.com>
parents:
3201
diff
changeset
|
36 |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
37 printf("\nspin lock---------------------------------------\n\n"); |
3202
3aa519a5c676
I've made so many changes I don't dare continue until I check the current stuff in.
Bob Pendleton <bob@pendleton.com>
parents:
3201
diff
changeset
|
38 |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
39 SDL_AtomicLock(&lock); |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
40 printf("AtomicLock lock=%d\n", lock); |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
41 SDL_AtomicUnlock(&lock); |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
42 printf("AtomicUnlock lock=%d\n", lock); |
3202
3aa519a5c676
I've made so many changes I don't dare continue until I check the current stuff in.
Bob Pendleton <bob@pendleton.com>
parents:
3201
diff
changeset
|
43 |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
44 printf("\natomic -----------------------------------------\n\n"); |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
45 |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
46 SDL_AtomicSet(&v, 0); |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
47 tfret = SDL_AtomicSet(&v, 10) == 0; |
5013 | 48 printf("AtomicSet(10) tfret=%s val=%d\n", tf(tfret), SDL_AtomicGet(&v)); |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
49 tfret = SDL_AtomicAdd(&v, 10) == 10; |
5013 | 50 printf("AtomicAdd(10) tfret=%s val=%d\n", tf(tfret), SDL_AtomicGet(&v)); |
3202
3aa519a5c676
I've made so many changes I don't dare continue until I check the current stuff in.
Bob Pendleton <bob@pendleton.com>
parents:
3201
diff
changeset
|
51 |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
52 SDL_AtomicSet(&v, 0); |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
53 SDL_AtomicIncRef(&v); |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
54 tfret = (SDL_AtomicGet(&v) == 1); |
5013 | 55 printf("AtomicIncRef() tfret=%s val=%d\n", tf(tfret), SDL_AtomicGet(&v)); |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
56 SDL_AtomicIncRef(&v); |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
57 tfret = (SDL_AtomicGet(&v) == 2); |
5013 | 58 printf("AtomicIncRef() tfret=%s val=%d\n", tf(tfret), SDL_AtomicGet(&v)); |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
59 tfret = (SDL_AtomicDecRef(&v) == SDL_FALSE); |
5013 | 60 printf("AtomicDecRef() tfret=%s val=%d\n", tf(tfret), SDL_AtomicGet(&v)); |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
61 tfret = (SDL_AtomicDecRef(&v) == SDL_TRUE); |
5013 | 62 printf("AtomicDecRef() tfret=%s val=%d\n", tf(tfret), SDL_AtomicGet(&v)); |
3202
3aa519a5c676
I've made so many changes I don't dare continue until I check the current stuff in.
Bob Pendleton <bob@pendleton.com>
parents:
3201
diff
changeset
|
63 |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
64 SDL_AtomicSet(&v, 10); |
5004
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
65 tfret = (SDL_AtomicCAS(&v, 0, 20) == SDL_FALSE); |
5013 | 66 printf("AtomicCAS() tfret=%s val=%d\n", tf(tfret), SDL_AtomicGet(&v)); |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
67 value = SDL_AtomicGet(&v); |
5004
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
68 tfret = (SDL_AtomicCAS(&v, value, 20) == SDL_TRUE); |
5013 | 69 printf("AtomicCAS() tfret=%s val=%d\n", tf(tfret), SDL_AtomicGet(&v)); |
5004
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
70 } |
3202
3aa519a5c676
I've made so many changes I don't dare continue until I check the current stuff in.
Bob Pendleton <bob@pendleton.com>
parents:
3201
diff
changeset
|
71 |
5018
342b158efbbe
Michael gave permission to use his test code
Sam Lantinga <slouken@libsdl.org>
parents:
5013
diff
changeset
|
72 /**************************************************************************/ |
342b158efbbe
Michael gave permission to use his test code
Sam Lantinga <slouken@libsdl.org>
parents:
5013
diff
changeset
|
73 /* Atomic operation test |
342b158efbbe
Michael gave permission to use his test code
Sam Lantinga <slouken@libsdl.org>
parents:
5013
diff
changeset
|
74 * Adapted with permission from code by Michael Davidsaver at: |
342b158efbbe
Michael gave permission to use his test code
Sam Lantinga <slouken@libsdl.org>
parents:
5013
diff
changeset
|
75 * http://bazaar.launchpad.net/~mdavidsaver/epics-base/atomic/revision/12105#src/libCom/test/epicsAtomicTest.c |
342b158efbbe
Michael gave permission to use his test code
Sam Lantinga <slouken@libsdl.org>
parents:
5013
diff
changeset
|
76 * Original copyright 2010 Brookhaven Science Associates as operator of Brookhaven National Lab |
342b158efbbe
Michael gave permission to use his test code
Sam Lantinga <slouken@libsdl.org>
parents:
5013
diff
changeset
|
77 * http://www.aps.anl.gov/epics/license/open.php |
342b158efbbe
Michael gave permission to use his test code
Sam Lantinga <slouken@libsdl.org>
parents:
5013
diff
changeset
|
78 */ |
5004
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
79 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
80 /* Tests semantics of atomic operations. Also a stress test |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
81 * to see if they are really atomic. |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
82 * |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
83 * Serveral threads adding to the same variable. |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
84 * at the end the value is compared with the expected |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
85 * and with a non-atomic counter. |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
86 */ |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
87 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
88 /* Number of concurrent incrementers */ |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
89 #define NThreads 2 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
90 #define CountInc 100 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
91 #define VALBITS (sizeof(atomicValue)*8) |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
92 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
93 #define atomicValue int |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
94 #define CountTo ((atomicValue)((unsigned int)(1<<(VALBITS-1))-1)) |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
95 #define NInter (CountTo/CountInc/NThreads) |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
96 #define Expect (CountTo-NInter*CountInc*NThreads) |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
97 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
98 SDL_COMPILE_TIME_ASSERT(size, CountTo>0); /* check for rollover */ |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
99 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
100 static SDL_atomic_t good = { 42 }; |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
101 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
102 static atomicValue bad = 42; |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
103 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
104 static SDL_atomic_t threadsRunning; |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
105 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
106 static SDL_sem *threadDone; |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
107 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
108 static |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
109 int adder(void* junk) |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
110 { |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
111 unsigned long N=NInter; |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
112 printf("Thread subtracting %d %lu times\n",CountInc,N); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
113 while (N--) { |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
114 SDL_AtomicAdd(&good, -CountInc); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
115 bad-=CountInc; |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
116 } |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
117 SDL_AtomicAdd(&threadsRunning, -1); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
118 SDL_SemPost(threadDone); |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
119 return 0; |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
3338
diff
changeset
|
120 } |
5004
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
121 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
122 static |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
123 void runAdder(void) |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
124 { |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
125 Uint32 start, end; |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
126 int T=NThreads; |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
127 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
128 start = SDL_GetTicks(); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
129 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
130 threadDone = SDL_CreateSemaphore(0); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
131 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
132 SDL_AtomicSet(&threadsRunning, NThreads); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
133 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
134 while (T--) |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
135 SDL_CreateThread(adder, NULL); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
136 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
137 while (SDL_AtomicGet(&threadsRunning) > 0) |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
138 SDL_SemWait(threadDone); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
139 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
140 SDL_DestroySemaphore(threadDone); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
141 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
142 end = SDL_GetTicks(); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
143 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
144 printf("Finished in %f sec\n", (end - start) / 1000.f); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
145 } |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
146 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
147 static |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
148 void RunEpicTest() |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
149 { |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
150 int b; |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
151 atomicValue v; |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
152 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
153 printf("\nepic test---------------------------------------\n\n"); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
154 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
155 printf("Size asserted to be >= 32-bit\n"); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
156 SDL_assert(sizeof(atomicValue)>=4); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
157 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
158 printf("Check static initializer\n"); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
159 v=SDL_AtomicGet(&good); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
160 SDL_assert(v==42); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
161 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
162 SDL_assert(bad==42); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
163 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
164 printf("Test negative values\n"); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
165 SDL_AtomicSet(&good, -5); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
166 v=SDL_AtomicGet(&good); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
167 SDL_assert(v==-5); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
168 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
169 printf("Verify maximum value\n"); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
170 SDL_AtomicSet(&good, CountTo); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
171 v=SDL_AtomicGet(&good); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
172 SDL_assert(v==CountTo); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
173 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
174 printf("Test compare and exchange\n"); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
175 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
176 b=SDL_AtomicCAS(&good, 500, 43); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
177 SDL_assert(!b); /* no swap since CountTo!=500 */ |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
178 v=SDL_AtomicGet(&good); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
179 SDL_assert(v==CountTo); /* ensure no swap */ |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
180 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
181 b=SDL_AtomicCAS(&good, CountTo, 44); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
182 SDL_assert(!!b); /* will swap */ |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
183 v=SDL_AtomicGet(&good); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
184 SDL_assert(v==44); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
185 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
186 printf("Test Add\n"); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
187 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
188 v=SDL_AtomicAdd(&good, 1); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
189 SDL_assert(v==44); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
190 v=SDL_AtomicGet(&good); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
191 SDL_assert(v==45); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
192 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
193 v=SDL_AtomicAdd(&good, 10); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
194 SDL_assert(v==45); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
195 v=SDL_AtomicGet(&good); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
196 SDL_assert(v==55); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
197 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
198 printf("Test Add (Negative values)\n"); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
199 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
200 v=SDL_AtomicAdd(&good, -20); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
201 SDL_assert(v==55); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
202 v=SDL_AtomicGet(&good); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
203 SDL_assert(v==35); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
204 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
205 v=SDL_AtomicAdd(&good, -50); /* crossing zero down */ |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
206 SDL_assert(v==35); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
207 v=SDL_AtomicGet(&good); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
208 SDL_assert(v==-15); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
209 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
210 v=SDL_AtomicAdd(&good, 30); /* crossing zero up */ |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
211 SDL_assert(v==-15); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
212 v=SDL_AtomicGet(&good); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
213 SDL_assert(v==15); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
214 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
215 printf("Reset before count down test\n"); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
216 SDL_AtomicSet(&good, CountTo); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
217 v=SDL_AtomicGet(&good); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
218 SDL_assert(v==CountTo); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
219 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
220 bad=CountTo; |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
221 SDL_assert(bad==CountTo); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
222 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
223 printf("Counting down from %d, Expect %d remaining\n",CountTo,Expect); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
224 runAdder(); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
225 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
226 v=SDL_AtomicGet(&good); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
227 printf("Atomic %d Non-Atomic %d\n",v,bad); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
228 SDL_assert(v==Expect); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
229 SDL_assert(bad!=Expect); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
230 } |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
231 |
5018
342b158efbbe
Michael gave permission to use his test code
Sam Lantinga <slouken@libsdl.org>
parents:
5013
diff
changeset
|
232 /* End atomic operation test */ |
342b158efbbe
Michael gave permission to use his test code
Sam Lantinga <slouken@libsdl.org>
parents:
5013
diff
changeset
|
233 /**************************************************************************/ |
342b158efbbe
Michael gave permission to use his test code
Sam Lantinga <slouken@libsdl.org>
parents:
5013
diff
changeset
|
234 |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
235 /**************************************************************************/ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
236 /* Lock-free FIFO test */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
237 |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
238 /* This is useful to test the impact of another thread locking the queue |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
239 entirely for heavy-weight manipulation. |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
240 */ |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
241 #define TEST_SPINLOCK_FIFO |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
242 |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
243 #define NUM_READERS 4 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
244 #define NUM_WRITERS 4 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
245 #define EVENTS_PER_WRITER 1000000 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
246 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
247 /* The number of entries must be a power of 2 */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
248 #define MAX_ENTRIES 256 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
249 #define WRAP_MASK (MAX_ENTRIES-1) |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
250 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
251 typedef struct |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
252 { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
253 SDL_atomic_t sequence; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
254 SDL_Event event; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
255 } SDL_EventQueueEntry; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
256 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
257 typedef struct |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
258 { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
259 SDL_EventQueueEntry entries[MAX_ENTRIES]; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
260 |
5117
427998ff3bcf
Added cache line size info in SDL_cpuinfo.h
Sam Lantinga <slouken@libsdl.org>
parents:
5116
diff
changeset
|
261 char cache_pad1[SDL_CACHELINE_SIZE-((sizeof(SDL_EventQueueEntry)*MAX_ENTRIES)%SDL_CACHELINE_SIZE)]; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
262 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
263 SDL_atomic_t enqueue_pos; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
264 |
5117
427998ff3bcf
Added cache line size info in SDL_cpuinfo.h
Sam Lantinga <slouken@libsdl.org>
parents:
5116
diff
changeset
|
265 char cache_pad2[SDL_CACHELINE_SIZE-sizeof(SDL_atomic_t)]; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
266 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
267 SDL_atomic_t dequeue_pos; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
268 |
5117
427998ff3bcf
Added cache line size info in SDL_cpuinfo.h
Sam Lantinga <slouken@libsdl.org>
parents:
5116
diff
changeset
|
269 char cache_pad3[SDL_CACHELINE_SIZE-sizeof(SDL_atomic_t)]; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
270 |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
271 #ifdef TEST_SPINLOCK_FIFO |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
272 SDL_SpinLock lock; |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
273 SDL_atomic_t rwcount; |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
274 SDL_atomic_t watcher; |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
275 |
5117
427998ff3bcf
Added cache line size info in SDL_cpuinfo.h
Sam Lantinga <slouken@libsdl.org>
parents:
5116
diff
changeset
|
276 char cache_pad4[SDL_CACHELINE_SIZE-sizeof(SDL_SpinLock)-2*sizeof(SDL_atomic_t)]; |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
277 #endif |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
278 |
5104
42a7591530d5
Since we're directly reading and writing 'active' from different threads, it needs to be flagged volatile.
Sam Lantinga <slouken@libsdl.org>
parents:
5101
diff
changeset
|
279 volatile SDL_bool active; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
280 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
281 /* Only needed for the mutex test */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
282 SDL_mutex *mutex; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
283 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
284 } SDL_EventQueue; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
285 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
286 static void InitEventQueue(SDL_EventQueue *queue) |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
287 { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
288 int i; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
289 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
290 for (i = 0; i < MAX_ENTRIES; ++i) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
291 SDL_AtomicSet(&queue->entries[i].sequence, i); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
292 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
293 SDL_AtomicSet(&queue->enqueue_pos, 0); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
294 SDL_AtomicSet(&queue->dequeue_pos, 0); |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
295 #ifdef TEST_SPINLOCK_FIFO |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
296 queue->lock = 0; |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
297 SDL_AtomicSet(&queue->rwcount, 0); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
298 #endif |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
299 queue->active = SDL_TRUE; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
300 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
301 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
302 static SDL_bool EnqueueEvent_LockFree(SDL_EventQueue *queue, const SDL_Event *event) |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
303 { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
304 SDL_EventQueueEntry *entry; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
305 unsigned queue_pos; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
306 unsigned entry_seq; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
307 int delta; |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
308 SDL_bool status; |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
309 |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
310 #ifdef TEST_SPINLOCK_FIFO |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
311 /* This is a gate so an external thread can lock the queue */ |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
312 SDL_AtomicLock(&queue->lock); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
313 SDL_assert(SDL_AtomicGet(&queue->watcher) == 0); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
314 SDL_AtomicIncRef(&queue->rwcount); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
315 SDL_AtomicUnlock(&queue->lock); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
316 #endif |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
317 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
318 queue_pos = (unsigned)SDL_AtomicGet(&queue->enqueue_pos); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
319 for ( ; ; ) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
320 entry = &queue->entries[queue_pos & WRAP_MASK]; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
321 entry_seq = (unsigned)SDL_AtomicGet(&entry->sequence); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
322 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
323 delta = (int)(entry_seq - queue_pos); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
324 if (delta == 0) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
325 /* The entry and the queue position match, try to increment the queue position */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
326 if (SDL_AtomicCAS(&queue->enqueue_pos, (int)queue_pos, (int)(queue_pos+1))) { |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
327 /* We own the object, fill it! */ |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
328 entry->event = *event; |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
329 SDL_AtomicSet(&entry->sequence, (int)(queue_pos + 1)); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
330 status = SDL_TRUE; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
331 break; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
332 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
333 } else if (delta < 0) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
334 /* We ran into an old queue entry, which means it still needs to be dequeued */ |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
335 status = SDL_FALSE; |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
336 break; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
337 } else { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
338 /* We ran into a new queue entry, get the new queue position */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
339 queue_pos = (unsigned)SDL_AtomicGet(&queue->enqueue_pos); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
340 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
341 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
342 |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
343 #ifdef TEST_SPINLOCK_FIFO |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
344 SDL_AtomicDecRef(&queue->rwcount); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
345 #endif |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
346 return status; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
347 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
348 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
349 static SDL_bool DequeueEvent_LockFree(SDL_EventQueue *queue, SDL_Event *event) |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
350 { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
351 SDL_EventQueueEntry *entry; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
352 unsigned queue_pos; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
353 unsigned entry_seq; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
354 int delta; |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
355 SDL_bool status; |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
356 |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
357 #ifdef TEST_SPINLOCK_FIFO |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
358 /* This is a gate so an external thread can lock the queue */ |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
359 SDL_AtomicLock(&queue->lock); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
360 SDL_assert(SDL_AtomicGet(&queue->watcher) == 0); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
361 SDL_AtomicIncRef(&queue->rwcount); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
362 SDL_AtomicUnlock(&queue->lock); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
363 #endif |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
364 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
365 queue_pos = (unsigned)SDL_AtomicGet(&queue->dequeue_pos); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
366 for ( ; ; ) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
367 entry = &queue->entries[queue_pos & WRAP_MASK]; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
368 entry_seq = (unsigned)SDL_AtomicGet(&entry->sequence); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
369 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
370 delta = (int)(entry_seq - (queue_pos + 1)); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
371 if (delta == 0) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
372 /* The entry and the queue position match, try to increment the queue position */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
373 if (SDL_AtomicCAS(&queue->dequeue_pos, (int)queue_pos, (int)(queue_pos+1))) { |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
374 /* We own the object, fill it! */ |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
375 *event = entry->event; |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
376 SDL_AtomicSet(&entry->sequence, (int)(queue_pos+MAX_ENTRIES)); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
377 status = SDL_TRUE; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
378 break; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
379 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
380 } else if (delta < 0) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
381 /* We ran into an old queue entry, which means we've hit empty */ |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
382 status = SDL_FALSE; |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
383 break; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
384 } else { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
385 /* We ran into a new queue entry, get the new queue position */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
386 queue_pos = (unsigned)SDL_AtomicGet(&queue->dequeue_pos); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
387 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
388 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
389 |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
390 #ifdef TEST_SPINLOCK_FIFO |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
391 SDL_AtomicDecRef(&queue->rwcount); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
392 #endif |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
393 return status; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
394 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
395 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
396 static SDL_bool EnqueueEvent_Mutex(SDL_EventQueue *queue, const SDL_Event *event) |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
397 { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
398 SDL_EventQueueEntry *entry; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
399 unsigned queue_pos; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
400 unsigned entry_seq; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
401 int delta; |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
402 SDL_bool status = SDL_FALSE; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
403 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
404 SDL_mutexP(queue->mutex); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
405 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
406 queue_pos = (unsigned)queue->enqueue_pos.value; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
407 entry = &queue->entries[queue_pos & WRAP_MASK]; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
408 entry_seq = (unsigned)entry->sequence.value; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
409 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
410 delta = (int)(entry_seq - queue_pos); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
411 if (delta == 0) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
412 ++queue->enqueue_pos.value; |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
413 |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
414 /* We own the object, fill it! */ |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
415 entry->event = *event; |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
416 entry->sequence.value = (int)(queue_pos + 1); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
417 status = SDL_TRUE; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
418 } else if (delta < 0) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
419 /* We ran into an old queue entry, which means it still needs to be dequeued */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
420 } else { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
421 printf("ERROR: mutex failed!\n"); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
422 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
423 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
424 SDL_mutexV(queue->mutex); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
425 |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
426 return status; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
427 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
428 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
429 static SDL_bool DequeueEvent_Mutex(SDL_EventQueue *queue, SDL_Event *event) |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
430 { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
431 SDL_EventQueueEntry *entry; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
432 unsigned queue_pos; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
433 unsigned entry_seq; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
434 int delta; |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
435 SDL_bool status = SDL_FALSE; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
436 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
437 SDL_mutexP(queue->mutex); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
438 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
439 queue_pos = (unsigned)queue->dequeue_pos.value; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
440 entry = &queue->entries[queue_pos & WRAP_MASK]; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
441 entry_seq = (unsigned)entry->sequence.value; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
442 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
443 delta = (int)(entry_seq - (queue_pos + 1)); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
444 if (delta == 0) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
445 ++queue->dequeue_pos.value; |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
446 |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
447 /* We own the object, fill it! */ |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
448 *event = entry->event; |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
449 entry->sequence.value = (int)(queue_pos + MAX_ENTRIES); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
450 status = SDL_TRUE; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
451 } else if (delta < 0) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
452 /* We ran into an old queue entry, which means we've hit empty */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
453 } else { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
454 printf("ERROR: mutex failed!\n"); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
455 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
456 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
457 SDL_mutexV(queue->mutex); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
458 |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
459 return status; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
460 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
461 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
462 static SDL_sem *writersDone; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
463 static SDL_sem *readersDone; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
464 static SDL_atomic_t writersRunning; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
465 static SDL_atomic_t readersRunning; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
466 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
467 typedef struct |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
468 { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
469 SDL_EventQueue *queue; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
470 int index; |
5117
427998ff3bcf
Added cache line size info in SDL_cpuinfo.h
Sam Lantinga <slouken@libsdl.org>
parents:
5116
diff
changeset
|
471 char padding1[SDL_CACHELINE_SIZE-(sizeof(SDL_EventQueue*)+sizeof(int))%SDL_CACHELINE_SIZE]; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
472 int waits; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
473 SDL_bool lock_free; |
5117
427998ff3bcf
Added cache line size info in SDL_cpuinfo.h
Sam Lantinga <slouken@libsdl.org>
parents:
5116
diff
changeset
|
474 char padding2[SDL_CACHELINE_SIZE-sizeof(int)-sizeof(SDL_bool)]; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
475 } WriterData; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
476 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
477 typedef struct |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
478 { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
479 SDL_EventQueue *queue; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
480 int counters[NUM_WRITERS]; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
481 int waits; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
482 SDL_bool lock_free; |
5117
427998ff3bcf
Added cache line size info in SDL_cpuinfo.h
Sam Lantinga <slouken@libsdl.org>
parents:
5116
diff
changeset
|
483 char padding[SDL_CACHELINE_SIZE-(sizeof(SDL_EventQueue*)+sizeof(int)*NUM_WRITERS+sizeof(int)+sizeof(SDL_bool))%SDL_CACHELINE_SIZE]; |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
484 } ReaderData; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
485 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
486 static int FIFO_Writer(void* _data) |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
487 { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
488 WriterData *data = (WriterData *)_data; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
489 SDL_EventQueue *queue = data->queue; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
490 int index = data->index; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
491 int i; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
492 SDL_Event event; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
493 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
494 event.type = SDL_USEREVENT; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
495 event.user.windowID = 0; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
496 event.user.code = 0; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
497 event.user.data1 = data; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
498 event.user.data2 = NULL; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
499 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
500 if (data->lock_free) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
501 for (i = 0; i < EVENTS_PER_WRITER; ++i) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
502 event.user.code = i; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
503 while (!EnqueueEvent_LockFree(queue, &event)) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
504 ++data->waits; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
505 SDL_Delay(0); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
506 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
507 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
508 } else { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
509 for (i = 0; i < EVENTS_PER_WRITER; ++i) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
510 event.user.code = i; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
511 while (!EnqueueEvent_Mutex(queue, &event)) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
512 ++data->waits; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
513 SDL_Delay(0); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
514 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
515 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
516 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
517 SDL_AtomicAdd(&writersRunning, -1); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
518 SDL_SemPost(writersDone); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
519 return 0; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
520 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
521 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
522 static int FIFO_Reader(void* _data) |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
523 { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
524 ReaderData *data = (ReaderData *)_data; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
525 SDL_EventQueue *queue = data->queue; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
526 SDL_Event event; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
527 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
528 if (data->lock_free) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
529 for ( ; ; ) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
530 if (DequeueEvent_LockFree(queue, &event)) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
531 WriterData *writer = (WriterData*)event.user.data1; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
532 ++data->counters[writer->index]; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
533 } else if (queue->active) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
534 ++data->waits; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
535 SDL_Delay(0); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
536 } else { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
537 /* We drained the queue, we're done! */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
538 break; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
539 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
540 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
541 } else { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
542 for ( ; ; ) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
543 if (DequeueEvent_Mutex(queue, &event)) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
544 WriterData *writer = (WriterData*)event.user.data1; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
545 ++data->counters[writer->index]; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
546 } else if (queue->active) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
547 ++data->waits; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
548 SDL_Delay(0); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
549 } else { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
550 /* We drained the queue, we're done! */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
551 break; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
552 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
553 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
554 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
555 SDL_AtomicAdd(&readersRunning, -1); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
556 SDL_SemPost(readersDone); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
557 return 0; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
558 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
559 |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
560 #ifdef TEST_SPINLOCK_FIFO |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
561 /* This thread periodically locks the queue for no particular reason */ |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
562 static int FIFO_Watcher(void* _data) |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
563 { |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
564 SDL_EventQueue *queue = (SDL_EventQueue *)_data; |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
565 |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
566 while (queue->active) { |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
567 SDL_AtomicLock(&queue->lock); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
568 SDL_AtomicIncRef(&queue->watcher); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
569 while (SDL_AtomicGet(&queue->rwcount) > 0) { |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
570 SDL_Delay(0); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
571 } |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
572 /* Do queue manipulation here... */ |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
573 SDL_AtomicDecRef(&queue->watcher); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
574 SDL_AtomicUnlock(&queue->lock); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
575 |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
576 /* Wait a bit... */ |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
577 SDL_Delay(1); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
578 } |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
579 return 0; |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
580 } |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
581 #endif /* TEST_SPINLOCK_FIFO */ |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
582 |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
583 static void RunFIFOTest(SDL_bool lock_free) |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
584 { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
585 SDL_EventQueue queue; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
586 WriterData writerData[NUM_WRITERS]; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
587 ReaderData readerData[NUM_READERS]; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
588 Uint32 start, end; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
589 int i, j; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
590 int grand_total; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
591 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
592 printf("\nFIFO test---------------------------------------\n\n"); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
593 printf("Mode: %s\n", lock_free ? "LockFree" : "Mutex"); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
594 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
595 readersDone = SDL_CreateSemaphore(0); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
596 writersDone = SDL_CreateSemaphore(0); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
597 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
598 SDL_memset(&queue, 0xff, sizeof(queue)); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
599 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
600 InitEventQueue(&queue); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
601 if (!lock_free) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
602 queue.mutex = SDL_CreateMutex(); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
603 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
604 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
605 start = SDL_GetTicks(); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
606 |
5101
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
607 #ifdef TEST_SPINLOCK_FIFO |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
608 /* Start a monitoring thread */ |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
609 if (lock_free) { |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
610 SDL_CreateThread(FIFO_Watcher, &queue); |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
611 } |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
612 #endif |
1b3678ac9804
Added a test to measure the impact of a separate thread periodically locking the queue entirely.
Sam Lantinga <slouken@libsdl.org>
parents:
5100
diff
changeset
|
613 |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
614 /* Start the readers first */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
615 printf("Starting %d readers\n", NUM_READERS); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
616 SDL_zero(readerData); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
617 SDL_AtomicSet(&readersRunning, NUM_READERS); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
618 for (i = 0; i < NUM_READERS; ++i) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
619 readerData[i].queue = &queue; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
620 readerData[i].lock_free = lock_free; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
621 SDL_CreateThread(FIFO_Reader, &readerData[i]); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
622 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
623 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
624 /* Start up the writers */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
625 printf("Starting %d writers\n", NUM_WRITERS); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
626 SDL_zero(writerData); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
627 SDL_AtomicSet(&writersRunning, NUM_WRITERS); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
628 for (i = 0; i < NUM_WRITERS; ++i) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
629 writerData[i].queue = &queue; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
630 writerData[i].index = i; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
631 writerData[i].lock_free = lock_free; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
632 SDL_CreateThread(FIFO_Writer, &writerData[i]); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
633 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
634 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
635 /* Wait for the writers */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
636 while (SDL_AtomicGet(&writersRunning) > 0) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
637 SDL_SemWait(writersDone); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
638 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
639 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
640 /* Shut down the queue so readers exit */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
641 queue.active = SDL_FALSE; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
642 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
643 /* Wait for the readers */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
644 while (SDL_AtomicGet(&readersRunning) > 0) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
645 SDL_SemWait(readersDone); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
646 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
647 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
648 end = SDL_GetTicks(); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
649 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
650 SDL_DestroySemaphore(readersDone); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
651 SDL_DestroySemaphore(writersDone); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
652 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
653 if (!lock_free) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
654 SDL_DestroyMutex(queue.mutex); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
655 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
656 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
657 printf("Finished in %f sec\n", (end - start) / 1000.f); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
658 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
659 printf("\n"); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
660 for (i = 0; i < NUM_WRITERS; ++i) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
661 printf("Writer %d wrote %d events, had %d waits\n", i, EVENTS_PER_WRITER, writerData[i].waits); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
662 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
663 printf("Writers wrote %d total events\n", NUM_WRITERS*EVENTS_PER_WRITER); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
664 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
665 /* Print a breakdown of which readers read messages from which writer */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
666 printf("\n"); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
667 grand_total = 0; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
668 for (i = 0; i < NUM_READERS; ++i) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
669 int total = 0; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
670 for (j = 0; j < NUM_WRITERS; ++j) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
671 total += readerData[i].counters[j]; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
672 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
673 grand_total += total; |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
674 printf("Reader %d read %d events, had %d waits\n", i, total, readerData[i].waits); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
675 printf(" { "); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
676 for (j = 0; j < NUM_WRITERS; ++j) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
677 if (j > 0) { |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
678 printf(", "); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
679 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
680 printf("%d", readerData[i].counters[j]); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
681 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
682 printf(" }\n"); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
683 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
684 printf("Readers read %d total events\n", grand_total); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
685 } |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
686 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
687 /* End FIFO test */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
688 /**************************************************************************/ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
689 |
5004
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
690 int |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
691 main(int argc, char *argv[]) |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
692 { |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
693 RunBasicTest(); |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
694 RunEpicTest(); |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
695 /* This test is really slow, so don't run it by default */ |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
696 #if 0 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
697 RunFIFOTest(SDL_FALSE); |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
698 #endif |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
699 RunFIFOTest(SDL_TRUE); |
5004
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
700 return 0; |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
701 } |
5100
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
702 |
470ede30189c
Added a FIFO test to the atomic test suite.
Sam Lantinga <slouken@libsdl.org>
parents:
5018
diff
changeset
|
703 /* vi: set ts=4 sw=4 expandtab: */ |