void TCOD_condition_broadcast(TCOD_cond_t pcond) { #ifdef TCOD_WINDOWS cond_t *cond=(cond_t *)pcond; if ( cond ) { TCOD_mutex_in(cond->mutex); if ( cond->nbWaiting > cond->nbSignals ) { int nbUnlock=cond->nbWaiting-cond->nbSignals; int i; cond->nbSignals=cond->nbWaiting; for (i=nbUnlock; i > 0; i--) { TCOD_semaphore_unlock(cond->waiting); } TCOD_mutex_out(cond->mutex); for (i=nbUnlock; i > 0; i--) { TCOD_semaphore_lock(cond->waitDone); } } else { TCOD_mutex_out(cond->mutex); } } #else if ( pcond ) { pthread_cond_broadcast((pthread_cond_t *)pcond); } #endif }
void TCOD_condition_signal(TCOD_cond_t pcond) { #ifdef TCOD_WINDOWS cond_t *cond=(cond_t *)pcond; if ( cond ) { TCOD_mutex_in(cond->mutex); if ( cond->nbWaiting > cond->nbSignals ) { cond->nbSignals++; TCOD_semaphore_unlock(cond->waiting); TCOD_mutex_out(cond->mutex); TCOD_semaphore_lock(cond->waitDone); } else { TCOD_mutex_out(cond->mutex); } } #else if ( pcond ) { pthread_cond_signal((pthread_cond_t *)pcond); } #endif }
void TCOD_condition_wait(TCOD_cond_t pcond, TCOD_mutex_t mut) { #ifdef TCOD_WINDOWS cond_t *cond=(cond_t *)pcond; if ( cond ) { TCOD_mutex_in(cond->mutex); cond->nbWaiting++; TCOD_mutex_out(cond->mutex); TCOD_mutex_out(mut); TCOD_semaphore_lock(cond->waiting); TCOD_mutex_in(cond->mutex); if ( cond->nbSignals > 0 ) { TCOD_semaphore_unlock(cond->waitDone); cond->nbSignals--; } cond->nbWaiting--; TCOD_mutex_out(cond->mutex); } #else if ( pcond && mut ) { pthread_cond_wait((pthread_cond_t *)pcond, (pthread_mutex_t *)mut); } #endif }
void TCODSystem::unlockSemaphore(TCOD_semaphore_t sem) { TCOD_semaphore_unlock(sem); }