X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fthread.lisp;h=1d751ac667a9243affd2cbdc524733bbf7f08a4f;hb=94e0f68a627ce839d59e88b4c8faad486e75af91;hp=fcf433b394ef91e9e23db8721dee0191533daa4f;hpb=f2847d6ed16e60390d000410d36ec7fb2570cdaf;p=sbcl.git diff --git a/src/code/thread.lisp b/src/code/thread.lisp index fcf433b..1d751ac 100644 --- a/src/code/thread.lisp +++ b/src/code/thread.lisp @@ -15,10 +15,30 @@ #!+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." @@ -91,6 +111,15 @@ provided the default value is used for the mutex." (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) @@ -138,6 +167,21 @@ provided the default value is used for the mutex." (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)) @@ -179,7 +223,7 @@ provided the default value is used for the mutex." (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