0.8.6.5
[sbcl.git] / src / code / thread.lisp
1 (in-package "SB!THREAD")
2
3 (sb!xc:defmacro with-recursive-lock ((mutex) &body body)
4   #!+sb-thread
5   (with-unique-names (cfp)
6     `(let ((,cfp (sb!kernel:current-fp)))
7       (unless (and (mutex-value ,mutex)
8                    (sb!vm:control-stack-pointer-valid-p
9                     (sb!sys:int-sap
10                      (sb!kernel:get-lisp-obj-address (mutex-value ,mutex)))))
11         ;; this punning with MAKE-LISP-OBJ depends for its safety on
12         ;; the frame pointer being a lispobj-aligned integer.  While
13         ;; it is, then MAKE-LISP-OBJ will always return a FIXNUM, so
14         ;; we're safe to do that.  Should this ever change, this
15         ;; MAKE-LISP-OBJ could return something that looks like a
16         ;; pointer, but pointing into neverneverland, which will
17         ;; confuse GC completely.  -- CSR, 2003-06-03
18         (get-mutex ,mutex (sb!kernel:make-lisp-obj (sb!sys:sap-int ,cfp))))
19       (unwind-protect
20            (progn ,@body)
21         (when (sb!sys:sap= (sb!sys:int-sap
22                             (sb!kernel:get-lisp-obj-address
23                              (mutex-value ,mutex)))
24                            ,cfp)
25           (release-mutex ,mutex)))))
26   #!-sb-thread
27   `(progn ,@body))
28