comparison src/thread/dc/SDL_syscond.c @ 1668:4da1ee79c9af SDL-1.3

more tweaking indent options
author Sam Lantinga <slouken@libsdl.org>
date Mon, 29 May 2006 04:04:35 +0000
parents 782fd950bd46
children
comparison
equal deleted inserted replaced
1667:1fddae038bc8 1668:4da1ee79c9af
38 SDL_sem *wait_done; 38 SDL_sem *wait_done;
39 }; 39 };
40 40
41 /* Create a condition variable */ 41 /* Create a condition variable */
42 SDL_cond * 42 SDL_cond *
43 SDL_CreateCond (void) 43 SDL_CreateCond(void)
44 { 44 {
45 SDL_cond *cond; 45 SDL_cond *cond;
46 46
47 cond = (SDL_cond *) SDL_malloc (sizeof (SDL_cond)); 47 cond = (SDL_cond *) SDL_malloc(sizeof(SDL_cond));
48 if (cond) { 48 if (cond) {
49 cond->lock = SDL_CreateMutex (); 49 cond->lock = SDL_CreateMutex();
50 cond->wait_sem = SDL_CreateSemaphore (0); 50 cond->wait_sem = SDL_CreateSemaphore(0);
51 cond->wait_done = SDL_CreateSemaphore (0); 51 cond->wait_done = SDL_CreateSemaphore(0);
52 cond->waiting = cond->signals = 0; 52 cond->waiting = cond->signals = 0;
53 if (!cond->lock || !cond->wait_sem || !cond->wait_done) { 53 if (!cond->lock || !cond->wait_sem || !cond->wait_done) {
54 SDL_DestroyCond (cond); 54 SDL_DestroyCond(cond);
55 cond = NULL; 55 cond = NULL;
56 } 56 }
57 } else { 57 } else {
58 SDL_OutOfMemory (); 58 SDL_OutOfMemory();
59 } 59 }
60 return (cond); 60 return (cond);
61 } 61 }
62 62
63 /* Destroy a condition variable */ 63 /* Destroy a condition variable */
64 void 64 void
65 SDL_DestroyCond (SDL_cond * cond) 65 SDL_DestroyCond(SDL_cond * cond)
66 { 66 {
67 if (cond) { 67 if (cond) {
68 if (cond->wait_sem) { 68 if (cond->wait_sem) {
69 SDL_DestroySemaphore (cond->wait_sem); 69 SDL_DestroySemaphore(cond->wait_sem);
70 } 70 }
71 if (cond->wait_done) { 71 if (cond->wait_done) {
72 SDL_DestroySemaphore (cond->wait_done); 72 SDL_DestroySemaphore(cond->wait_done);
73 } 73 }
74 if (cond->lock) { 74 if (cond->lock) {
75 SDL_DestroyMutex (cond->lock); 75 SDL_DestroyMutex(cond->lock);
76 } 76 }
77 SDL_free (cond); 77 SDL_free(cond);
78 } 78 }
79 } 79 }
80 80
81 /* Restart one of the threads that are waiting on the condition variable */ 81 /* Restart one of the threads that are waiting on the condition variable */
82 int 82 int
83 SDL_CondSignal (SDL_cond * cond) 83 SDL_CondSignal(SDL_cond * cond)
84 { 84 {
85 if (!cond) { 85 if (!cond) {
86 SDL_SetError ("Passed a NULL condition variable"); 86 SDL_SetError("Passed a NULL condition variable");
87 return -1; 87 return -1;
88 } 88 }
89 89
90 /* If there are waiting threads not already signalled, then 90 /* If there are waiting threads not already signalled, then
91 signal the condition and wait for the thread to respond. 91 signal the condition and wait for the thread to respond.
92 */ 92 */
93 SDL_LockMutex (cond->lock); 93 SDL_LockMutex(cond->lock);
94 if (cond->waiting > cond->signals) { 94 if (cond->waiting > cond->signals) {
95 ++cond->signals; 95 ++cond->signals;
96 SDL_SemPost (cond->wait_sem); 96 SDL_SemPost(cond->wait_sem);
97 SDL_UnlockMutex (cond->lock); 97 SDL_UnlockMutex(cond->lock);
98 SDL_SemWait (cond->wait_done); 98 SDL_SemWait(cond->wait_done);
99 } else { 99 } else {
100 SDL_UnlockMutex (cond->lock); 100 SDL_UnlockMutex(cond->lock);
101 } 101 }
102 102
103 return 0; 103 return 0;
104 } 104 }
105 105
106 /* Restart all threads that are waiting on the condition variable */ 106 /* Restart all threads that are waiting on the condition variable */
107 int 107 int
108 SDL_CondBroadcast (SDL_cond * cond) 108 SDL_CondBroadcast(SDL_cond * cond)
109 { 109 {
110 if (!cond) { 110 if (!cond) {
111 SDL_SetError ("Passed a NULL condition variable"); 111 SDL_SetError("Passed a NULL condition variable");
112 return -1; 112 return -1;
113 } 113 }
114 114
115 /* If there are waiting threads not already signalled, then 115 /* If there are waiting threads not already signalled, then
116 signal the condition and wait for the thread to respond. 116 signal the condition and wait for the thread to respond.
117 */ 117 */
118 SDL_LockMutex (cond->lock); 118 SDL_LockMutex(cond->lock);
119 if (cond->waiting > cond->signals) { 119 if (cond->waiting > cond->signals) {
120 int i, num_waiting; 120 int i, num_waiting;
121 121
122 num_waiting = (cond->waiting - cond->signals); 122 num_waiting = (cond->waiting - cond->signals);
123 cond->signals = cond->waiting; 123 cond->signals = cond->waiting;
124 for (i = 0; i < num_waiting; ++i) { 124 for (i = 0; i < num_waiting; ++i) {
125 SDL_SemPost (cond->wait_sem); 125 SDL_SemPost(cond->wait_sem);
126 } 126 }
127 /* Now all released threads are blocked here, waiting for us. 127 /* Now all released threads are blocked here, waiting for us.
128 Collect them all (and win fabulous prizes!) :-) 128 Collect them all (and win fabulous prizes!) :-)
129 */ 129 */
130 SDL_UnlockMutex (cond->lock); 130 SDL_UnlockMutex(cond->lock);
131 for (i = 0; i < num_waiting; ++i) { 131 for (i = 0; i < num_waiting; ++i) {
132 SDL_SemWait (cond->wait_done); 132 SDL_SemWait(cond->wait_done);
133 } 133 }
134 } else { 134 } else {
135 SDL_UnlockMutex (cond->lock); 135 SDL_UnlockMutex(cond->lock);
136 } 136 }
137 137
138 return 0; 138 return 0;
139 } 139 }
140 140
157 condition = true; 157 condition = true;
158 ... 158 ...
159 SDL_UnlockMutex(lock); 159 SDL_UnlockMutex(lock);
160 */ 160 */
161 int 161 int
162 SDL_CondWaitTimeout (SDL_cond * cond, SDL_mutex * mutex, Uint32 ms) 162 SDL_CondWaitTimeout(SDL_cond * cond, SDL_mutex * mutex, Uint32 ms)
163 { 163 {
164 int retval; 164 int retval;
165 165
166 if (!cond) { 166 if (!cond) {
167 SDL_SetError ("Passed a NULL condition variable"); 167 SDL_SetError("Passed a NULL condition variable");
168 return -1; 168 return -1;
169 } 169 }
170 170
171 /* Obtain the protection mutex, and increment the number of waiters. 171 /* Obtain the protection mutex, and increment the number of waiters.
172 This allows the signal mechanism to only perform a signal if there 172 This allows the signal mechanism to only perform a signal if there
173 are waiting threads. 173 are waiting threads.
174 */ 174 */
175 SDL_LockMutex (cond->lock); 175 SDL_LockMutex(cond->lock);
176 ++cond->waiting; 176 ++cond->waiting;
177 SDL_UnlockMutex (cond->lock); 177 SDL_UnlockMutex(cond->lock);
178 178
179 /* Unlock the mutex, as is required by condition variable semantics */ 179 /* Unlock the mutex, as is required by condition variable semantics */
180 SDL_UnlockMutex (mutex); 180 SDL_UnlockMutex(mutex);
181 181
182 /* Wait for a signal */ 182 /* Wait for a signal */
183 if (ms == SDL_MUTEX_MAXWAIT) { 183 if (ms == SDL_MUTEX_MAXWAIT) {
184 retval = SDL_SemWait (cond->wait_sem); 184 retval = SDL_SemWait(cond->wait_sem);
185 } else { 185 } else {
186 retval = SDL_SemWaitTimeout (cond->wait_sem, ms); 186 retval = SDL_SemWaitTimeout(cond->wait_sem, ms);
187 } 187 }
188 188
189 /* Let the signaler know we have completed the wait, otherwise 189 /* Let the signaler know we have completed the wait, otherwise
190 the signaler can race ahead and get the condition semaphore 190 the signaler can race ahead and get the condition semaphore
191 if we are stopped between the mutex unlock and semaphore wait, 191 if we are stopped between the mutex unlock and semaphore wait,
192 giving a deadlock. See the following URL for details: 192 giving a deadlock. See the following URL for details:
193 http://www-classic.be.com/aboutbe/benewsletter/volume_III/Issue40.html 193 http://www-classic.be.com/aboutbe/benewsletter/volume_III/Issue40.html
194 */ 194 */
195 SDL_LockMutex (cond->lock); 195 SDL_LockMutex(cond->lock);
196 if (cond->signals > 0) { 196 if (cond->signals > 0) {
197 /* If we timed out, we need to eat a condition signal */ 197 /* If we timed out, we need to eat a condition signal */
198 if (retval > 0) { 198 if (retval > 0) {
199 SDL_SemWait (cond->wait_sem); 199 SDL_SemWait(cond->wait_sem);
200 } 200 }
201 /* We always notify the signal thread that we are done */ 201 /* We always notify the signal thread that we are done */
202 SDL_SemPost (cond->wait_done); 202 SDL_SemPost(cond->wait_done);
203 203
204 /* Signal handshake complete */ 204 /* Signal handshake complete */
205 --cond->signals; 205 --cond->signals;
206 } 206 }
207 --cond->waiting; 207 --cond->waiting;
208 SDL_UnlockMutex (cond->lock); 208 SDL_UnlockMutex(cond->lock);
209 209
210 /* Lock the mutex, as is required by condition variable semantics */ 210 /* Lock the mutex, as is required by condition variable semantics */
211 SDL_LockMutex (mutex); 211 SDL_LockMutex(mutex);
212 212
213 return retval; 213 return retval;
214 } 214 }
215 215
216 /* Wait on the condition variable forever */ 216 /* Wait on the condition variable forever */
217 int 217 int
218 SDL_CondWait (SDL_cond * cond, SDL_mutex * mutex) 218 SDL_CondWait(SDL_cond * cond, SDL_mutex * mutex)
219 { 219 {
220 return SDL_CondWaitTimeout (cond, mutex, SDL_MUTEX_MAXWAIT); 220 return SDL_CondWaitTimeout(cond, mutex, SDL_MUTEX_MAXWAIT);
221 } 221 }
222 222
223 /* vi: set ts=4 sw=4 expandtab: */ 223 /* vi: set ts=4 sw=4 expandtab: */