diff options
Diffstat (limited to 'linux')
-rw-r--r-- | linux/JackLinuxFutex.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/linux/JackLinuxFutex.cpp b/linux/JackLinuxFutex.cpp index aef99cd2..29b13901 100644 --- a/linux/JackLinuxFutex.cpp +++ b/linux/JackLinuxFutex.cpp @@ -23,6 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "JackConstants.h" #include "JackError.h" #include "promiscuous.h" +#include <climits> #include <fcntl.h> #include <stdio.h> #include <sys/mman.h> @@ -93,18 +94,24 @@ bool JackLinuxFutex::Wait() fFutex->internal = !fFutex->internal; } + const int wait_mode = fFutex->internal ? FUTEX_WAIT_PRIVATE : FUTEX_WAIT; + for (;;) { if (__sync_bool_compare_and_swap(&fFutex->futex, 1, 0)) return true; - if (::syscall(SYS_futex, fFutex, fFutex->internal ? FUTEX_WAIT_PRIVATE : FUTEX_WAIT, 0, NULL, NULL, 0) != 0 && errno != EWOULDBLOCK) - return false; + if (::syscall(SYS_futex, fFutex, wait_mode, 0, NULL, NULL, 0) != 0) + if (errno != EAGAIN && errno != EINTR) + return false; } } bool JackLinuxFutex::TimedWait(long usec) { + if (usec == LONG_MAX) + return Wait(); + if (!fFutex) { jack_error("JackLinuxFutex::TimedWait name = %s already deallocated!!", fName); return false; @@ -120,14 +127,16 @@ bool JackLinuxFutex::TimedWait(long usec) const int nsecs = (usec % 1000000) * 1000; const timespec timeout = { static_cast<time_t>(secs), nsecs }; + const int wait_mode = fFutex->internal ? FUTEX_WAIT_PRIVATE : FUTEX_WAIT; for (;;) { if (__sync_bool_compare_and_swap(&fFutex->futex, 1, 0)) return true; - if (::syscall(SYS_futex, fFutex, fFutex->internal ? FUTEX_WAIT_PRIVATE : FUTEX_WAIT, 0, &timeout, NULL, 0) != 0 && errno != EWOULDBLOCK) - return false; + if (::syscall(SYS_futex, fFutex, wait_mode, 0, &timeout, NULL, 0) != 0) + if (errno != EAGAIN && errno != EINTR) + return false; } } |