- (macrolet ((def (name &optional variant)
- `(defun ,(if variant (symbolicate name "/" variant) name) (function mutex)
- (declare (function function))
- (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))))))
- (declare (inline %call-with-system-mutex))
- ,(ecase variant
- (:without-gcing
- `(without-gcing (%call-with-system-mutex)))
- (:allow-with-interrupts
- `(without-interrupts (allow-with-interrupts (%call-with-system-mutex))))
- ((nil)
- `(without-interrupts (%call-with-system-mutex))))))))
- (def call-with-system-mutex)
- (def call-with-system-mutex :without-gcing)
- (def call-with-system-mutex :allow-with-interrupts))
-
- (defun call-with-system-spinlock (function spinlock)
- (declare (function function))
- (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))
-
- (defun call-with-spinlock (function spinlock)
- (declare (function function))
- (dx-let ((got-it nil))
- (without-interrupts
- (unwind-protect
- (when (setf got-it (allow-with-interrupts
- (get-spinlock spinlock)))
- (with-local-interrupts (funcall function)))
- (when got-it
- (release-spinlock spinlock))))))
-
- (defun call-with-mutex (function mutex value waitp)