0.pre8.85
[sbcl.git] / src / code / target-unithread.lisp
index c79c011..e11ec9d 100644 (file)
@@ -1,8 +1,15 @@
 (in-package "SB!THREAD")
 
+;;; used bu debug-int.lisp to access interrupt contexts
+#!-sb-fluid (declaim (inline sb!vm::current-thread-offset-sap))
+(defun sb!vm::current-thread-offset-sap (n) 
+  (declare (type (unsigned-byte 27) n))
+  (sb!sys:sap-ref-sap (alien-sap (extern-alien "all_threads" (* t))) 
+              (* n 4)))
+
 (defun current-thread-id ()
-  (sb!sys:sap-int
-   (sb!vm::current-thread-offset-sap sb!vm::thread-pid-slot)))
+  (sb!sys:sap-ref-32 (alien-sap (extern-alien "all_threads" (* t))) 
+              (* sb!vm::thread-pid-slot 4)))
 
 ;;;; queues, locks 
 
      (setf old-value t1))))
 
 (defmacro with-mutex ((mutex &key value (wait-p t))  &body body)
-  (declare (ignore mutex value wait-p))
-  `(progn ,@body))
+  (cond ((not wait-p)
+        `(unless (mutex-value ,mutex)
+          (unwind-protect
+               (progn
+                 (setf (mutex-value ,mutex) (or ,value t))
+                 ,@body)
+            (setf (mutex-value ,mutex) nil))))
+       (t 
+        `(progn ,@body))))
 
 ;;; what's the best thing to do with these on unithread?
 #+NIl