Mercurial > sdl-ios-xcode
diff src/thread/nds/SDL_syscond.c @ 2671:c3e7c0698cbb gsoc2008_nds
some changes to the dummy driver for debug purposes that should be reverted.
most importantly, commenting out a check for an env. var.
author | Darren Alton <dalton@stevens.edu> |
---|---|
date | Thu, 12 Jun 2008 02:38:49 +0000 |
parents | 6e4669f4db49 |
children |
line wrap: on
line diff
--- a/src/thread/nds/SDL_syscond.c Tue Jun 10 06:57:57 2008 +0000 +++ b/src/thread/nds/SDL_syscond.c Thu Jun 12 02:38:49 2008 +0000 @@ -22,7 +22,7 @@ #ifdef SAVE_RCSID static char rcsid = - "@(#) $Id: SDL_syscond.c,v 1.2 2001/04/26 16:50:18 hercules Exp $"; + "@(#) $Id: SDL_syscond.c,v 1.2 2001/04/26 16:50:18 hercules Exp $"; #endif /* An implementation of condition variables using semaphores and mutexes */ @@ -39,107 +39,111 @@ struct SDL_cond { - SDL_mutex *lock; - int waiting; - int signals; - SDL_sem *wait_sem; - SDL_sem *wait_done; + SDL_mutex *lock; + int waiting; + int signals; + SDL_sem *wait_sem; + SDL_sem *wait_done; }; /* Create a condition variable */ -SDL_cond * SDL_CreateCond(void) +SDL_cond * +SDL_CreateCond(void) { - SDL_cond *cond; + SDL_cond *cond; - cond = (SDL_cond *) malloc(sizeof(SDL_cond)); - if ( cond ) { - cond->lock = SDL_CreateMutex(); - cond->wait_sem = SDL_CreateSemaphore(0); - cond->wait_done = SDL_CreateSemaphore(0); - cond->waiting = cond->signals = 0; - if ( ! cond->lock || ! cond->wait_sem || ! cond->wait_done ) { - SDL_DestroyCond(cond); - cond = NULL; - } - } else { - SDL_OutOfMemory(); - } - return(cond); + cond = (SDL_cond *) malloc(sizeof(SDL_cond)); + if (cond) { + cond->lock = SDL_CreateMutex(); + cond->wait_sem = SDL_CreateSemaphore(0); + cond->wait_done = SDL_CreateSemaphore(0); + cond->waiting = cond->signals = 0; + if (!cond->lock || !cond->wait_sem || !cond->wait_done) { + SDL_DestroyCond(cond); + cond = NULL; + } + } else { + SDL_OutOfMemory(); + } + return (cond); } /* Destroy a condition variable */ -void SDL_DestroyCond(SDL_cond *cond) +void +SDL_DestroyCond(SDL_cond * cond) { - if ( cond ) { - if ( cond->wait_sem ) { - SDL_DestroySemaphore(cond->wait_sem); - } - if ( cond->wait_done ) { - SDL_DestroySemaphore(cond->wait_done); - } - if ( cond->lock ) { - SDL_DestroyMutex(cond->lock); - } - free(cond); - } + if (cond) { + if (cond->wait_sem) { + SDL_DestroySemaphore(cond->wait_sem); + } + if (cond->wait_done) { + SDL_DestroySemaphore(cond->wait_done); + } + if (cond->lock) { + SDL_DestroyMutex(cond->lock); + } + free(cond); + } } /* Restart one of the threads that are waiting on the condition variable */ -int SDL_CondSignal(SDL_cond *cond) +int +SDL_CondSignal(SDL_cond * cond) { - if ( ! cond ) { - SDL_SetError("Passed a NULL condition variable"); - return -1; - } + if (!cond) { + SDL_SetError("Passed a NULL condition variable"); + return -1; + } - /* If there are waiting threads not already signalled, then - signal the condition and wait for the thread to respond. - */ - SDL_LockMutex(cond->lock); - if ( cond->waiting > cond->signals ) { - ++cond->signals; - SDL_SemPost(cond->wait_sem); - SDL_UnlockMutex(cond->lock); - SDL_SemWait(cond->wait_done); - } else { - SDL_UnlockMutex(cond->lock); - } + /* If there are waiting threads not already signalled, then + signal the condition and wait for the thread to respond. + */ + SDL_LockMutex(cond->lock); + if (cond->waiting > cond->signals) { + ++cond->signals; + SDL_SemPost(cond->wait_sem); + SDL_UnlockMutex(cond->lock); + SDL_SemWait(cond->wait_done); + } else { + SDL_UnlockMutex(cond->lock); + } - return 0; + return 0; } /* Restart all threads that are waiting on the condition variable */ -int SDL_CondBroadcast(SDL_cond *cond) +int +SDL_CondBroadcast(SDL_cond * cond) { - if ( ! cond ) { - SDL_SetError("Passed a NULL condition variable"); - return -1; - } + if (!cond) { + SDL_SetError("Passed a NULL condition variable"); + return -1; + } - /* If there are waiting threads not already signalled, then - signal the condition and wait for the thread to respond. - */ - SDL_LockMutex(cond->lock); - if ( cond->waiting > cond->signals ) { - int i, num_waiting; + /* If there are waiting threads not already signalled, then + signal the condition and wait for the thread to respond. + */ + SDL_LockMutex(cond->lock); + if (cond->waiting > cond->signals) { + int i, num_waiting; - num_waiting = (cond->waiting - cond->signals); - cond->signals = cond->waiting; - for ( i=0; i<num_waiting; ++i ) { - SDL_SemPost(cond->wait_sem); - } - /* Now all released threads are blocked here, waiting for us. - Collect them all (and win fabulous prizes!) :-) - */ - SDL_UnlockMutex(cond->lock); - for ( i=0; i<num_waiting; ++i ) { - SDL_SemWait(cond->wait_done); - } - } else { - SDL_UnlockMutex(cond->lock); - } + num_waiting = (cond->waiting - cond->signals); + cond->signals = cond->waiting; + for (i = 0; i < num_waiting; ++i) { + SDL_SemPost(cond->wait_sem); + } + /* Now all released threads are blocked here, waiting for us. + Collect them all (and win fabulous prizes!) :-) + */ + SDL_UnlockMutex(cond->lock); + for (i = 0; i < num_waiting; ++i) { + SDL_SemWait(cond->wait_done); + } + } else { + SDL_UnlockMutex(cond->lock); + } - return 0; + return 0; } /* Wait on the condition variable for at most 'ms' milliseconds. @@ -162,62 +166,64 @@ ... SDL_UnlockMutex(lock); */ -int SDL_CondWaitTimeout(SDL_cond *cond, SDL_mutex *mutex, Uint32 ms) +int +SDL_CondWaitTimeout(SDL_cond * cond, SDL_mutex * mutex, Uint32 ms) { - int retval; + int retval; - if ( ! cond ) { - SDL_SetError("Passed a NULL condition variable"); - return -1; - } + if (!cond) { + SDL_SetError("Passed a NULL condition variable"); + return -1; + } - /* Obtain the protection mutex, and increment the number of waiters. - This allows the signal mechanism to only perform a signal if there - are waiting threads. - */ - SDL_LockMutex(cond->lock); - ++cond->waiting; - SDL_UnlockMutex(cond->lock); + /* Obtain the protection mutex, and increment the number of waiters. + This allows the signal mechanism to only perform a signal if there + are waiting threads. + */ + SDL_LockMutex(cond->lock); + ++cond->waiting; + SDL_UnlockMutex(cond->lock); - /* Unlock the mutex, as is required by condition variable semantics */ - SDL_UnlockMutex(mutex); + /* Unlock the mutex, as is required by condition variable semantics */ + SDL_UnlockMutex(mutex); - /* Wait for a signal */ - if ( ms == SDL_MUTEX_MAXWAIT ) { - retval = SDL_SemWait(cond->wait_sem); - } else { - retval = SDL_SemWaitTimeout(cond->wait_sem, ms); - } + /* Wait for a signal */ + if (ms == SDL_MUTEX_MAXWAIT) { + retval = SDL_SemWait(cond->wait_sem); + } else { + retval = SDL_SemWaitTimeout(cond->wait_sem, ms); + } - /* Let the signaler know we have completed the wait, otherwise - the signaler can race ahead and get the condition semaphore - if we are stopped between the mutex unlock and semaphore wait, - giving a deadlock. See the following URL for details: - http://www-classic.be.com/aboutbe/benewsletter/volume_III/Issue40.html - */ - SDL_LockMutex(cond->lock); - if ( cond->signals > 0 ) { - /* If we timed out, we need to eat a condition signal */ - if ( retval > 0 ) { - SDL_SemWait(cond->wait_sem); - } - /* We always notify the signal thread that we are done */ - SDL_SemPost(cond->wait_done); + /* Let the signaler know we have completed the wait, otherwise + the signaler can race ahead and get the condition semaphore + if we are stopped between the mutex unlock and semaphore wait, + giving a deadlock. See the following URL for details: + http://www-classic.be.com/aboutbe/benewsletter/volume_III/Issue40.html + */ + SDL_LockMutex(cond->lock); + if (cond->signals > 0) { + /* If we timed out, we need to eat a condition signal */ + if (retval > 0) { + SDL_SemWait(cond->wait_sem); + } + /* We always notify the signal thread that we are done */ + SDL_SemPost(cond->wait_done); - /* Signal handshake complete */ - --cond->signals; - } - --cond->waiting; - SDL_UnlockMutex(cond->lock); + /* Signal handshake complete */ + --cond->signals; + } + --cond->waiting; + SDL_UnlockMutex(cond->lock); - /* Lock the mutex, as is required by condition variable semantics */ - SDL_LockMutex(mutex); + /* Lock the mutex, as is required by condition variable semantics */ + SDL_LockMutex(mutex); - return retval; + return retval; } /* Wait on the condition variable forever */ -int SDL_CondWait(SDL_cond *cond, SDL_mutex *mutex) +int +SDL_CondWait(SDL_cond * cond, SDL_mutex * mutex) { - return SDL_CondWaitTimeout(cond, mutex, SDL_MUTEX_MAXWAIT); + return SDL_CondWaitTimeout(cond, mutex, SDL_MUTEX_MAXWAIT); }