Annotation of researchv9/cmd/cfront/libC/task/qtail.c, revision 1.1

1.1     ! root        1: #include "task.h"
        !             2: 
        !             3: /* construct qtail <--> oqueue */
        !             4: qtail.qtail(int mode, int max) : (QTAIL)
        !             5: {
        !             6:        if (0 < max) {
        !             7:                qt_queue = new class oqueue(max);
        !             8:                qt_queue->q_tail = this;
        !             9:        };
        !            10:        qt_mode = mode;
        !            11: }
        !            12: 
        !            13: /* destroy q if not also pointed to by a qhead */
        !            14: qtail.~qtail()
        !            15: {
        !            16:        oqueue* q = qt_queue;
        !            17: 
        !            18:        if (q->q_head)
        !            19:                q->q_tail = 0;
        !            20:        else
        !            21:                delete q;
        !            22: }
        !            23: 
        !            24: 
        !            25: /* insert object at rear of q (becoming new value of oqueue->q_ptr) */
        !            26: int qtail.put(object* p)
        !            27: {
        !            28:        register oqueue* q = qt_queue;
        !            29: ll:
        !            30:        if (p->o_next) task_error(E_PUTOBJ,this);
        !            31: 
        !            32:        if (q->q_count < q->q_max) {
        !            33:                if (q->q_count++) {
        !            34:                        register object* oo = q->q_ptr;
        !            35:                        p->o_next = oo->o_next;
        !            36:                        q->q_ptr = oo->o_next = p;
        !            37:                }
        !            38:                else {
        !            39:                        qhead* h = q->q_head;
        !            40:                        q->q_ptr = p->o_next = p;
        !            41:                        if (h) h->alert();
        !            42:                }
        !            43:                return 1;
        !            44:        }
        !            45: 
        !            46:        switch (qt_mode) {
        !            47:        case WMODE:
        !            48:                remember(thistask);
        !            49:                thistask->sleep();
        !            50:                forget(thistask);
        !            51:                goto ll;
        !            52:        case EMODE:
        !            53:                task_error(E_PUTFULL,this);
        !            54:                goto ll;
        !            55:        case ZMODE:
        !            56:                return 0;
        !            57:        }
        !            58: }
        !            59: 
        !            60: 
        !            61: /* create head for this q */
        !            62: qhead* qtail.head()
        !            63: {
        !            64:        oqueue* q = qt_queue;
        !            65:        register qhead* h = q->q_head;
        !            66: 
        !            67:        if (h == 0) {
        !            68:                h = new qhead(qt_mode,0);
        !            69:                q->q_head = h;
        !            70:                h->qh_queue = q;
        !            71:        };
        !            72: 
        !            73:        return h;
        !            74: }
        !            75: 
        !            76: 
        !            77: /* result:  ?qhead<-->? oldq<-->(new)qtail  newq<-->(this)qtail */
        !            78: qtail* qtail.cut()
        !            79: {
        !            80:        oqueue* oldq = qt_queue;
        !            81:        qtail* t = new qtail(qt_mode,oldq->q_max);
        !            82:        oqueue* newq = t->qt_queue;
        !            83: 
        !            84:        t->qt_queue = oldq;
        !            85:        oldq->q_tail = t;
        !            86: 
        !            87:        newq->q_tail = this;
        !            88:        qt_queue = newq;
        !            89: 
        !            90:        return t;
        !            91: }
        !            92: 
        !            93: 
        !            94: /* this qtail is supposed to be downstream from the qhead h */
        !            95: void qtail.splice(qhead* h)
        !            96: {
        !            97:        h->splice(this);
        !            98: }
        !            99: 
        !           100: 
        !           101: void qtail.print(int n)
        !           102: {
        !           103:        int m = qt_queue->q_max;
        !           104:        int c = qt_queue->q_count;
        !           105:        class qhead * h = qt_queue->q_head;
        !           106: 
        !           107:        printf("qtail (%d): mode=%d, max=%d, space=%d, head=%d\n",
        !           108:                this,qt_mode,m,m-c,h);
        !           109: 
        !           110:        if (n&VERBOSE) {
        !           111:                int m = n & ~(CHAIN|VERBOSE);
        !           112:                if (h) {
        !           113:                        printf("head of queue:\n");
        !           114:                        h->print(m);
        !           115:                }
        !           116: 
        !           117:                qt_queue->print(m);
        !           118:        }
        !           119: }

unix.superglobalmegacorp.com

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