linux-c-programming.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Need to implement
@ 2003-09-08 12:13 Harmeet Uppal
  2003-09-08 15:08 ` Mariano Moreyra
  2003-09-10 20:53 ` Steven
  0 siblings, 2 replies; 3+ messages in thread
From: Harmeet Uppal @ 2003-09-08 12:13 UTC (permalink / raw)
  To: linux-c-programming

Hi All,

Any clues how to implement a Read-Write lock on Linux using write
preference.

Thanks,
Harmeet

^ permalink raw reply	[flat|nested] 3+ messages in thread

* RE: Need to implement
  2003-09-08 12:13 Need to implement Harmeet Uppal
@ 2003-09-08 15:08 ` Mariano Moreyra
  2003-09-10 20:53 ` Steven
  1 sibling, 0 replies; 3+ messages in thread
From: Mariano Moreyra @ 2003-09-08 15:08 UTC (permalink / raw)
  To: 'Harmeet Uppal', linux-c-programming

Hi Harmeet...
What do you mean with "using write preference" ??


-----Mensaje original-----
De: linux-c-programming-owner@vger.kernel.org
[mailto:linux-c-programming-owner@vger.kernel.org]En nombre de Harmeet
Uppal
Enviado el: Lunes, 08 de Septiembre de 2003 09:14
Para: linux-c-programming@vger.kernel.org
Asunto: Need to implement


Hi All,

Any clues how to implement a Read-Write lock on Linux using write
preference.

Thanks,
Harmeet
-
To unsubscribe from this list: send the line "unsubscribe
linux-c-programming" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Need to implement
  2003-09-08 12:13 Need to implement Harmeet Uppal
  2003-09-08 15:08 ` Mariano Moreyra
@ 2003-09-10 20:53 ` Steven
  1 sibling, 0 replies; 3+ messages in thread
From: Steven @ 2003-09-10 20:53 UTC (permalink / raw)
  To: Harmeet Uppal; +Cc: linux-c-programming

[-- Attachment #1: Type: text/plain, Size: 3689 bytes --]

> Any clues how to implement a Read-Write lock on Linux using write
> preference.
From memory, the standard implementation on top of mutexes and
condition variables goes a bit like this:

struct biassed_lock {
	mutex lock;                 /* Lock to protect the other
				       fields of this structure. */
	int num_writers_waiting;
	int num_readers_waiting;
	int num_readers_active;
	int num_writers_active;
	pthread_cond_t event_object;
};

void write_lock(struct biassed_lock *bl)
{
	lock(bl->lock);
	bl->num_writers_waiting++;
	while (bl->num_readers_active || bl->num_writers_active)
		pthread_cond_wait(bl->event_object, bl->lock);
	bl->num_writers_waiting--;
	bl->num_writers_active++;
	unlock(bl->lock);
}

void read_lock(struct biassed_lock *bl)
{
	lock(bl->lock);
	bl->num_readers_waiting++;
	while (bl->num_writers_active || bl->num_writers_waiting)
		pthread_cond_wait(bl->event_object, bl->lock);
	bl->num_readers_active++;
	bl->num_readers_waiting--;
	unlock(bl->lock);
}

void upgrade_lock(struct biassed_lock *bl)
{
	lock(bl->lock);
	bl->num_writers_waiting++;
	assert(bl->num_writers_active == 0);
	while (bl->num_readers_active > 1)
		pthread_cond_wait(bl->event_object, bl->lock);
	assert(bl->num_writers_active == 0);
	bl->num_writers_active++;
	bl->num_readers_active--;
	bl->num_readers_waiting--;
	unlock(bl->lock);
}

void write_unlock(struct biassed_lock *bl)
{
	lock(bl->lock);
	bl->num_writers_active--;
	pthread_cond_broadcast(bl->event_object);
	unlock(bl->lock);
}

void read_unlock(struct biassed_lock *bl)
{
	lock(bl->lock);
	bl->num_readers_active--;
	pthread_cond_broadcast(bl->event_object);
	unlock(bl->lock);
}

Internally, the behaviour is roughly this:

1) Unless bl->lock is held:
   a) bl->num_readers_active is the number of threads currently
   holding a read lock on bl.
   b) bl->num_readers_waiting is the number of threads currently
   waiting for a read lock on bl.
   c) bl->num_writers_active is the number of threads currently
   holding a write lock on bl (either 0 or 1).
   d) bl->num_writers_waiting is the number of threads currently
   waiting for a write lock on bl.
2) num_{readers,writers}_{active,waiting} are only ever modified with
   the lock held.
3) event_object is signalled whenever bl->num_writers_active or
   bl->num_readers_active decreases.

Externally, a biassed_lock behaves like this:

4) If a thread enters write_lock while a read lock is in place,
   it will block until the read lock is removed.
5) If a thread enters write_lock while a write lock is in place,
   it will block until the write lock is removed.
6) If a thread enters read_lock while a write lock is in place or
   while another thread is waiting for a write lock, it will
   block until those write locks have been acquired and released.
7) If a thread enters write_unlock with other threads blocked
   trying to acquire a write lock, it will unblock precisely one
   of those.  Otherwise, if there are threads trying to acquire
   a read lock, it will unblock all of those.  Otherwise, it
   just marks the lock as available.
8) If a thread enters read_unlock with other threads blocked
   trying to acquire a write lock, and it is the last thread to
   hold a read lock, it will unblock precisely one of the threads
   trying to get the write lock.
9) If a thread holds a read lock, then calling upgrade_lock(bl) is
   equivalent to calling read_unlock(bl); write_lock(bl);, except
   that it is atomic.


It's been a while since I've needed to do anything like this, though,
so test thoroughly...

Steven Smith,
sos22@cam.ac.uk.

[-- Attachment #2: Type: application/pgp-signature, Size: 187 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2003-09-10 20:53 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-09-08 12:13 Need to implement Harmeet Uppal
2003-09-08 15:08 ` Mariano Moreyra
2003-09-10 20:53 ` Steven

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).