| \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} |