diff options
author | rsc <devnull@localhost> | 2004-05-23 00:59:33 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-05-23 00:59:33 +0000 |
commit | 6c7460701e7896446d0fb14bf9b24f258c61b6a6 (patch) | |
tree | acef0957312b0687ccb71662ddd56bf6d8182d20 /src/lib9/qlock.c | |
parent | a09e80f9c414ffc815641d49836be3a2a6a07800 (diff) | |
download | plan9port-6c7460701e7896446d0fb14bf9b24f258c61b6a6.tar.gz plan9port-6c7460701e7896446d0fb14bf9b24f258c61b6a6.tar.bz2 plan9port-6c7460701e7896446d0fb14bf9b24f258c61b6a6.zip |
various bug fixes and paranoia
Diffstat (limited to 'src/lib9/qlock.c')
-rw-r--r-- | src/lib9/qlock.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/lib9/qlock.c b/src/lib9/qlock.c index 00bbcc7d..d83a4b7f 100644 --- a/src/lib9/qlock.c +++ b/src/lib9/qlock.c @@ -13,6 +13,7 @@ enum QueuingR, QueuingW, Sleeping, + Waking, }; static ulong (*_rendezvousp)(ulong, ulong) = rendezvous; @@ -74,6 +75,7 @@ qlock(QLock *q) /* wait */ while((*_rendezvousp)((ulong)mp, 1) == ~0) ; + assert(mp->state == Waking); mp->inuse = 0; } @@ -90,6 +92,7 @@ qunlock(QLock *q) if(q->head == nil) q->tail = nil; unlock(&q->lock); + p->state = Waking; while((*_rendezvousp)((ulong)p, 0x12345) == ~0) ; return; @@ -139,6 +142,7 @@ rlock(RWLock *q) /* wait in kernel */ while((*_rendezvousp)((ulong)mp, 1) == ~0) ; + assert(mp->state == Waking); mp->inuse = 0; } @@ -180,6 +184,7 @@ runlock(RWLock *q) unlock(&q->lock); /* wakeup waiter */ + p->state = Waking; while((*_rendezvousp)((ulong)p, 0) == ~0) ; } @@ -212,6 +217,7 @@ wlock(RWLock *q) /* wait in kernel */ while((*_rendezvousp)((ulong)mp, 1) == ~0) ; + assert(mp->state == Waking); mp->inuse = 0; } @@ -251,6 +257,7 @@ wunlock(RWLock *q) if(q->head == nil) q->tail = nil; unlock(&q->lock); + p->state = Waking; while((*_rendezvousp)((ulong)p, 0) == ~0) ; return; @@ -266,6 +273,7 @@ wunlock(RWLock *q) p = q->head; q->head = p->next; q->readers++; + p->state = Waking; while((*_rendezvousp)((ulong)p, 0) == ~0) ; } @@ -308,6 +316,7 @@ rsleep(Rendez *r) if(r->l->head == nil) r->l->tail = nil; unlock(&r->l->lock); + t->state = Waking; while((*_rendezvousp)((ulong)t, 0x12345) == ~0) ; }else{ @@ -318,6 +327,7 @@ rsleep(Rendez *r) /* wait for a wakeup */ while((*_rendezvousp)((ulong)me, 0x23456) == ~0) ; + assert(me->state == Waking); me->inuse = 0; if(!r->l->locked){ fprint(2, "rsleep: not locked after wakeup\n"); |