|
|
1.1 root 1: /* $Header: /kernel/kersrc/coh.386/RCS/clist.c,v 1.2 92/08/04 12:30:26 bin Exp Locker: bin $ */
2: /* (lgl-
3: * The information contained herein is a trade secret of Mark Williams
4: * Company, and is confidential information. It is provided under a
5: * license agreement, and may be copied or disclosed only under the
6: * terms of that agreement. Any reproduction or disclosure of this
7: * material without the express written authorization of Mark Williams
8: * Company or persuant to the license agreement is unlawful.
9: *
10: * COHERENT Version 2.3.37
11: * Copyright (c) 1982, 1983, 1984.
12: * An unpublished work by Mark Williams Company, Chicago.
13: * All rights reserved.
14: -lgl) */
15: /*
16: * Coherent.
17: * Character list management.
18: *
19: * $Log: clist.c,v $
20: * Revision 1.2 92/08/04 12:30:26 bin
21: * changed for kernel 59
22: *
23: * Revision 1.2 92/01/06 11:58:44 hal
24: * Compile with cc.mwc.
25: *
26: * Revision 1.1 88/03/24 16:13:33 src
27: * Initial revision
28: *
29: */
30: #include <sys/coherent.h>
31: #include <sys/clist.h>
32: #include <sys/sched.h>
33:
34: #define cvirt(p) ((CLIST *)(p))
35: #ifdef TRACER
36: int nclfree = 0;
37: #endif
38:
39: /*
40: * Initialise character list queues.
41: *
42: * Clist are not mapped.
43: */
44: cltinit()
45: {
46: register cmap_t cm;
47: register cmap_t lm;
48: register paddr_t p;
49: register int s;
50:
51: s = sphi();
52: lm = 0;
53: for (p = clistp+NCLIST*sizeof(CLIST); (p-=sizeof(CLIST)) >= clistp; ) {
54: cm = p;
55: cvirt(cm)->cl_fp = lm;
56: lm = cm;
57: }
58: cltfree = lm;
59: #ifdef TRACER
60: nclfree = NCLIST;
61: #endif
62: spl(s);
63: }
64:
65: /*
66: * Get a character from the given queue.
67: */
68: getq(cqp)
69: register CQUEUE *cqp;
70: {
71: register cmap_t op;
72: register cmap_t np;
73: register int ox;
74: register int c;
75: register int s;
76:
77: if (cqp->cq_cc == 0)
78: return (-1);
79: s = sphi();
80: op = cqp->cq_op;
81: ox = cqp->cq_ox;
82: c = cvirt(op)->cl_ch[ox]&0377;
83: if (--cqp->cq_cc==0 || ++cqp->cq_ox==NCPCL) {
84: cqp->cq_ox = 0;
85: np = cvirt(op)->cl_fp;
86: cvirt(op)->cl_fp = cltfree;
87: cqp->cq_op = np;
88: cltfree = op;
89: if (np == 0) {
90: cqp->cq_ip = 0;
91: cqp->cq_ix = 0;
92: }
93: if (cltwant) {
94: cltwant = 0;
95: wakeup((char *)&cltwant);
96: }
97: #ifdef TRACER
98: T_HAL(0x0040, {nclfree++; printf("F%d ", nclfree);});
99: #endif
100: }
101: spl(s);
102: return (c);
103: }
104:
105: /*
106: * Put a character on the given queue.
107: */
108: putq(cqp, c)
109: register CQUEUE *cqp;
110: {
111: register cmap_t ip;
112: register int ix;
113: register int s;
114: register cmap_t np;
115:
116: s = sphi();
117: ip = cqp->cq_ip;
118: if ((ix=cqp->cq_ix) == 0) {
119: if ((ip=cltfree) == 0) {
120: spl(s);
121: return (-1);
122: }
123: cltfree = cvirt(ip)->cl_fp;
124: cvirt(ip)->cl_fp = 0;
125: if ((np=cqp->cq_ip) == 0)
126: cqp->cq_op = ip;
127: else {
128: cvirt(np)->cl_fp = ip;
129: }
130: cqp->cq_ip = ip;
131: T_HAL(0x0040, { nclfree--; printf("f%d ", nclfree);});
132: }
133: cvirt(ip)->cl_ch[ix] = c;
134: if (++cqp->cq_ix == NCPCL)
135: cqp->cq_ix = 0;
136: cqp->cq_cc++;
137: spl(s);
138: return c;
139: }
140:
141: /*
142: * Clear a character queue.
143: */
144: clrq(cqp)
145: register CQUEUE *cqp;
146: {
147: register int s;
148:
149: s = sphi();
150: while (getq(cqp) >= 0)
151: ;
152: spl(s);
153: }
154:
155: /*
156: * Wait for more character queues to become available.
157: */
158: waitq()
159: {
160: while (cltfree == 0) {
161: T_HAL(0x0080, putchar('+'));
162: cltwant = 1;
163: v_sleep((char *)&cltwant, CVCLIST, IVCLIST, SVCLIST, "waitq");
164: /* Wait for more character queues to become available. */
165: }
166: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.