1: #include "../h/param.h"
2: #include "../h/systm.h"
3: #include "../h/conf.h"
4: #include "../h/buf.h"
5:
6: #define XPRI 30
7: #define NBLOCKS 10
8:
9: int bwaiting, wcount;
10: struct buf *bufps[NBLOCKS];
11: char *nbase[NBLOCKS]; /* normal allocations */
12: short nmap[NBLOCKS]; /* 1 bit == 32 bytes */
13:
14: char log[] ={0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4};
15: #define FULL -1
16: #define LOCK s = spl6()
17: #define UNLOCK splx(s)
18:
19: /*
20: * getepack: get empty packet
21: * with size specified by bitmask.
22: */
23: char *
24: getepack(bits)
25: {
26: register i;
27: int s, savbits;
28: char **base;
29: short *map;
30:
31: base = nbase; map = nmap;
32: savbits = bits;
33:
34: /*
35: * search for space
36: */
37: LOCK;
38: for(;;) {
39:
40: if (bits == FULL)
41: goto force;
42:
43: for(i=0; i<NBLOCKS; i++) {
44: register m;
45: register unsigned n;
46: register offset;
47:
48: m = map[i];
49: if (m==FULL || base[i]==NULL)
50: continue;
51: if (bits == 1) {
52: n = m;
53: m |= m+1;
54: n = m-n;
55: for (offset=0; n > 16; n >>= 4)
56: offset += 4;
57: offset += log[n];
58: } else {
59: bits = savbits;
60: for(n=17; --n; bits <<= 1)
61: if ((m&bits)==0)
62: goto found;
63: continue;
64: found:
65: offset = 16-n;
66: m |= bits;
67: }
68: map[i] = m;
69: UNLOCK;
70: return(base[i] + 32*offset);
71: }
72: /*
73: * grab another block from the system
74: */
75: force:
76: for(i=0;i<NBLOCKS;i++) {
77: register struct buf *bp;
78:
79: if (bufps[i]!=NULL)
80: continue;
81: bufps[i] = bp = geteblk();
82: bp->b_flags |= B_PACK;
83: bp->b_flags |= B_PBUSY;
84: map[i] = bits;
85: base[i] = bp->b_un.b_addr;
86: UNLOCK;
87: return(bp->b_un.b_addr);
88: }
89: /*
90: * sleep until something is released
91: */
92: bwaiting++;
93: wcount++;
94: sleep((caddr_t)&bwaiting, XPRI);
95: bwaiting--;
96: }
97: }
98:
99: /*
100: * freepack: release space beginning
101: * at address p with length specified
102: * by bits.
103: */
104: freepack(p, bits)
105: char *p;
106: {
107: register i, d, s;
108: char **base;
109: short *map;
110:
111: if (p==NULL)
112: return;
113: LOCK;
114: base = nbase; map = nmap;
115:
116: for(i=0;i<NBLOCKS;i++) {
117: d = p-base[i];
118: if (d>=0 && d<=512)
119: goto found;
120: }
121: goto out;
122: found:
123: d >>= 5;
124: d = (bits<<d);
125: map[i] &= ~d;
126: if (map[i]==0) {
127: register struct buf *bp;
128:
129: bp = bufps[i];
130: bp->b_flags &= ~B_PBUSY;
131: base[i] = NULL;
132: bufps[i] = NULL;
133: brelse(bp);
134: }
135: if (bwaiting)
136: wakeup((caddr_t)&bwaiting);
137: out:
138: splx(s);
139: }
140:
141:
142:
143: /*
144: * integer to bitmap conversion
145: */
146: dtom(d)
147: register d;
148: {
149: register m;
150:
151: m = 1;
152: while (d>32) {
153: d -= 32;
154: m |= m+1;
155: }
156: return(m);
157: }
158:
159: #define NRECS 160
160: int reclist[NRECS];
161: int recbits[NRECS];
Defined functions
dtom
defined in line
146; used 3 times
Defined variables
bufps
defined in line
10; used 4 times
log
defined in line
14; used 1 times
nbase
defined in line
11; used 2 times
nmap
defined in line
12; used 2 times
wcount
defined in line
9; used 1 times
Defined macros
FULL
defined in line
15; used 2 times
LOCK
defined in line
16; used 2 times
XPRI
defined in line
6; used 1 times