- (flet ((%call-with-system-mutex ()
- (dx-let (got-it)
- (unwind-protect
- (when (setf got-it (get-mutex mutex))
- (funcall function))
- (when got-it
- (release-mutex mutex))))))
- (if without-gcing-p
- (without-gcing
- (%call-with-system-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))
- (flet ((%call-with-system-spinlock ()
- (dx-let ((inner-lock-p (eq *current-thread* (spinlock-value lock)))
- (got-it nil))
- (unwind-protect
- (when (or inner-lock-p (setf got-it (get-spinlock lock)))
- (funcall function))
- (when got-it
- (release-spinlock lock))))))
- (if without-gcing-p
- (without-gcing
- (%call-with-system-spinlock))
- (without-interrupts
- (allow-with-interrupts (%call-with-system-spinlock))))))
+ (without-interrupts
+ (dx-let (got-it)
+ (unwind-protect
+ (when (setf got-it (get-spinlock spinlock))
+ (funcall function))
+ (when got-it
+ (release-spinlock spinlock))))))
+
+ (macrolet ((def (name &optional variant)
+ `(defun ,(if variant (symbolicate name "/" variant) name)
+ (function spinlock)
+ (declare (function function))
+ (flet ((%call-with-system-spinlock ()
+ (dx-let ((inner-lock-p
+ (eq *current-thread*
+ (spinlock-value spinlock)))
+ (got-it nil))
+ (unwind-protect
+ (when (or inner-lock-p
+ (setf got-it
+ (get-spinlock spinlock)))
+ (funcall function))
+ (when got-it
+ (release-spinlock spinlock))))))
+ (declare (inline %call-with-system-spinlock))
+ ,(ecase variant
+ (:without-gcing
+ `(without-gcing (%call-with-system-spinlock)))
+ ((nil)
+ `(without-interrupts (%call-with-system-spinlock))))))))
+ (def call-with-recursive-system-spinlock)
+ (def call-with-recursive-system-spinlock :without-gcing))