From 81e552e32af4b500bcbddea6b3f1853cac0572ec Mon Sep 17 00:00:00 2001 From: NIIMI Satoshi Date: Wed, 19 Sep 2007 04:11:44 +0000 Subject: [PATCH] 1.0.9.64: Use umtx system call on FreeBSD to emulate futex. --- make-config.sh | 1 - src/runtime/bsd-os.c | 40 ++++++++++++++++++++++++++++++++++++++++ version.lisp-expr | 2 +- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/make-config.sh b/make-config.sh index 020af64..e85d17a 100644 --- a/make-config.sh +++ b/make-config.sh @@ -197,7 +197,6 @@ case "$sbcl_os" in freebsd) printf ' :elf' >> $ltf printf ' :freebsd' >> $ltf - printf ' :sb-pthread-futex' >> $ltf printf ' :gcc-tls' >> $ltf if [ $sbcl_arch = "x86" ]; then printf ' :restore-tls-segment-register-from-context' >> $ltf diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index 8c97396..b932fd6 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -59,6 +59,9 @@ static void netbsd_init(); #ifdef __FreeBSD__ #include +#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_SB_PTHREAD_FUTEX) +#include +#endif static void freebsd_init(); #endif /* __FreeBSD__ */ @@ -392,6 +395,43 @@ static void freebsd_init() } #endif /* LISP_FEATURE_X86 */ } + +#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_SB_PTHREAD_FUTEX) +int +futex_wait(int *lock_word, long oldval, long sec, unsigned long usec) +{ + struct timespec timeout; + int ret; + +again: + if (sec < 0) + ret = umtx_wait((void *)lock_word, oldval, NULL); + else { + timeout.tv_sec = sec; + timeout.tv_nsec = usec * 1000; + ret = umtx_wait((void *)lock_word, oldval, &timeout); + } + + switch (ret) { + case 0: + return 0; + case ETIMEDOUT: + return 1; + case EINTR: + /* spurious wakeup from interrupt */ + goto again; + default: + /* EWOULDBLOCK and others, need to check the lock */ + return -1; + } +} + +int +futex_wake(int *lock_word, int n) +{ + return umtx_wake((void *)lock_word, n); +} +#endif #endif /* __FreeBSD__ */ #ifdef LISP_FEATURE_DARWIN diff --git a/version.lisp-expr b/version.lisp-expr index 51f6012..d6467d7 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.9.63" +"1.0.9.64" -- 1.7.10.4