|
|
1.1 root 1: /* @(#)blok.c 1.4 */
2: /*
3: * UNIX shell
4: *
5: * Bell Telephone Laboratories
6: *
7: */
8:
9: #include "defs.h"
10:
11:
12: /*
13: * storage allocator
14: * (circular first fit strategy)
15: */
16:
17: #ifdef CRAY
18: #ifdef CRAY2
19: #define BUSY 020000000000
20: #else
21: #define BUSY 040000000
22: #endif
23: #else
24: #define BUSY 01
25: #endif
26:
27: #define mkbusy(x) (Rcheat(x) | BUSY)
28: #define mknbusy(x) (Rcheat(x) & ~BUSY)
29: #define busy(x) (Rcheat((x)->word) & BUSY)
30:
31: unsigned brkincr = BRKINCR;
32: struct blk *blokp; /*current search pointer*/
33: struct blk *bloktop; /* top of arena (last blok) */
34: struct blk *blokbot; /* first blok */
35:
36: char *brkbegin;
37: char *setbrk();
38:
39: char *
40: shalloc(nbytes)
41: unsigned nbytes;
42: {
43: register unsigned rbytes = round(nbytes+BYTESPERWORD, BYTESPERWORD);
44:
45: for (;;)
46: {
47: int c = 0;
48: register struct blk *p = blokp;
49: register struct blk *q;
50:
51: do
52: {
53: if (!busy(p))
54: {
55: while (!busy(q = p->word)) {
56: p->word = q->word;
57: }
58: if ((char *)q - (char *)p >= rbytes)
59: {
60: blokp = (struct blk *)((char *)p + rbytes);
61: if (q > blokp)
62: blokp->word = p->word;
63: p->word = (struct blk *)mkbusy(blokp);
64: return((char *)(p + 1));
65: }
66: }
67: q = p;
68: p = (struct blk *)mknbusy(p->word);
69: } while (p > q || (c++) == 0);
70: addblok(rbytes);
71: }
72: }
73:
74: addblok(reqd)
75: unsigned reqd;
76: {
77: if (stakbot == 0)
78: {
79: brkbegin = setbrk(3 * BRKINCR);
80: bloktop = blokbot = (struct blk *)brkbegin;
81: }
82:
83: if (stakbas != staktop)
84: {
85: register char *rndstak;
86: register struct blk *blokstak;
87:
88: pushstak(0);
89: #ifdef CRAY
90: rndstak = (char *)sround(staktop, BYTESPERWORD);
91: #else
92: rndstak = (char *)round(staktop, BYTESPERWORD);
93: #endif
94: blokstak = (struct blk *)(stakbas) - 1;
95: blokstak->word = stakbsy;
96: stakbsy = blokstak;
97: bloktop->word = (struct blk *)mkbusy(rndstak);
98: bloktop = (struct blk *)(rndstak);
99: }
100: reqd += brkincr;
101: reqd &= ~(brkincr - 1);
102: blokp = bloktop;
103: bloktop = bloktop->word = bloktop + (reqd/BYTESPERWORD);
104: while ((char *)bloktop >= brkend) {
105: setbrk(round((char *)bloktop - brkend + 1, BRKINCR));
106: }
107: bloktop->word = (struct blk *)mkbusy(brkbegin);
108: {
109: register char *stakadr = (char *)(bloktop + 2);
110:
111: if (stakbot != staktop)
112: staktop = movstr(stakbot, stakadr);
113: else
114: staktop = stakadr;
115:
116: stakbas = stakbot = stakadr;
117: }
118: }
119:
120: shfree(ap)
121: struct blk *ap;
122: {
123: register struct blk *p;
124:
125: if ((p = ap) && p < bloktop && p >= blokbot)
126: {
127: #ifdef DEBUG
128: chkbptr(p);
129: #endif
130: --p;
131: p->word = (struct blk *)mknbusy(p->word);
132: p->word = (struct blk *)(Rcheat(p->word) & ~BUSY);
133: }
134:
135:
136: }
137:
138:
139: #ifdef DEBUG
140:
141: chkbptr(ptr)
142: struct blk *ptr;
143: {
144: int exf = 0;
145: register struct blk *p = (struct blk *)brkbegin;
146: register struct blk *q;
147: int us = 0, un = 0;
148:
149: for (;;)
150: {
151: q = (struct blk *)(Rcheat(p->word) & ~BUSY);
152:
153: if (p+1 == ptr)
154: exf++;
155:
156: if (q < (struct blk *)brkbegin || q > bloktop)
157: abort(3);
158:
159: if (p == bloktop)
160: break;
161:
162: if (busy(p))
163: us += q - p;
164: else
165: un += q - p;
166:
167: if (p >= q)
168: abort(4);
169:
170: p = q;
171: }
172: if (exf == 0) {
173: abort(1);
174: }
175: }
176:
177: #endif
178:
179: chkmem()
180: {
181: register struct blk *p = (struct blk *)brkbegin;
182: register struct blk *q;
183: int us = 0, un = 0;
184:
185: for (;;)
186: {
187: q = (struct blk *)(Rcheat(p->word) & ~BUSY);
188:
189: if (q < (struct blk *)brkbegin || q > bloktop)
190: abort(3);
191:
192: if (p == bloktop)
193: break;
194:
195: if (busy(p))
196: us += q - p;
197: else
198: un += q - p;
199:
200: if (p >= q)
201: abort(4);
202:
203: p = q;
204: }
205:
206: prs("un/used/avail ");
207: prn(un);
208: blank();
209: prn(us);
210: blank();
211: prn((char *)bloktop - brkbegin - (un + us));
212: newline();
213:
214: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.