| \section{\module{mutex} --- | 
 |          Mutual exclusion support} | 
 |  | 
 | \declaremodule{standard}{mutex} | 
 | \sectionauthor{Moshe Zadka}{moshez@zadka.site.co.il} | 
 | \modulesynopsis{Lock and queue for mutual exclusion.} | 
 |  | 
 | The \module{mutex} module defines a class that allows mutual-exclusion | 
 | via acquiring and releasing locks. It does not require (or imply) | 
 | threading or multi-tasking, though it could be useful for | 
 | those purposes. | 
 |  | 
 | The \module{mutex} module defines the following class: | 
 |  | 
 | \begin{classdesc}{mutex}{} | 
 | Create a new (unlocked) mutex. | 
 |  | 
 | A mutex has two pieces of state --- a ``locked'' bit and a queue. | 
 | When the mutex is not locked, the queue is empty. | 
 | Otherwise, the queue contains zero or more  | 
 | \code{(\var{function}, \var{argument})} pairs | 
 | representing functions (or methods) waiting to acquire the lock. | 
 | When the mutex is unlocked while the queue is not empty, | 
 | the first queue entry is removed and its  | 
 | \code{\var{function}(\var{argument})} pair called, | 
 | implying it now has the lock. | 
 |  | 
 | Of course, no multi-threading is implied -- hence the funny interface | 
 | for \method{lock()}, where a function is called once the lock is | 
 | acquired. | 
 | \end{classdesc} | 
 |  | 
 |  | 
 | \subsection{Mutex Objects \label{mutex-objects}} | 
 |  | 
 | \class{mutex} objects have following methods: | 
 |  | 
 | \begin{methoddesc}{test}{} | 
 | Check whether the mutex is locked. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}{testandset}{} | 
 | ``Atomic'' test-and-set, grab the lock if it is not set, | 
 | and return \code{True}, otherwise, return \code{False}. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}{lock}{function, argument} | 
 | Execute \code{\var{function}(\var{argument})}, unless the mutex is locked. | 
 | In the case it is locked, place the function and argument on the queue. | 
 | See \method{unlock} for explanation of when | 
 | \code{\var{function}(\var{argument})} is executed in that case. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}{unlock}{} | 
 | Unlock the mutex if queue is empty, otherwise execute the first element | 
 | in the queue. | 
 | \end{methoddesc} |