Name

ext:without-interrupts — Execute code without being interrupted.

Macro

(ext:without-interrupts &body body)

Description

Executes the given body with all interrupts disabled. This macro is compatible with the one in SBCL and as such it also defines three other local macros ext:allow-with-interrupts, ext:with-local-interrupts and ext:with-restored-interrupts.

Deferrable interrupts include most blockable POSIX signals, and mp:interrupt-process. Does not interfere with garbage collection, and does not inhibit scheduling of other threads.

This macro binds allow-with-interrupts, with-local-interrupts and with-restored-interrupts as a local macros.

ext:with-restored-interrupts executes the body with interrupts enabled if and only if the ext:without-interrupts was in an environment in which interrupts were allowed.

ext:allow-with-interrupts allows the ext:with-interrupts to take effect during the dynamic scope of its body, unless there is an outer ext:without-interrupts without a corresponding ext:allow-with-interrupts.

ext:with-local-interrupts executes its body with interrupts enabled provided that for there is an ext:allow-with-interrupts for every ext:without-interrupts surrounding the current one. ext:with-local-interrupts is equivalent to:

  (allow-with-interrupts (with-interrupts ...))

Care must be taken not to let either ext:allow-with-interrupts or ext:with-local-interrupts appear in a function that escapes from inside the ext:without-interrupts in:

  (without-interrupts
    ;; The body of the lambda would be executed with WITH-INTERRUPTS allowed
    ;; regardless of the interrupt policy in effect when it is called.
    (lambda () (allow-with-interrupts ...)))

  (without-interrupts
    ;; The body of the lambda would be executed with interrupts enabled
    ;; regardless of the interrupt policy in effect when it is called.
    (lambda () (with-local-interrupts ...)))