In my last blog post, I presented the idea of an Application Locking Mechanism. The features that we want to support are:
1) Multiple readers.
2) Zero or one writers.
3) Multiple readers and writers without data corruption.
4) Wait fairness.
5) Ensure lock/unlock sanity.
6) Speed.
So here is the prototype of what we want to do:
//
// The lock structure.
//
struct lock_t
{
uintmagic; // lock magic number
uintmutex; // protects this data structure
intqueue[LOCK_QUEUE_SIZE]; // queue of users
inthead; // start of queue
inttail; // end of queue
};
//
// proc = init_lock.
// return = void.
// param lock = struct lock_t * : lock structure.
//
// Initialize a lock structure.
//
void init_lock (struct lock_t *lock);
//
// proc = check_lock.
// return = void.
// param lock = struct lock_t * : lock structure.
//
// Sanity check a lock structure.
//
void check_lock (struct lock_t *lock);
//
// proc = queue_add.
// return = int : the queue index for this item.
// param lock = struct lock_t * : lock structure.
// param type = int : lock type (LOCK_READ or LOCK_WRITE).
//
// Add an item to a lock queue.
//
int queue_add (struct lock_t *lock, int type);
//
// proc = queue_del.
// return = void.
// param lock = struct lock_t * : lock structure.
// param index = int : queue index.
//
// Removed an item from a lock queue.
//
void
queue_del (struct lock_t *lock, int index);
//
// proc = read_lock.
// return = int : queue index for token.
// param lock = struct lock_t * : lock structure.
//
// Perform a Read Lock.
//
int
read_lock (struct lock_t *lock);
//
// proc = read_unlock.
// return = void.
// param lock = struct lock_t * : lock structure.
// param index = int : queue index – return from read_lock().
//
// Perform a Read Unlock.
//
void read_unlock (struct lock_t *lock, int index);
//
// proc = write_lock.
// return = int : queue index for token.
// param lock = struct lock_t * : lock structure.
//
// Perform a Write Lock.
//
int write_lock (struct lock_t *lock);
//
// proc = write_unlock.
// return = void.
// param lock = struct lock_t * : lock structure.
// param index = int : queue index – return from write_lock().
//
// Perform a Write Unlock.
//
void write_unlock (struct lock_t *lock, int index);
That is all for this post. In my next post, I will present the full implementation.