abilock(3X)

init_lock, acquire_lock, release_lock, stat_lock, spin_lock - ABI mutual exclusion primitives

As shipped in IRIX 6.5.15. Unchanged since IRIX 6.5.

NAME
     init_lock, acquire_lock, release_lock, stat_lock, spin_lock - ABI mutual
     exclusion primitives

SYNOPSIS
     #include <abi_mutex.h>

     int init_lock(abilock_t *lck);

     int acquire_lock(abilock_t *lck);

     int release_lock(abilock_t *lck);

     int stat_lock(abilock_t *lck);

     void spin_lock(abilock_t *lck);

DESCRIPTION
     These routines provide a simple, standard interface to base level mutual
     exclusion primitives.  They are found in the library ``libmutex.so'', and
     is loaded if the option ``-lmutex'' is used with cc(1) or ld(1).

     The parameter lck must point to memory shared by all processes wishing to
     acquire or test the lock.

     The contents of the structure abilock_t are as follows:
          typedef struct {
               unsigned int abi_lock;
          } abilock_t;

     The function init_lock must be called on a lock before any of the other
     functions.  It initializes the lock to an unlocked state.  A non-zero
     return status will indicate an error.

     acquire_lock tries once to acquire the lock referenced by lck.  It
     returns zero if the lock was acquired, otherwise non-zero.  acquire_lock
     can always fail, even if it is known that the lock is free and there is
     only one process, this implies that acquire_lock should always be called
     in a loop.

     spin_lock will always acquire the lock. If the lock is not immediately
     available, the calling process will either spin (busy-wait) or be
     suspended until the lock becomes available.  There is no implied policy
     as to which (if there is more than one) waiting process will be granted
     the lock.

     stat_lock returns the current state of the lock referenced by lck without
     attempting to acquire the lock.  It returns UNLOCKED if the lock is free,
     otherwise LOCKED.
     release_lock unconditionally releases the lock pointed to by lck.  The
     ability for one process to release the lock of another process is
     permitted.  A non-zero return status will indicate an error.

     These routines will work for locks shared between 32-bit and 64-bit user
     programs.

SEE ALSO
     nanosleep(2), sginap(2), usinit(3P).

DIAGNOSTICS
     init_lock, acquire_lock, and release_lock return 0 if the operation was a
     success, otherwise a non-zero value.  spin_lock returns no value.

WARNINGS
     No locks are ever freed automatically by the system.  Locks acquired by a
     process that terminates remain locked.

     Since looping is necessary when attempting to acquire a lock using
     acquire_lock, the user process could find itself in a long busy-wait
     loop.  To avoid wasting CPU cycles, programs should implement some kind
     of back-off strategy, perhaps calling sginap(2) or nanosleep(2) after
     some number of unsuccessful calls to acquire_lock.

     Even though stat_lock returns status indicating that the lock is
     available, a call to acquire_lock could still fail.