diff options
author | Max Kellermann <max@duempel.org> | 2013-04-17 01:33:07 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2013-04-17 01:33:07 +0200 |
commit | c5c43c4541f4434b4c5a5bc5914d6bc08f75ea94 (patch) | |
tree | 1705020ab31359e019b89c75cab740dbfd5f9511 /src/thread | |
parent | 0954f580fa62ce52bb63739e7624f8b3f97546a6 (diff) |
thread/Cond: add method timed_wait()
Diffstat (limited to 'src/thread')
-rw-r--r-- | src/thread/PosixCond.hxx | 13 | ||||
-rw-r--r-- | src/thread/WindowsCond.hxx | 8 |
2 files changed, 19 insertions, 2 deletions
diff --git a/src/thread/PosixCond.hxx b/src/thread/PosixCond.hxx index acdc05edc..6f98d3ad0 100644 --- a/src/thread/PosixCond.hxx +++ b/src/thread/PosixCond.hxx @@ -32,6 +32,8 @@ #include "PosixMutex.hxx" +#include <sys/time.h> + /** * Low-level wrapper for a pthread_cond_t. */ @@ -55,6 +57,17 @@ public: void wait(PosixMutex &mutex) { pthread_cond_wait(&cond, &mutex.mutex); } + + bool timed_wait(PosixMutex &mutex, unsigned timeout_ms) { + struct timeval now; + gettimeofday(&now, nullptr); + + struct timespec ts; + ts.tv_sec = now.tv_sec + timeout_ms / 1000; + ts.tv_nsec = (now.tv_usec + (timeout_ms % 1000) * 1000) * 1000; + + return pthread_cond_timedwait(&cond, &mutex.mutex, &ts) == 0; + } }; #endif diff --git a/src/thread/WindowsCond.hxx b/src/thread/WindowsCond.hxx index f4e909c72..c05bc05b2 100644 --- a/src/thread/WindowsCond.hxx +++ b/src/thread/WindowsCond.hxx @@ -54,9 +54,13 @@ public: WakeAllConditionVariable(&cond); } + bool timed_wait(CriticalSection &mutex, DWORD timeout_ms) { + return SleepConditionVariableCS(&cond, &mutex.critical_section, + timeout_ms); + } + void wait(CriticalSection &mutex) { - SleepConditionVariableCS(&cond, &mutex.critical_section, - INFINITE); + timed_wait(mutex, INFINITE); } }; |