diff options
-rw-r--r-- | src/semaphore.cc | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/semaphore.cc b/src/semaphore.cc index 51014b3..a7c8e74 100644 --- a/src/semaphore.cc +++ b/src/semaphore.cc @@ -30,6 +30,8 @@ #include <limits> #include <assert.h> #include <string.h> +#include <chrono> +#include <thread> #include "platform.h" @@ -134,9 +136,18 @@ bool Semaphore::wait(const std::chrono::milliseconds& timeout) ts.tv_sec += 1; } +again: int ret = sem_timedwait(&prv->semaphore, &ts); if(ret < 0) { + if(errno == EINTR) + { + // The timed wait were interrupted prematurely so we need to wait some + // more. To prevent an infinite loop-like behaviour we make a short sleep. + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + goto again; + } + if(errno == ETIMEDOUT) { return false; |