diff options
author | David Robillard <d@drobilla.net> | 2012-05-12 16:43:07 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2012-05-12 16:43:07 +0000 |
commit | ea09cab085bcdf91f8e47195a9997a36a305c471 (patch) | |
tree | cb4512a30cad8742f3fb3c62000ec9df7b03aa63 /raul | |
parent | 13be583770c860b63e03a9d9933bf8702c942b36 (diff) | |
download | raul-ea09cab085bcdf91f8e47195a9997a36a305c471.tar.gz raul-ea09cab085bcdf91f8e47195a9997a36a305c471.tar.bz2 raul-ea09cab085bcdf91f8e47195a9997a36a305c471.zip |
Fix Semaphore::timed_wait() on POSIX.
git-svn-id: http://svn.drobilla.net/lad/trunk/raul@4383 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'raul')
-rw-r--r-- | raul/Semaphore.hpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/raul/Semaphore.hpp b/raul/Semaphore.hpp index c45f92d..38b9251 100644 --- a/raul/Semaphore.hpp +++ b/raul/Semaphore.hpp @@ -25,8 +25,9 @@ #elif defined(_WIN32) # include <windows.h> #else -# include <semaphore.h> # include <errno.h> +# include <semaphore.h> +# include <time.h> #endif namespace Raul { @@ -229,8 +230,18 @@ inline bool Semaphore::timed_wait(unsigned ms) { const unsigned seconds = ms / 1000; - const struct timespec_t t = { seconds, (ms - (seconds * 1000)) * 1000000 }; - return (sem_timedwait(_sem, &t) == 0); + + struct timespec now; + clock_gettime(CLOCK_REALTIME, &now); + + struct timespec delta = { seconds, (ms - (seconds * 1000)) * 1000000 }; + struct timespec end = { now.tv_sec + delta.tv_sec, + now.tv_nsec + delta.tv_nsec }; + if (end.tv_nsec >= 1000000000L) { + ++end.tv_sec; + end.tv_nsec -= 1000000000L; + } + return (sem_timedwait(&_sem, &end) == 0); } #endif |