|
|
1.1 root 1: /*
2: * buffering line discipline.
3: * transparent, but saves up characters for a while.
4: */
5:
6: #include "bf.h"
7: #if NBF
8: #include "../h/param.h"
9: #include "../h/systm.h"
10: #include "../h/stream.h"
11: #include "../h/ioctl.h"
12: #include "../h/map.h"
13: #include "../h/buf.h"
14: #include "../h/ubavar.h"
15: #include "../h/conf.h"
16:
17: struct bufld {
18: struct queue *queue;
19: u_char rnchar;
20: u_char btime;
21: u_char nchar;
22: u_char nclick;
23: u_char index;
24: } bufld[NBF];
25:
26: int buftimo();
27: int bufopen(), bufput(), bufsrv(), bufclose();
28: long bufldact;
29:
30: static struct qinit bufrinit = { bufput, bufsrv, bufopen, bufclose, 1024, 512 };
31: static struct qinit bufwinit = { bufput, bufsrv, bufopen, bufclose, 128, 64 };
32: struct streamtab bufinfo = { &bufrinit, &bufwinit };
33:
34: bufopen(q, dev)
35: register struct queue *q;
36: {
37: register i;
38: register struct bufld *fp;
39:
40: if (q->ptr)
41: return(1);
42: for (i=0; bufld[i].queue!=0 && i<NBF; i+= 2)
43: ;
44: if (i >= NBF)
45: return(0);
46: fp = &bufld[i];
47: fp->queue = q;
48: (fp+1)->queue = WR(q);
49: fp->index = i;
50: (fp+1)->index = i+1;
51: fp->nclick = 3;
52: (fp+1)->nclick = 3;
53: fp->nchar = 16;
54: (fp+1)->nchar = 16;
55: fp->rnchar = 0;
56: (fp+1)->rnchar = 0;
57: fp->btime = 0;
58: (fp+1)->btime = 0;
59: q->flag |= q->next->flag & QDELIM;
60: WR(q)->flag |= WR(q)->next->flag & QDELIM;
61: q->ptr = (caddr_t)fp;
62: WR(q)->ptr = (caddr_t)(fp+1);
63: q->flag |= QNOENB;
64: WR(q)->flag |= QNOENB;
65: return(1);
66: }
67:
68: bufclose(q)
69: register struct queue *q;
70: {
71:
72: bufunload(q);
73: bufunload(WR(q));
74: ((struct bufld *)q->ptr)->btime = 0;
75: ((struct bufld *)WR(q)->ptr)->btime = 0;
76: ((struct bufld *)q->ptr)->queue = 0;
77: ((struct bufld *)WR(q)->ptr)->queue = 0;
78: }
79:
80: bufput(q, bp)
81: register struct queue *q;
82: register struct block *bp;
83: {
84: register struct bufld *fp = (struct bufld *)q->ptr;
85: register s = spl6();
86: register n, t;
87:
88: t = bp->type;
89: n = bp->wptr - bp->rptr;
90: putq(q, bp);
91: fp->rnchar += n;
92: if ((t!=M_DATA && t!=M_DELIM) || fp->rnchar >= fp->nchar)
93: bufunload(q);
94: if (q->first) {
95: /* n/2 ~ about 1200 cps */
96: fp->btime = fp->nclick + n/2;
97: if (bufldact == 0)
98: timeout(buftimo, (caddr_t)0, 1);
99: bufldact |= 1 << fp->index;
100: } else {
101: fp->rnchar = 0;
102: fp->btime = 0;
103: }
104: splx(s);
105: }
106:
107: bufsrv(q)
108: register struct queue *q;
109: {
110: register struct bufld *fp = (struct bufld *)q->ptr;
111:
112: if (q->first && fp->btime == 0)
113: bufunload(q);
114: }
115:
116: bufunload(q)
117: register struct queue *q;
118: {
119: register struct block *bp;
120: register struct bufld *fp = (struct bufld *)q->ptr;
121:
122: while ((q->next->flag&QFULL)==0 && (bp = getq(q))) {
123: fp->rnchar -= bp->wptr - bp->rptr;
124: (*q->next->qinfo->putp)(q->next, bp);
125: }
126: }
127:
128: buftimo()
129: {
130: register long bact;
131: register struct bufld *fp;
132: register ish;
133:
134: bact = bufldact;
135: for (fp = bufld, ish = 1; bact!=0; fp++, ish <<= 1) {
136: if (bact & ish) {
137: bact &= ~ish;
138: if (fp->btime) {
139: fp->btime--;
140: if (fp->btime == 0 && fp->queue
141: && fp->queue->first) {
142: qenable(fp->queue);
143: bufldact &= ~ish;
144: }
145: }
146: }
147: }
148: if (bufldact)
149: timeout(buftimo, (caddr_t)0, 1);
150: }
151: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.