Annotation of lucent/sys/src/9/port/qlock.c, revision 1.1

1.1     ! root        1: #include "u.h"
        !             2: #include "../port/lib.h"
        !             3: #include "mem.h"
        !             4: #include "dat.h"
        !             5: #include "fns.h"
        !             6: 
        !             7: 
        !             8: void
        !             9: qlock(QLock *q)
        !            10: {
        !            11:        Proc *p, *mp;
        !            12: 
        !            13:        if(u)
        !            14:                u->p->qlockpc = getcallerpc(((uchar*)&q) - sizeof(q));
        !            15: 
        !            16:        lock(&q->use);
        !            17:        if(!q->locked) {
        !            18:                q->locked = 1;
        !            19:                unlock(&q->use);
        !            20:                return;
        !            21:        }
        !            22:        p = q->tail;
        !            23:        mp = u->p;
        !            24:        if(p == 0)
        !            25:                q->head = mp;
        !            26:        else
        !            27:                p->qnext = mp;
        !            28:        q->tail = mp;
        !            29:        mp->qnext = 0;
        !            30:        mp->state = Queueing;
        !            31:        unlock(&q->use);
        !            32:        sched();
        !            33: }
        !            34: 
        !            35: int
        !            36: canqlock(QLock *q)
        !            37: {
        !            38:        if(!canlock(&q->use))
        !            39:                return 0;
        !            40: 
        !            41:        if(q->locked){
        !            42:                unlock(&q->use);
        !            43:                return 0;
        !            44:        }
        !            45:        if(u)
        !            46:                u->p->qlockpc = getcallerpc(((uchar*)&q) - sizeof(q));
        !            47:        q->locked = 1;
        !            48:        unlock(&q->use);
        !            49:        return 1;
        !            50: }
        !            51: 
        !            52: void
        !            53: qunlock(QLock *q)
        !            54: {
        !            55:        Proc *p;
        !            56: 
        !            57:        if(u)
        !            58:                u->p->qlockpc = 0;
        !            59:        lock(&q->use);
        !            60:        p = q->head;
        !            61:        if(p) {
        !            62:                q->head = p->qnext;
        !            63:                if(q->head == 0)
        !            64:                        q->tail = 0;
        !            65:                unlock(&q->use);
        !            66:                ready(p);
        !            67:                return;
        !            68:        }
        !            69:        q->locked = 0;
        !            70:        unlock(&q->use);
        !            71: }
        !            72: 
        !            73: void
        !            74: rlock(RWlock *l)
        !            75: {
        !            76:        qlock(&l->x);           /* wait here for writers and exclusion */
        !            77:        lock(l);
        !            78:        l->readers++;
        !            79:        canqlock(&l->k);        /* block writers if we are the first reader */
        !            80:        unlock(l);
        !            81:        qunlock(&l->x);
        !            82: }
        !            83: 
        !            84: void
        !            85: runlock(RWlock *l)
        !            86: {
        !            87:        lock(l);
        !            88:        if(--l->readers == 0)   /* last reader out allows writers */
        !            89:                qunlock(&l->k);
        !            90:        unlock(l);
        !            91: }
        !            92: 
        !            93: void
        !            94: wlock(RWlock *l)
        !            95: {
        !            96:        qlock(&l->x);           /* wait here for writers and exclusion */
        !            97:        qlock(&l->k);           /* wait here for last reader */
        !            98: }
        !            99: 
        !           100: void
        !           101: wunlock(RWlock *l)
        !           102: {
        !           103:        qunlock(&l->x);
        !           104:        qunlock(&l->k);
        !           105: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.