|
|
1.1 root 1: /* $Header: /y/coh.386/RCS/clist.c,v 1.4 93/04/14 10:06:18 root Exp $ */
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 5.0
11: * Copyright (c) 1982, 1983, 1984, 1993.
12: * An unpublished work by Mark Williams Company, Chicago.
13: * All rights reserved.
14: -lgl) */
15: /*
16: * Coherent.
17: * Character list management.
18: */
19: #include <sys/coherent.h>
20: #include <sys/clist.h>
21: #include <sys/sched.h>
22:
23: #define cvirt(p) ((CLIST *)(p))
24: #ifdef TRACER
25: int nclfree = 0;
26: #endif
27:
28: /*
29: * Initialise character list queues.
30: *
31: * Clist are not mapped.
32: */
33: cltinit()
34: {
35: register cmap_t cm;
36: register cmap_t lm;
37: register paddr_t p;
38: register int s;
39:
40: s = sphi();
41: lm = 0;
42: for (p = clistp+NCLIST*sizeof(CLIST); (p-=sizeof(CLIST)) >= clistp; ) {
43: cm = p;
44: cvirt(cm)->cl_fp = lm;
45: lm = cm;
46: }
47: cltfree = lm;
48: #ifdef TRACER
49: nclfree = NCLIST;
50: #endif
51: spl(s);
52: }
53:
54: /*
55: * Get a character from the given queue.
56: */
57: cltgetq(cqp)
58: register CQUEUE *cqp;
59: {
60: register cmap_t op;
61: register cmap_t np;
62: register int ox;
63: register int c;
64: register int s;
65:
66: if (cqp->cq_cc == 0)
67: return (-1);
68: s = sphi();
69: op = cqp->cq_op;
70: ox = cqp->cq_ox;
71: c = cvirt(op)->cl_ch[ox]&0377;
72: if (--cqp->cq_cc==0 || ++cqp->cq_ox==NCPCL) {
73: cqp->cq_ox = 0;
74: np = cvirt(op)->cl_fp;
75: cvirt(op)->cl_fp = cltfree;
76: cqp->cq_op = np;
77: cltfree = op;
78: if (np == 0) {
79: cqp->cq_ip = 0;
80: cqp->cq_ix = 0;
81: }
82: if (cltwant) {
83: cltwant = 0;
84: wakeup((char *)&cltwant);
85: }
86: #ifdef TRACER
87: T_HAL(0x0040, {nclfree++; printf("F%d ", nclfree);});
88: #endif
89: }
90: spl(s);
91: return (c);
92: }
93:
94: /*
95: * Put a character on the given queue.
96: */
97: cltputq(cqp, c)
98: register CQUEUE *cqp;
99: {
100: register cmap_t ip;
101: register int ix;
102: register int s;
103: register cmap_t np;
104:
105: s = sphi();
106: ip = cqp->cq_ip;
107: if ((ix=cqp->cq_ix) == 0) {
108: if ((ip=cltfree) == 0) {
109: spl(s);
110: return (-1);
111: }
112: cltfree = cvirt(ip)->cl_fp;
113: cvirt(ip)->cl_fp = 0;
114: if ((np=cqp->cq_ip) == 0)
115: cqp->cq_op = ip;
116: else {
117: cvirt(np)->cl_fp = ip;
118: }
119: cqp->cq_ip = ip;
120: T_HAL(0x0040, { nclfree--; printf("f%d ", nclfree);});
121: }
122: cvirt(ip)->cl_ch[ix] = c;
123: if (++cqp->cq_ix == NCPCL)
124: cqp->cq_ix = 0;
125: cqp->cq_cc++;
126: spl(s);
127: return c;
128: }
129:
130: /*
131: * Clear a character queue.
132: */
133: clrq(cqp)
134: register CQUEUE *cqp;
135: {
136: register int s;
137:
138: s = sphi();
139: while (cltgetq(cqp) >= 0)
140: ;
141: spl(s);
142: }
143:
144: /*
145: * Wait for more character queues to become available.
146: */
147: waitq()
148: {
149: while (cltfree == 0) {
150: T_HAL(0x0080, putchar('+'));
151: cltwant = 1;
152: x_sleep((char *)&cltwant, pritty, slpriNoSig, "waitq");
153: /* Wait for more character queues to become available. */
154: }
155: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.