with-lock

Das Macro with-lock verwendet eine Sperre (siehe make-lock), um Ausdrücke vor mehrfachen gleichzeitigen Ausführungen zu schützen.

Alle Argumente des Macros werden ausgewertet. Beim ersten Argument muss es sich um eine Sperre handeln. Die weiteren Argumente werden unter gegenseitigen Ausschluss von Threads sequentiell abgearbeitet. Der Wert des letzten Ausdrucks wird zum Wert des Aufrufs von with-lock.

Das Macro basiert auf progn, acquire-lock, ensure und release-lock sowie auf quasi-quote, let, gensym, first, rest und cons:

(setq with-lock
  (let
    ((lock (gensym)))
    (mlambda args
      (quasi-quote
        (let
          (((unquote lock) (unquote (first args))))
          (progn
            (acquire-lock (unquote lock))
            (ensure
              (unquote (cons progn (rest args)))
              (release-lock (unquote lock)))))))))