|
|
1.1 root 1: #include "task.h"
2:
3: /* construct qtail <--> oqueue */
4: qtail::qtail(int mode, int max)
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
27: qtail::put(object* p)
28: {
29: register oqueue* q = qt_queue;
30: ll:
31: if (p->o_next) task_error(E_PUTOBJ);
32:
33: if (q->q_count < q->q_max) {
34: if (q->q_count++) {
35: register object* oo = q->q_ptr;
36: p->o_next = oo->o_next;
37: q->q_ptr = oo->o_next = p;
38: }
39: else {
40: qhead* h = q->q_head;
41: q->q_ptr = p->o_next = p;
42: if (h) h->alert();
43: }
44: return 1;
45: }
46:
47: switch (qt_mode) {
48: case WMODE:
49: this_task()->sleep(this);
50: goto ll;
51: case EMODE:
52: task_error(E_PUTFULL);
53: goto ll;
54: case ZMODE:
55: return 0;
56: }
57: }
58:
59:
60: /* create head for this q */
61: qhead*
62: 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*
79: qtail::cut()
80: {
81: oqueue* oldq = qt_queue;
82: qtail* t = new qtail(qt_mode,oldq->q_max);
83: oqueue* newq = t->qt_queue;
84:
85: t->qt_queue = oldq;
86: oldq->q_tail = t;
87:
88: newq->q_tail = this;
89: qt_queue = newq;
90:
91: return t;
92: }
93:
94:
95: /* this qtail is supposed to be downstream from the qhead h */
96: void
97: qtail::splice(qhead* h)
98: {
99: h->splice(this);
100: }
101:
102: int
103: qtail::pending()
104: {
105: return rdspace() == 0;
106: }
107:
108: void
109: qtail::print(int n, int baseClass)
110: {
111: if (!baseClass)
112: printf("qtail ");
113:
114: int m = qt_queue->q_max;
115: int c = qt_queue->q_count;
116: class qhead * h = qt_queue->q_head;
117:
118: printf("mode=%d, max=%d, space=%d, head=%d\n",
119: qt_mode, m, m-c, h);
120:
121: if (n&VERBOSE) {
122: int m = n & ~(CHAIN|VERBOSE);
123: if (h) {
124: printf("head of queue:\n");
125: h->print(m);
126: } else printf("\tno head\n");
127:
128: qt_queue->print(m);
129: }
130:
131: object::print(n, 1);
132: }
133:
134: int
135: qtail::o_type()
136: {
137: return QTAIL;
138: }
139:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.