xref: /inferno-os/os/boot/puma/qio.c (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
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