summaryrefslogtreecommitdiffstats
path: root/raul
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2012-05-12 16:43:07 +0000
committerDavid Robillard <d@drobilla.net>2012-05-12 16:43:07 +0000
commitea09cab085bcdf91f8e47195a9997a36a305c471 (patch)
treecb4512a30cad8742f3fb3c62000ec9df7b03aa63 /raul
parent13be583770c860b63e03a9d9933bf8702c942b36 (diff)
downloadraul-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.hpp17
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