1.0.9.64: Use umtx system call on FreeBSD to emulate futex.
authorNIIMI Satoshi <sa2c@users.sourceforge.net>
Wed, 19 Sep 2007 04:11:44 +0000 (04:11 +0000)
committerNIIMI Satoshi <sa2c@users.sourceforge.net>
Wed, 19 Sep 2007 04:11:44 +0000 (04:11 +0000)
make-config.sh
src/runtime/bsd-os.c
version.lisp-expr

index 020af64..e85d17a 100644 (file)
@@ -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
index 8c97396..b932fd6 100644 (file)
@@ -59,6 +59,9 @@ static void netbsd_init();
 
 #ifdef __FreeBSD__
 #include <sys/sysctl.h>
+#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_SB_PTHREAD_FUTEX)
+#include <sys/umtx.h>
+#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
index 51f6012..d6467d7 100644 (file)
@@ -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"