The macro
allowing-block-interrupts
executes
body
allowing control over blocking interrupts by current-process-unblock-interrupts and current-process-unblock-interrupts.
Within the dynamic scope of
allowing-block-interrupts
, you can switch the blocking of interrupts on and off. Blocking interrupts prevents any interruption of the current process, including process-interrupt, process-kill, process-reset, process-break and process-stop. These interrupts are all queued and processed once interrupts become unblocked.
Blocking interrupts also blocks interrupts due to UNIX interrupts. Such interrupts are processed either by another Lisp thread, or once interrupts become unblocked.
If
start-blocked
is true,
allowing-block-interrupts
blocks interrupts on entry. If
start-blocked
is false, the state does not change on entry. If you want to ensure that the initial forms of
allowing-block-interrupts
are interruptible even if it is inside the scope of another
allowing-block-interrupts
, you need to explicitly call current-process-unblock-interrupts on entry.
allowing-block-interrupts
can be used recursively.
In compiled code,
allowing-block-interrupts
with a true value of the
start-blocked
argument is guaranteed not to process interrupts before an explicit change to the blocking state (that includes exiting the scope of
allowing-block-interrupts
). In particular, if the first cleanup form of an
unwind-protect
is a call to
allowing-block-interrupts
, it is guaranteed to execute without interrupts on exit from the protected form. No such guarantee is given in interpreted code.
On exit from
allowing-block-interrupts
, the current state of interrupt blocking and whether there is a surrounding use of
allowing-block-interrupts
or with-interrupts-blocked is restored to the state that existed on entry.
current-process-block-interrupts
current-process-unblock-interrupts
process-break
process-interrupt
process-kill
process-reset
process-stop
with-interrupts-blocked