|
OpenAFS
OpenAFS distributed network file system
|
Locks hang off of each transaction, with all the transaction hanging off of the appropriate dbase. More...
#include <afsconfig.h>#include <afs/param.h>#include <roken.h>#include <afs/opr.h>#include <lock.h>#include "ubik.h"#include "ubik_int.h"Defines | |
| #define | UBIK_INTERNALS 1 |
| #define | WouldReadBlock(lock) ((((lock)->excl_locked & WRITE_LOCK) || (lock)->wait_states) ? 0 : 1) |
| #define | WouldWriteBlock(lock) ((((lock)->excl_locked & WRITE_LOCK) || (lock)->readers_reading) ? 0 : 1) |
Functions | |
| void | ulock_Init (void) |
| locks | |
| int | ulock_getLock (struct ubik_trans *atrans, int atype, int await) |
| Set a transaction lock. | |
| void | ulock_relLock (struct ubik_trans *atrans) |
| Release the transaction lock. | |
| void | ulock_Debug (struct ubik_debug *aparm) |
| debugging hooks | |
Variables | |
| struct Lock | rwlock |
Locks hang off of each transaction, with all the transaction hanging off of the appropriate dbase.
This package expects to be used in a two-phase locking protocol, so it doesn't provide a way to release anything but all of the locks in the transaction.
At present, it doesn't support the setting of more than one byte-position lock at a time, that is the length field must be 1. This doesn't mean that a single transaction can't set more than one lock, however.
It is the responsibility of the user to avoid deadlock by setting locks in a partial order.
#EWOULDBLOCK has been replaced in this file by #EAGAIN. Many Unix's but not all (eg. HP) do not replace #EWOULDBLOCK with #EAGAIN. The bad news is this goes over the wire. The good news is that the code path is never triggered as it requires ulock_getLock to be called with await = 0. And ulock_SetLock isn't even used in this code base. Since NT doesn't have a native #EAGAIN, we are replacing all instances of #EWOULDBLOCK with #EAGAIN.
| int ulock_getLock | ( | struct ubik_trans * | atrans, |
| int | atype, | ||
| int | await | ||
| ) |
Set a transaction lock.
| atype | is #LOCKREAD or #LOCKWRITE. |
| await | is TRUE if you want to wait for the lock instead of returning #EWOULDBLOCK. |