critical-section

Arguments:
(&key block non-smp)
&body body

This macro expands into code that uses a unique basic-lock associated with
the expansion to control execution of the body code. Only one process at a
time can acquire ownership of the lock and execute the forms in body.
Ownership of the lock is relinquished when control leaves body by falling
through or by non-local exit. The result of evaluating the critical-section
code is the result of the last form in body.

The arguments are:

block: used for special internal
functions. Users should not specify a value for this argument.

non-smp: what code to generate in a
non-smp lisp. Legal values are:

:without-scheduling: to get the equivalent of
(mp:without-scheduling . body)

:without-interrupts: to get the equivalent of
(excl:without-interrupts . body)

:atomically: to get the equivalent of
(excl::atomically . body)

[omitted]: to get object-locking code like SMP.
This may be inefficient or even
problematic in a non-SMP Lisp.