win32: prevent lost wakeups
This commit is contained in:
parent
f1db922c26
commit
44e92c91ea
21
thread.c
21
thread.c
|
@ -100,7 +100,7 @@ void sthread_join(sthread_t *thread)
|
||||||
|
|
||||||
struct slock
|
struct slock
|
||||||
{
|
{
|
||||||
CRITICAL_SECTION lock;
|
HANDLE lock;
|
||||||
};
|
};
|
||||||
|
|
||||||
slock_t *slock_new(void)
|
slock_t *slock_new(void)
|
||||||
|
@ -109,24 +109,29 @@ slock_t *slock_new(void)
|
||||||
if (!lock)
|
if (!lock)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
InitializeCriticalSection(&lock->lock);
|
lock->lock = CreateMutex(NULL, FALSE, "");
|
||||||
|
if (!lock->lock)
|
||||||
|
{
|
||||||
|
free(lock);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
return lock;
|
return lock;
|
||||||
}
|
}
|
||||||
|
|
||||||
void slock_free(slock_t *lock)
|
void slock_free(slock_t *lock)
|
||||||
{
|
{
|
||||||
DeleteCriticalSection(&lock->lock);
|
CloseHandle(lock->lock);
|
||||||
free(lock);
|
free(lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void slock_lock(slock_t *lock)
|
void slock_lock(slock_t *lock)
|
||||||
{
|
{
|
||||||
EnterCriticalSection(&lock->lock);
|
WaitForSingleObject(lock->lock, INFINITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void slock_unlock(slock_t *lock)
|
void slock_unlock(slock_t *lock)
|
||||||
{
|
{
|
||||||
LeaveCriticalSection(&lock->lock);
|
ReleaseMutex(lock->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct scond
|
struct scond
|
||||||
|
@ -153,9 +158,8 @@ scond_t *scond_new(void)
|
||||||
void scond_wait(scond_t *cond, slock_t *lock)
|
void scond_wait(scond_t *cond, slock_t *lock)
|
||||||
{
|
{
|
||||||
WaitForSingleObject(cond->event, 0);
|
WaitForSingleObject(cond->event, 0);
|
||||||
slock_unlock(lock);
|
|
||||||
|
|
||||||
WaitForSingleObject(cond->event, INFINITE);
|
SignalObjectAndWait(lock->lock, cond->event, INFINITE, FALSE);
|
||||||
|
|
||||||
slock_lock(lock);
|
slock_lock(lock);
|
||||||
}
|
}
|
||||||
|
@ -163,9 +167,8 @@ void scond_wait(scond_t *cond, slock_t *lock)
|
||||||
bool scond_wait_timeout(scond_t *cond, slock_t *lock, int64_t timeout_us)
|
bool scond_wait_timeout(scond_t *cond, slock_t *lock, int64_t timeout_us)
|
||||||
{
|
{
|
||||||
WaitForSingleObject(cond->event, 0);
|
WaitForSingleObject(cond->event, 0);
|
||||||
slock_unlock(lock);
|
|
||||||
|
|
||||||
DWORD res = WaitForSingleObject(cond->event, (DWORD)(timeout_us) / 1000);
|
DWORD res = SignalObjectAndWait(lock->lock, cond->event, (DWORD)(timeout_us) / 1000, FALSE);
|
||||||
|
|
||||||
slock_lock(lock);
|
slock_lock(lock);
|
||||||
return res == WAIT_OBJECT_0;
|
return res == WAIT_OBJECT_0;
|
||||||
|
|
Loading…
Reference in New Issue