Macro | Package: mp | ToC | DocOverview | CGDoc | RelNotes | FAQ | Index | PermutedIndex
| Allegro CL version 9.0 Unrevised from 8.2 to 9.0. 8.2 version

## with-sharable-lock

Arguments: (mode lock &key recursive-p yield-rate timeout timeout-body) &body body

Evaluate a body of code in the context of a `sharable-lock` acquired in the specified mode. This macro allows more control of the behavior than with-shared-lock or with-exclusive-lock and the values returned by this macro (the value of the last body form when the lock is successfully acquired) is consistent with other with-XXX macros in Common Lisp, unlike with-shared-lock or with-exclusive-lock which return `t`.

This macro is in the `smputil` module and may not be included in the image util `(require :smputil)` is evaluated.

The mode argument must evaluate to one of the keywords `:exclusive` or `:shared`.

The lock argument must evaluate to an instance of `sharable-lock`.

The yield-rate argument, if specified, must evaluate to a positive integer, or the keyword `:never`. The specified value overrides the value in the lock instance. If the argument is omitted, or specified as `nil`, than the value in the lock instance is used.

The timeout argument, if specified, must evaluate to `nil` or a number of seconds. The value determines how long the program will wait if the lock is not immediately available. A timeout value of zero (or a negative value) specifies that the lock must be available immediately.

The recursive-p argument can be used to override the recursive-p specification in the `sharable-lock` instance. See make-sharable-lock.

The body expressions are evaluated as a progn body and the returned values are the values of the progn when the lock is successfully acquired. (The return values when the lock is not acquired are described below.)

The timeout-body argument specified the behavior when a timout is requested. The timeout-body argument must be a list of expressions beginning with `nil` or a bound variable list. The default timeout behavior is `((x) (values nil x))`

If a timeout occurs, or when timout is zero or negative and the lock is not available immediately, the first variable in the list of bound variables is bound to the reason for the timeout and the remainder of the timout-body is evaluated as a let body. The values returned by the timeout-body forms are the values returned from the with-sharable-lock form. In the event of a true timeout, the reason is always :timeout, but when timout is zero or negative, the reason may be one of the keywords returned by sharable-lock-lock.

If the timeout does not occur, the timeout-body argument is never evaluated, and the values of the body forms are returned.

See Sharable locks in smp.htm.

See multiprocessing.htm for general information on multiprocessing in Allegro CL.

Copyright (c) 1998-2019, Franz Inc. Oakland, CA., USA. All rights reserved.
This page was not revised from the 8.2 page.
Created 2012.5.30.

|  | ToC | DocOverview | CGDoc | RelNotes | FAQ | Index | PermutedIndex
| Allegro CL version 9.0 Unrevised from 8.2 to 9.0. 8.2 version