#!+sb-doc
"Mutex type."
(name nil :type (or null simple-string))
- (value nil)
+ (%owner nil :type (or null thread))
+ #!+(and (not sb-lutex) sb-thread)
+ (state 0 :type fixnum)
#!+(and sb-lutex sb-thread)
(lutex (make-lutex)))
+;;; FIXME: We probably want to rename the accessor MUTEX-OWNER.
+(defun mutex-value (mutex)
+ "Current owner of the mutex, NIL if the mutex is free."
+ (mutex-%owner mutex))
+
+(defsetf mutex-value set-mutex-value)
+
+(declaim (inline set-mutex-value))
+(defun set-mutex-value (mutex value)
+ (declare (ignore mutex value))
+ (error "~S is no longer supported." '(setf mutex-value)))
+
+(define-compiler-macro set-mutex-value (&whole form mutex value)
+ (declare (ignore mutex value))
+ (warn "~S is no longer supported, and will signal an error at runtime."
+ '(setf mutex-value))
+ form)
+
(def!struct spinlock
#!+sb-doc
"Spinlock type."
(without-interrupts
(allow-with-interrupts (funcall function)))))
+ (defun call-with-system-spinlock (function spinlock &optional without-gcing-p)
+ (declare (ignore spinlock)
+ (function function))
+ (if without-gcing-p
+ (without-gcing
+ (funcall function))
+ (without-interrupts
+ (allow-with-interrupts (funcall function)))))
+
(defun call-with-recursive-system-spinlock (function lock
&optional without-gcing-p)
(declare (ignore lock)
(without-interrupts
(allow-with-interrupts (%call-with-system-mutex))))))
+ (defun call-with-system-spinlock (function spinlock &optional without-gcing-p)
+ (declare (function function))
+ (flet ((%call-with-system-spinlock ()
+ (dx-let (got-it)
+ (unwind-protect
+ (when (setf got-it (get-spinlock spinlock))
+ (funcall function))
+ (when got-it
+ (release-spinlock spinlock))))))
+ (if without-gcing-p
+ (without-gcing
+ (%call-with-system-spinlock))
+ (without-interrupts
+ (allow-with-interrupts (%call-with-system-spinlock))))))
+
(defun call-with-recursive-system-spinlock (function lock
&optional without-gcing-p)
(declare (function function))
(defun call-with-recursive-lock (function mutex)
(declare (function function))
- (dx-let ((inner-lock-p (eq (mutex-value mutex) *current-thread*))
+ (dx-let ((inner-lock-p (eq (mutex-%owner mutex) *current-thread*))
(got-it nil))
(without-interrupts
(unwind-protect