1*74a4d8c2SCharles.Forsyth #include "u.h"
2*74a4d8c2SCharles.Forsyth #include "lib.h"
3*74a4d8c2SCharles.Forsyth #include "mem.h"
4*74a4d8c2SCharles.Forsyth #include "dat.h"
5*74a4d8c2SCharles.Forsyth #include "fns.h"
6*74a4d8c2SCharles.Forsyth #include "io.h"
7*74a4d8c2SCharles.Forsyth
8*74a4d8c2SCharles.Forsyth struct Queue {
9*74a4d8c2SCharles.Forsyth Block* first;
10*74a4d8c2SCharles.Forsyth Block* last;
11*74a4d8c2SCharles.Forsyth void (*kick)(void*);
12*74a4d8c2SCharles.Forsyth void* arg;
13*74a4d8c2SCharles.Forsyth long len;
14*74a4d8c2SCharles.Forsyth };
15*74a4d8c2SCharles.Forsyth
16*74a4d8c2SCharles.Forsyth Block *
iallocb(int n)17*74a4d8c2SCharles.Forsyth iallocb(int n)
18*74a4d8c2SCharles.Forsyth {
19*74a4d8c2SCharles.Forsyth Block *b;
20*74a4d8c2SCharles.Forsyth
21*74a4d8c2SCharles.Forsyth b = (Block*)malloc(sizeof(Block)+n);
22*74a4d8c2SCharles.Forsyth b->data = (uchar*)b + sizeof(Block);
23*74a4d8c2SCharles.Forsyth b->rp = b->wp = b->data;
24*74a4d8c2SCharles.Forsyth b->lim = b->data + n;
25*74a4d8c2SCharles.Forsyth b->next = 0;
26*74a4d8c2SCharles.Forsyth b->magic = 0xcafebee0;
27*74a4d8c2SCharles.Forsyth return b;
28*74a4d8c2SCharles.Forsyth }
29*74a4d8c2SCharles.Forsyth
30*74a4d8c2SCharles.Forsyth void
freeb(Block * b)31*74a4d8c2SCharles.Forsyth freeb(Block *b)
32*74a4d8c2SCharles.Forsyth {
33*74a4d8c2SCharles.Forsyth if(b){
34*74a4d8c2SCharles.Forsyth if(b->magic != 0xcafebee0)
35*74a4d8c2SCharles.Forsyth panic("freeb");
36*74a4d8c2SCharles.Forsyth b->magic = 0;
37*74a4d8c2SCharles.Forsyth b->next = (Block*)0xdeadbabe;
38*74a4d8c2SCharles.Forsyth free(b);
39*74a4d8c2SCharles.Forsyth }
40*74a4d8c2SCharles.Forsyth }
41*74a4d8c2SCharles.Forsyth
42*74a4d8c2SCharles.Forsyth Queue *
qopen(int limit,int msg,void (* kick)(void *),void * arg)43*74a4d8c2SCharles.Forsyth qopen(int limit, int msg, void (*kick)(void*), void *arg)
44*74a4d8c2SCharles.Forsyth {
45*74a4d8c2SCharles.Forsyth Queue *q;
46*74a4d8c2SCharles.Forsyth
47*74a4d8c2SCharles.Forsyth USED(limit, msg);
48*74a4d8c2SCharles.Forsyth q = (Queue*)malloc(sizeof(Queue));
49*74a4d8c2SCharles.Forsyth q->first = q->last = 0;
50*74a4d8c2SCharles.Forsyth q->kick = kick;
51*74a4d8c2SCharles.Forsyth q->arg = arg;
52*74a4d8c2SCharles.Forsyth q->len = 0;
53*74a4d8c2SCharles.Forsyth return q;
54*74a4d8c2SCharles.Forsyth }
55*74a4d8c2SCharles.Forsyth
56*74a4d8c2SCharles.Forsyth Block *
qget(Queue * q)57*74a4d8c2SCharles.Forsyth qget(Queue *q)
58*74a4d8c2SCharles.Forsyth {
59*74a4d8c2SCharles.Forsyth int s;
60*74a4d8c2SCharles.Forsyth Block *b;
61*74a4d8c2SCharles.Forsyth
62*74a4d8c2SCharles.Forsyth s = splhi();
63*74a4d8c2SCharles.Forsyth if((b = q->first) != 0){
64*74a4d8c2SCharles.Forsyth q->first = b->next;
65*74a4d8c2SCharles.Forsyth b->next = 0;
66*74a4d8c2SCharles.Forsyth q->len -= BLEN(b);
67*74a4d8c2SCharles.Forsyth if(q->len < 0)
68*74a4d8c2SCharles.Forsyth panic("qget");
69*74a4d8c2SCharles.Forsyth }
70*74a4d8c2SCharles.Forsyth splx(s);
71*74a4d8c2SCharles.Forsyth return b;
72*74a4d8c2SCharles.Forsyth }
73*74a4d8c2SCharles.Forsyth
74*74a4d8c2SCharles.Forsyth void
qbwrite(Queue * q,Block * b)75*74a4d8c2SCharles.Forsyth qbwrite(Queue *q, Block *b)
76*74a4d8c2SCharles.Forsyth {
77*74a4d8c2SCharles.Forsyth int s;
78*74a4d8c2SCharles.Forsyth
79*74a4d8c2SCharles.Forsyth s = splhi();
80*74a4d8c2SCharles.Forsyth b->next = 0;
81*74a4d8c2SCharles.Forsyth if(q->first == 0)
82*74a4d8c2SCharles.Forsyth q->first = b;
83*74a4d8c2SCharles.Forsyth else
84*74a4d8c2SCharles.Forsyth q->last->next = b;
85*74a4d8c2SCharles.Forsyth q->last = b;
86*74a4d8c2SCharles.Forsyth q->len += BLEN(b);
87*74a4d8c2SCharles.Forsyth splx(s);
88*74a4d8c2SCharles.Forsyth if(q->kick)
89*74a4d8c2SCharles.Forsyth q->kick(q->arg);
90*74a4d8c2SCharles.Forsyth }
91*74a4d8c2SCharles.Forsyth
92*74a4d8c2SCharles.Forsyth long
qlen(Queue * q)93*74a4d8c2SCharles.Forsyth qlen(Queue *q)
94*74a4d8c2SCharles.Forsyth {
95*74a4d8c2SCharles.Forsyth return q->len;
96*74a4d8c2SCharles.Forsyth }
97*74a4d8c2SCharles.Forsyth
98*74a4d8c2SCharles.Forsyth int
qbgetc(Queue * q)99*74a4d8c2SCharles.Forsyth qbgetc(Queue *q)
100*74a4d8c2SCharles.Forsyth {
101*74a4d8c2SCharles.Forsyth Block *b;
102*74a4d8c2SCharles.Forsyth int s, c;
103*74a4d8c2SCharles.Forsyth
104*74a4d8c2SCharles.Forsyth c = -1;
105*74a4d8c2SCharles.Forsyth s = splhi();
106*74a4d8c2SCharles.Forsyth while(c < 0 && (b = q->first) != nil){
107*74a4d8c2SCharles.Forsyth if(b->rp < b->wp){
108*74a4d8c2SCharles.Forsyth c = *b->rp++;
109*74a4d8c2SCharles.Forsyth q->len--;
110*74a4d8c2SCharles.Forsyth }
111*74a4d8c2SCharles.Forsyth if(b->rp >= b->wp){
112*74a4d8c2SCharles.Forsyth q->first = b->next;
113*74a4d8c2SCharles.Forsyth b->next = nil;
114*74a4d8c2SCharles.Forsyth }
115*74a4d8c2SCharles.Forsyth }
116*74a4d8c2SCharles.Forsyth splx(s);
117*74a4d8c2SCharles.Forsyth return c;
118*74a4d8c2SCharles.Forsyth }
119*74a4d8c2SCharles.Forsyth
120*74a4d8c2SCharles.Forsyth void
qbputc(Queue * q,int c)121*74a4d8c2SCharles.Forsyth qbputc(Queue *q, int c)
122*74a4d8c2SCharles.Forsyth {
123*74a4d8c2SCharles.Forsyth Block *b;
124*74a4d8c2SCharles.Forsyth
125*74a4d8c2SCharles.Forsyth b = iallocb(1);
126*74a4d8c2SCharles.Forsyth *b->wp++ = c;
127*74a4d8c2SCharles.Forsyth qbwrite(q, b);
128*74a4d8c2SCharles.Forsyth }
129