ABILOCK(3X) ABILOCK(3X)
init_lock, acquire_lock, release_lock, stat_lock, spin_lock - ABI mutual
exclusion primitives
#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);
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.
Page 1
ABILOCK(3X) ABILOCK(3X)
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.
nanosleep(2), sginap(2), usinit(3P).
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.
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 sginapcquire_lock.
Even though stat_lock returns status indicating that the lock is
available, a call to acquire_lock could still fail.
PPPPaaaaggggeeee 2222 [ Back ]
|