diff options
Diffstat (limited to 'src/common/mutex.c')
-rw-r--r-- | src/common/mutex.c | 60 |
1 files changed, 30 insertions, 30 deletions
diff --git a/src/common/mutex.c b/src/common/mutex.c index f046febf6..31202d440 100644 --- a/src/common/mutex.c +++ b/src/common/mutex.c @@ -52,19 +52,19 @@ struct racond{ ramutex *ramutex_create(void) { struct ramutex *m; - + m = (struct ramutex*)aMalloc( sizeof(struct ramutex) ); if (m == NULL) { ShowFatalError("ramutex_create: OOM while allocating %"PRIuS" bytes.\n", sizeof(struct ramutex)); return NULL; } - + #ifdef WIN32 InitializeCriticalSection(&m->hMutex); #else pthread_mutex_init(&m->hMutex, NULL); #endif - + return m; }//end: ramutex_create() @@ -101,7 +101,7 @@ bool ramutex_trylock(ramutex *m) { #else if(pthread_mutex_trylock(&m->hMutex) == 0) return true; - + return false; #endif }//end: ramutex_trylock() @@ -126,7 +126,7 @@ void ramutex_unlock(ramutex *m) { racond *racond_create(void) { struct racond *c; - + c = (struct racond*)aMalloc( sizeof(struct racond) ); if (c == NULL) { ShowFatalError("racond_create: OOM while allocating %"PRIuS" bytes\n", sizeof(struct racond)); @@ -135,13 +135,13 @@ racond *racond_create(void) { #ifdef WIN32 c->nWaiters = 0; - c->events[ EVENT_COND_SIGNAL ] = CreateEvent( NULL, FALSE, FALSE, NULL ); - c->events[ EVENT_COND_BROADCAST ] = CreateEvent( NULL, TRUE, FALSE, NULL ); + c->events[EVENT_COND_SIGNAL] = CreateEvent(NULL, FALSE, FALSE, NULL); + c->events[EVENT_COND_BROADCAST] = CreateEvent(NULL, TRUE, FALSE, NULL); InitializeCriticalSection( &c->waiters_lock ); #else pthread_cond_init(&c->hCond, NULL); #endif - + return c; }//end: racond_create() @@ -174,24 +174,20 @@ void racond_wait(racond *c, ramutex *m, sysint timeout_ticks) { ms = INFINITE; else ms = (timeout_ticks > MAXDWORD) ? (MAXDWORD - 1) : (DWORD)timeout_ticks; - - + // we can release the mutex (m) here, cause win's // manual reset events maintain state when used with // SetEvent() ramutex_unlock(m); result = WaitForMultipleObjects(2, c->events, FALSE, ms); - - + EnterCriticalSection(&c->waiters_lock); c->nWaiters--; if( (result == WAIT_OBJECT_0 + EVENT_COND_BROADCAST) && (c->nWaiters == 0) ) is_last = true; // Broadcast called! LeaveCriticalSection(&c->waiters_lock); - - // we are the last waiter that has to be notified, or to stop waiting // so we have to do a manual reset if(is_last == true) @@ -206,10 +202,10 @@ void racond_wait(racond *c, ramutex *m, sysint timeout_ticks) { }else{ struct timespec wtime; int64 exact_timeout = timer->gettick() + timeout_ticks; - + wtime.tv_sec = exact_timeout/1000; wtime.tv_nsec = (exact_timeout%1000)*1000000; - + pthread_cond_timedwait( &c->hCond, &m->hMutex, &wtime); } @@ -219,13 +215,15 @@ void racond_wait(racond *c, ramutex *m, sysint timeout_ticks) { void racond_signal(racond *c) { #ifdef WIN32 -// bool has_waiters = false; -// EnterCriticalSection(&c->waiters_lock); -// if(c->nWaiters > 0) -// has_waiters = true; -// LeaveCriticalSection(&c->waiters_lock); - -// if(has_waiters == true) +# if 0 + bool has_waiters = false; + EnterCriticalSection(&c->waiters_lock); + if(c->nWaiters > 0) + has_waiters = true; + LeaveCriticalSection(&c->waiters_lock); + + if(has_waiters == true) +# endif // 0 SetEvent( c->events[ EVENT_COND_SIGNAL ] ); #else pthread_cond_signal(&c->hCond); @@ -235,13 +233,15 @@ void racond_signal(racond *c) { void racond_broadcast(racond *c) { #ifdef WIN32 -// bool has_waiters = false; -// EnterCriticalSection(&c->waiters_lock); -// if(c->nWaiters > 0) -// has_waiters = true; -// LeaveCriticalSection(&c->waiters_lock); - -// if(has_waiters == true) +# if 0 + bool has_waiters = false; + EnterCriticalSection(&c->waiters_lock); + if(c->nWaiters > 0) + has_waiters = true; + LeaveCriticalSection(&c->waiters_lock); + + if(has_waiters == true) +# endif // 0 SetEvent( c->events[ EVENT_COND_BROADCAST ] ); #else pthread_cond_broadcast(&c->hCond); |