[Home] [Groups] - Message: [Prev in Group] [Next in Group]
7301: [MUD-Dev] Re: META: who are we?
[Full Header] [Plain Text]
From: Petri Virkkula <pvirkkul@iki.fi>
Newsgroups: nu.kanga.list.mud-dev
Date: Wed, 23 Sep 1998 04:19:35 +0300 (EEST)
References: [1] [2] [3] <-newest
Organization: Kanga.Nu
>>>>> "JCL" == J C Lawrence <claw@under.engr.sgi.com> writes:
JCL> Ditto. I would that I had the time right now. My old question
JCL> concerning lightweight locking supports is still out there
JCL> (http://www.kanga.nu/~petidomo/lists/mud-dev/1998Q3/msg00467.html).
JCL> I haven't had time to get much beyond that.
I don't see why the virtualized semaphore idea wouldn't work
if the implementation were slightly modified. See code below
for detail how I suggest to be changed.
As I see performance of the code below depends on value of
MAX_LOCKS and implementation of HASH() and both can be
modified based after you have studied the locking pattern of
your code.
Petri
--- cut here ---
typedef struct {
pthread_mutex_t mutex;
pthread_cond_t cond;
} lock_entry_t;
typedef struct {
unsigned short is_locked;
unsigned short sleeper_count;
} lock_data_t;
typedef struct {
...
lock_data_t lock_data;
...
} object_t;
static lock_entry_t lock_table[MAX_LOCKS];
#define HASH(ptr, size, max) \
((((unsigned long)(ptr)) / (size)) % (max))
void
lock_object (object_t *ob)
{
unsigned int ix = HASH(ob, sizeof(object_t), MAX_LOCKS);
pthread_mutex_lock (&lock_table[ix].mutex);
while (ob->lock_data.is_locked) {
ob->lock_data.sleeper_count++;
pthread_cond_wait (&lock_table[ix].cond, &lock_table[ix].mutex);
ob->lock_data.sleeper_count--;
}
ob->lock_data.is_locked = 1;
pthread_mutex_unlock (&lock_table[ix].mutex);
}
void
unlock_object (object_t *ob)
{
unsigned int ix = HASH(ob, sizeof(object_t), MAX_LOCKS);
pthread_mutex_lock (&lock_table[ix].mutex);
ob->lock_data.is_locked = 0;
if (ob->lock_data.sleeper_count)
pthread_cond_signal (&lock_table[ix].cond);
pthread_mutex_unlock (&lock_table[ix].mutex);
}
--- cut here ---