X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fthread.lisp;h=01bbac7669ab8285067d35ea7e8f171ea71a3456;hb=da8cb4801a3ab35070f380e22aea3d260f9df8aa;hp=5571ef8a916e89586e63eb2d40983cd7fd9bc490;hpb=ec2e02db335d1545b3c18233bf440ca4160f780d;p=sbcl.git diff --git a/src/code/thread.lisp b/src/code/thread.lisp index 5571ef8..01bbac7 100644 --- a/src/code/thread.lisp +++ b/src/code/thread.lisp @@ -89,7 +89,16 @@ provided the default value is used for the mutex." (without-gcing (funcall function)) (without-interrupts - (funcall function)))) + (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) @@ -99,7 +108,7 @@ provided the default value is used for the mutex." (without-gcing (funcall function)) (without-interrupts - (funcall function)))) + (allow-with-interrupts (funcall function))))) (defun call-with-mutex (function mutex value waitp) (declare (ignore mutex value waitp) @@ -136,9 +145,25 @@ provided the default value is used for the mutex." (without-gcing (%call-with-system-mutex)) (without-interrupts - (%call-with-system-mutex))))) + (allow-with-interrupts (%call-with-system-mutex)))))) - (defun call-with-recursive-system-spinlock (function lock &optional without-gcing-p) + (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)) (flet ((%call-with-system-spinlock () (dx-let ((inner-lock-p (eq *current-thread* (spinlock-value lock))) @@ -152,7 +177,7 @@ provided the default value is used for the mutex." (without-gcing (%call-with-system-spinlock)) (without-interrupts - (%call-with-system-spinlock))))) + (allow-with-interrupts (%call-with-system-spinlock)))))) (defun call-with-spinlock (function spinlock) (declare (function function))