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_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 TCOD_semaphore_lock(TCOD_semaphore_t sem) { #ifdef TCOD_WINDOWS WaitForSingleObject((HANDLE)sem,INFINITE); #else sem_t *s =(sem_t *)sem; TCOD_mutex_in(&s->mut); s->value--; if ( s->value >= 0) { TCOD_mutex_out(&s->mut); return; } pthread_cond_wait(&s->cond, &s->mut); TCOD_mutex_out(&s->mut); #endif }
void TCOD_semaphore_unlock(TCOD_semaphore_t sem) { #ifdef TCOD_WINDOWS ReleaseSemaphore((HANDLE)sem,1,NULL); #else sem_t *s=(sem_t *)sem; TCOD_mutex_in(&s->mut); s->value++; if ( s->value > 0) { // no thread waiting on condition TCOD_mutex_out(&s->mut); return; } // awake a thread pthread_cond_signal(&s->cond); TCOD_mutex_out(&s->mut); #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 TCODSystem::mutexIn(TCOD_mutex_t mut) { TCOD_mutex_in(mut); }