1 ;;;; support for threads needed at cross-compile time
3 ;;;; This software is part of the SBCL system. See the README file for
6 ;;;; This software is derived from the CMU CL system, which was
7 ;;;; written at Carnegie Mellon University and released into the
8 ;;;; public domain. The software is in the public domain and is
9 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
10 ;;;; files for more information.
12 (in-package "SB!THREAD")
17 (name nil :type (or null simple-string))
19 #!+(and sb-lutex sb-thread)
25 (name nil :type (or null simple-string))
28 (sb!xc:defmacro with-mutex ((mutex &key (value '*current-thread*) (wait-p t))
31 "Acquire MUTEX for the dynamic scope of BODY, setting it to
32 NEW-VALUE or some suitable default value if NIL. If WAIT-P is non-NIL
33 and the mutex is in use, sleep until it is available"
34 #!-sb-thread (declare (ignore mutex value wait-p))
36 (with-unique-names (got mutex1)
37 `(let ((,mutex1 ,mutex)
41 ;; FIXME: async unwind in SETQ form
42 (when (setq ,got (get-mutex ,mutex1 ,value ,wait-p))
46 (release-mutex ,mutex1)))))
47 ;; KLUDGE: this separate expansion for (NOT SB-THREAD) is not
48 ;; strictly necessary; GET-MUTEX and RELEASE-MUTEX are implemented.
49 ;; However, there would be a (possibly slight) performance hit in
54 (sb!xc:defmacro with-recursive-lock ((mutex) &body body)
56 "Acquires MUTEX for the dynamic scope of BODY. Within that scope
57 further recursive lock attempts for the same mutex succeed. It is
58 allowed to mix WITH-MUTEX and WITH-RECURSIVE-LOCK for the same mutex
59 provided the default value is used for the mutex."
61 (declare (ignore mutex))
63 (with-unique-names (mutex1 inner-lock-p)
64 `(let* ((,mutex1 ,mutex)
65 (,inner-lock-p (eq (mutex-value ,mutex1) *current-thread*)))
73 (release-mutex ,mutex1)))))