Tasks make updates requested by calling tasks to a shared resource serially
in a first come first served manner, atomically, but not necessarily
synchronously, such that a current task holding an exclusive lock on the
shared resource makes the updates on behalf of one or more calling tasks
queued on the lock. Updates waiting in a queue on the lock to the shared
resource may be made while the lock is held, and others deferred for post
processing after the lock is released. Some update requests may also, at
the calling application's option, be executed synchronously. Provision is
made for nested asynchronous locking. Data structures (wait_elements)
describing update requests may queued in a wait queue for update requests
awaiting execution by a current task, other than the calling task,
currently holding an exclusive lock on the shared resource. Other queues
are provided for queuing data structures removed from the wait queue but
not yet processed; data structures for requests to unlock or downgrade a
lock; data structures for requests which have been processed and need to
be returned to free storage; and data structures for requests that need to
be awakened or that describe post processing routines that are to be run
while the lock is not held.