LOCK(2)                                                   LOCK(2)

     NAME
          lock - thread locking.

     SYNOPSIS
          include "lock.m";
          lock := load Lock Lock->PATH;
          Semaphore: adt {
               obtain: fn(s: self ref Semaphore);
               release: fn(s: self ref Semaphore);
               new: fn(): ref Semaphore;
          };
          init: fn();

     DESCRIPTION
          Lock provides semaphore-based mutual exclusion.  Init must
          be called before creating any locks.

          Semaphore.new()
               Creates and returns a reference to a new Semaphore
               (lock).

          s.obtain()
               Obtains exclusive access to the lock s. It will block
               until it can do so.

          s.release()
               Releases access to the lock s and allows processes
               waiting on it to proceed.

     EXCEPTIONS
          If lock allocation fails, a ``lock alloc'' exception is
          raised.

     SOURCE
          /appl/lib/lock.b

     BUGS
          The current implementation uses a pipe and thus two file
          descriptors for every lock.  On the other hand, when a pro-
          cess exists, garbage collection of file descriptors ensures
          that locks are relinquished.

     Page 1                       Plan 9            (printed 12/21/24)