## Signals

### Signals Reference

#### `ext:with-interrupts`

Execute code with interrupts optionally enabled.

##### Macro

            ext:with-interrupts
            &body; body

##### Description

Executes the given body with all interrupts enabled. Since interrupts are normally enabled, this macro only makes sense if there is an outer `ext:without-interrupts` with a corresponding `ext:allow-with-interrupts`: interrupts are not enabled if any outer `mp:without-interrupts` is not accompanied by `mp:allow-with-interrupts`.

#### `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 ...)))