From 4c011cd8892fea4fcdf335531fb24473089fe41d Mon Sep 17 00:00:00 2001 From: NIIMI Satoshi Date: Tue, 1 May 2007 05:20:19 +0000 Subject: [PATCH] 1.0.5.16: Follow the change of linux-os.c:futex_wait(). --- src/runtime/pthread-futex.c | 34 +++++++++++++++++++++++++++++++++- version.lisp-expr | 2 +- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/runtime/pthread-futex.c b/src/runtime/pthread-futex.c index f010f9d..a08eb80 100644 --- a/src/runtime/pthread-futex.c +++ b/src/runtime/pthread-futex.c @@ -205,17 +205,46 @@ futex_relative_to_abs(struct timespec *tp, int relative) return 0; } +static int +futex_istimeout(struct timeval *timeout) +{ + int ret; + struct timeval tv; + + if (timeout == NULL) + return 0; + + ret = gettimeofday(&tv, NULL); + if (ret != 0) + return ret; + + return (tv.tv_sec > timeout->tv_sec) || + ((tv.tv_sec == timeout->tv_sec) && tv.tv_usec > timeout->tv_usec); +} + int futex_wait(int *lock_word, int oldval, long sec, unsigned long usec) { int ret, result; struct futex *futex; sigset_t oldset, newset; + struct timeval tv, *timeout; sigemptyset(&newset); sigaddset_deferrable(&newset); again: + if (sec < 0) + timeout = NULL; + else { + ret = gettimeofday(&tv, NULL); + if (ret != 0) + return ret; + tv.tv_sec = tv.tv_sec + sec + (tv.tv_usec + usec) / 1000000; + tv.tv_usec = (tv.tv_usec + usec) % 1000000; + timeout = &tv; + } + pthread_sigmask(SIG_BLOCK, &newset, &oldset); futex = futex_get(lock_word); @@ -245,7 +274,7 @@ again: &abstime); futex_assert(result == 0 || result == ETIMEDOUT); - if (result != ETIMEDOUT) + if (result != ETIMEDOUT || futex_istimeout(timeout)) break; /* futex system call of Linux returns with EINTR errno when @@ -271,6 +300,9 @@ done: goto again; } + if (result == ETIMEDOUT) + return 1; + return result; } diff --git a/version.lisp-expr b/version.lisp-expr index 57e57ee..fead5e8 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -17,4 +17,4 @@ ;;; checkins which aren't released. (And occasionally for internal ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"1.0.5.15" +"1.0.5.16" -- 1.7.10.4