diff options
-rw-r--r-- | sys/include/ape/qlock.h | 2 | ||||
-rw-r--r-- | sys/include/libc.h | 2 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/plan9/qlock.c | 257 | ||||
-rw-r--r-- | sys/src/libc/9sys/qlock.c | 15 |
4 files changed, 9 insertions, 267 deletions
diff --git a/sys/include/ape/qlock.h b/sys/include/ape/qlock.h index efaef0401..30dbcf3a8 100644 --- a/sys/include/ape/qlock.h +++ b/sys/include/ape/qlock.h @@ -13,8 +13,8 @@ typedef struct QLp QLp; struct QLp { int inuse; + int state; QLp *next; - char state; }; typedef diff --git a/sys/include/libc.h b/sys/include/libc.h index 095615ad7..33d0dbaef 100644 --- a/sys/include/libc.h +++ b/sys/include/libc.h @@ -435,8 +435,8 @@ typedef struct QLp QLp; struct QLp { int inuse; + int state; QLp *next; - char state; }; typedef diff --git a/sys/src/ape/lib/ap/plan9/qlock.c b/sys/src/ape/lib/ap/plan9/qlock.c index 3be8dae25..f3386a224 100644 --- a/sys/src/ape/lib/ap/plan9/qlock.c +++ b/sys/src/ape/lib/ap/plan9/qlock.c @@ -22,9 +22,6 @@ static struct { enum { Queuing, - QueuingR, - QueuingW, - Sleeping, }; /* find a free shared memory location to queue ourselves in */ @@ -41,10 +38,10 @@ getqlp(void) abort(); if(_tas(&(p->inuse)) == 0){ ql.p = p; - p->next = nil; break; } } + p->next = nil; return p; } @@ -60,7 +57,6 @@ qlock(QLock *q) return; } - /* chain into waiting list */ mp = getqlp(); p = q->tail; @@ -112,254 +108,3 @@ canqlock(QLock *q) unlock(&q->lock); return 0; } - -#if 0 - -void -rlock(RWLock *q) -{ - QLp *p, *mp; - - lock(&q->lock); - if(q->writer == 0 && q->head == nil){ - /* no writer, go for it */ - q->readers++; - unlock(&q->lock); - return; - } - - mp = getqlp(); - p = q->tail; - if(p == 0) - q->head = mp; - else - p->next = mp; - q->tail = mp; - mp->next = nil; - mp->state = QueuingR; - unlock(&q->lock); - - /* wait in kernel */ - while((*_rendezvousp)(mp, (void*)1) == (void*)~0) - ; - mp->inuse = 0; -} - -int -canrlock(RWLock *q) -{ - lock(&q->lock); - if (q->writer == 0 && q->head == nil) { - /* no writer; go for it */ - q->readers++; - unlock(&q->lock); - return 1; - } - unlock(&q->lock); - return 0; -} - -void -runlock(RWLock *q) -{ - QLp *p; - - lock(&q->lock); - if(q->readers <= 0) - abort(); - p = q->head; - if(--(q->readers) > 0 || p == nil){ - unlock(&q->lock); - return; - } - - /* start waiting writer */ - if(p->state != QueuingW) - abort(); - q->head = p->next; - if(q->head == 0) - q->tail = 0; - q->writer = 1; - unlock(&q->lock); - - /* wakeup waiter */ - while((*_rendezvousp)(p, (void*)0) == (void*)~0) - ; -} - -void -wlock(RWLock *q) -{ - QLp *p, *mp; - - lock(&q->lock); - if(q->readers == 0 && q->writer == 0){ - /* noone waiting, go for it */ - q->writer = 1; - unlock(&q->lock); - return; - } - - /* wait */ - p = q->tail; - mp = getqlp(); - if(p == nil) - q->head = mp; - else - p->next = mp; - q->tail = mp; - mp->next = nil; - mp->state = QueuingW; - unlock(&q->lock); - - /* wait in kernel */ - while((*_rendezvousp)(mp, (void*)1) == (void*)~0) - ; - mp->inuse = 0; -} - -int -canwlock(RWLock *q) -{ - lock(&q->lock); - if (q->readers == 0 && q->writer == 0) { - /* no one waiting; go for it */ - q->writer = 1; - unlock(&q->lock); - return 1; - } - unlock(&q->lock); - return 0; -} - -void -wunlock(RWLock *q) -{ - QLp *p; - - lock(&q->lock); - if(q->writer == 0) - abort(); - p = q->head; - if(p == nil){ - q->writer = 0; - unlock(&q->lock); - return; - } - if(p->state == QueuingW){ - /* start waiting writer */ - q->head = p->next; - if(q->head == nil) - q->tail = nil; - unlock(&q->lock); - while((*_rendezvousp)(p, (void*)0) == (void*)~0) - ; - return; - } - - if(p->state != QueuingR) - abort(); - - /* wake waiting readers */ - while(q->head != nil && q->head->state == QueuingR){ - p = q->head; - q->head = p->next; - q->readers++; - while((*_rendezvousp)(p, (void*)0) == (void*)~0) - ; - } - if(q->head == nil) - q->tail = nil; - q->writer = 0; - unlock(&q->lock); -} - -void -rsleep(Rendez *r) -{ - QLp *t, *me; - - if(!r->l) - abort(); - lock(&r->l->lock); - /* we should hold the qlock */ - if(!r->l->locked) - abort(); - - /* add ourselves to the wait list */ - me = getqlp(); - me->state = Sleeping; - if(r->head == nil) - r->head = me; - else - r->tail->next = me; - me->next = nil; - r->tail = me; - - /* pass the qlock to the next guy */ - t = r->l->head; - if(t){ - r->l->head = t->next; - if(r->l->head == nil) - r->l->tail = nil; - unlock(&r->l->lock); - while((*_rendezvousp)(t, (void*)0x12345) == (void*)~0) - ; - }else{ - r->l->locked = 0; - unlock(&r->l->lock); - } - - /* wait for a wakeup */ - while((*_rendezvousp)(me, (void*)1) == (void*)~0) - ; - me->inuse = 0; -} - -int -rwakeup(Rendez *r) -{ - QLp *t; - - /* - * take off wait and put on front of queue - * put on front so guys that have been waiting will not get starved - */ - - if(!r->l) - abort(); - lock(&r->l->lock); - if(!r->l->locked) - abort(); - - t = r->head; - if(t == nil){ - unlock(&r->l->lock); - return 0; - } - - r->head = t->next; - if(r->head == nil) - r->tail = nil; - - t->next = r->l->head; - r->l->head = t; - if(r->l->tail == nil) - r->l->tail = t; - - t->state = Queuing; - unlock(&r->l->lock); - return 1; -} - -int -rwakeupall(Rendez *r) -{ - int i; - - for(i=0; rwakeup(r); i++) - ; - return i; -} - -#endif diff --git a/sys/src/libc/9sys/qlock.c b/sys/src/libc/9sys/qlock.c index e968080be..ae30b5f36 100644 --- a/sys/src/libc/9sys/qlock.c +++ b/sys/src/libc/9sys/qlock.c @@ -39,10 +39,10 @@ getqlp(void) abort(); if(_tas(&(p->inuse)) == 0){ ql.p = p; - p->next = nil; break; } } + p->next = nil; return p; } @@ -128,12 +128,11 @@ rlock(RWLock *q) mp = getqlp(); p = q->tail; - if(p == 0) + if(p == nil) q->head = mp; else p->next = mp; q->tail = mp; - mp->next = nil; mp->state = QueuingR; unlock(&q->lock); @@ -199,14 +198,13 @@ wlock(RWLock *q) } /* wait */ - p = q->tail; mp = getqlp(); + p = q->tail; if(p == nil) q->head = mp; else p->next = mp; q->tail = mp; - mp->next = nil; mp->state = QueuingW; unlock(&q->lock); @@ -286,7 +284,7 @@ rsleep(Rendez *r) { QLp *t, *me; - if(!r->l) + if(r->l == nil) abort(); lock(&r->l->lock); /* we should hold the qlock */ @@ -300,12 +298,11 @@ rsleep(Rendez *r) r->head = me; else r->tail->next = me; - me->next = nil; r->tail = me; /* pass the qlock to the next guy */ t = r->l->head; - if(t){ + if(t != nil){ r->l->head = t->next; if(r->l->head == nil) r->l->tail = nil; @@ -333,7 +330,7 @@ rwakeup(Rendez *r) * put on front so guys that have been waiting will not get starved */ - if(!r->l) + if(r->l == nil) abort(); lock(&r->l->lock); if(!r->l->locked) |