|
|
1.1 root 1: /*ident "%W%" */
2: /**************************************************************************
3: Copyright (c) 1984 AT&T
4: All Rights Reserved
5:
6: THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T
7:
8: The copyright notice above does not evidence any
9: actual or intended publication of such source code.
10:
11: *****************************************************************************/
12: #include <task.h>
13:
14: /* construct qtail <--> oqueue */
15: qtail::qtail(qmodetype mode, int max)
16: {
17: if (0 < max) {
18: qt_queue = new class oqueue(max);
19: qt_queue->q_tail = this;
20: };
21: qt_mode = mode;
22: }
23:
24: /* destroy q if not also pointed to by a qhead */
25: qtail::~qtail()
26: {
27: oqueue* q = qt_queue;
28:
29: if (q->q_head)
30: q->q_tail = 0;
31: else
32: delete q;
33: }
34:
35:
36: /* insert object at rear of q (becoming new value of oqueue->q_ptr) */
37:
38: // q->q_ptr points to last object. last->o_next points to first object.
39: // first->o_next points to the next object.
40: int
41: qtail::put(object* p)
42: {
43: ll:
44: register oqueue* q = qt_queue;
45: if (p->o_next) task_error(E_PUTOBJ, this);
46:
47: if (q->q_count < q->q_max) {
48: if (q->q_count++) {
49: register object* oo = q->q_ptr;
50: p->o_next = oo->o_next;
51: q->q_ptr = oo->o_next = p;
52: }
53: else { // q was empty; alert those waiting on it
54: qhead* h = q->q_head;
55: q->q_ptr = p->o_next = p;
56: if (h) h->alert();
57: }
58: return 1;
59: }
60:
61: switch (qt_mode) {
62: case WMODE:
63: this_task()->sleep(this);
64: goto ll;
65: case EMODE:
66: task_error(E_PUTFULL, this);
67: goto ll;
68: case ZMODE:
69: return 0;
70: }
71: }
72:
73:
74: /* create head for this q */
75: qhead*
76: qtail::head()
77: {
78: oqueue* q = qt_queue;
79: register qhead* h = q->q_head;
80:
81: if (h == 0) {
82: h = new qhead(qt_mode,0);
83: q->q_head = h;
84: h->qh_queue = q;
85: };
86:
87: return h;
88: }
89:
90:
91: /* result: ?qhead<-->? oldq<-->(new)qtail newq<-->(this)qtail */
92: qtail*
93: qtail::cut()
94: {
95: oqueue* oldq = qt_queue;
96: qtail* t = new qtail(qt_mode,oldq->q_max);
97: oqueue* newq = t->qt_queue;
98:
99: t->qt_queue = oldq;
100: oldq->q_tail = t;
101:
102: newq->q_tail = this;
103: qt_queue = newq;
104:
105: return t;
106: }
107:
108:
109: /* this qtail is supposed to be downstream from the qhead h */
110: void
111: qtail::splice(qhead* h)
112: {
113: h->splice(this);
114: }
115:
116: void
117: qtail::print(int n, int baseClass)
118: {
119: if (!baseClass)
120: printf("qtail ");
121:
122: int m = qt_queue->q_max;
123: int c = qt_queue->q_count;
124: class qhead * h = qt_queue->q_head;
125:
126: printf("mode=%d, max=%d, space=%d, head=%d\n",
127: qt_mode, m, m-c, h);
128:
129: if (n&VERBOSE) {
130: int m = n & ~(CHAIN|VERBOSE);
131: if (h) {
132: printf("head of queue:\n");
133: h->print(m);
134: } else printf("\tno head\n");
135:
136: qt_queue->print(m);
137: }
138:
139: object::print(n, 1);
140: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.