1: #ifndef lint
2: static char sccsid[] = "@(#)blok.c 4.2 8/11/83";
3: #endif
4:
5: #
6: /*
7: * UNIX shell
8: *
9: * S. R. Bourne
10: * Bell Telephone Laboratories
11: *
12: */
13:
14: #include "defs.h"
15:
16:
17: /*
18: * storage allocator
19: * (circular first fit strategy)
20: */
21:
22: #define BUSY 01
23: #define busy(x) (Rcheat((x)->word)&BUSY)
24:
25: POS brkincr=BRKINCR;
26: BLKPTR blokp; /*current search pointer*/
27: BLKPTR bloktop=BLK(end); /*top of arena (last blok)*/
28:
29:
30:
31: ADDRESS alloc(nbytes)
32: POS nbytes;
33: {
34: REG POS rbytes = round(nbytes+BYTESPERWORD,BYTESPERWORD);
35:
36: LOOP INT c=0;
37: REG BLKPTR p = blokp;
38: REG BLKPTR q;
39: REP IF !busy(p)
40: THEN WHILE !busy(q = p->word) DO p->word = q->word OD
41: IF ADR(q)-ADR(p) >= rbytes
42: THEN blokp = BLK(ADR(p)+rbytes);
43: IF q > blokp
44: THEN blokp->word = p->word;
45: FI
46: p->word=BLK(Rcheat(blokp)|BUSY);
47: return(ADR(p+1));
48: FI
49: FI
50: q = p; p = BLK(Rcheat(p->word)&~BUSY);
51: PER p>q ORF (c++)==0 DONE
52: addblok(rbytes);
53: POOL
54: }
55:
56: VOID addblok(reqd)
57: POS reqd;
58: {
59: IF stakbas!=staktop
60: THEN REG STKPTR rndstak;
61: REG BLKPTR blokstak;
62:
63: pushstak(0);
64: rndstak=round(staktop,BYTESPERWORD);
65: blokstak=BLK(stakbas)-1;
66: blokstak->word=stakbsy; stakbsy=blokstak;
67: bloktop->word=BLK(Rcheat(rndstak)|BUSY);
68: bloktop=BLK(rndstak);
69: FI
70: reqd += brkincr; reqd &= ~(brkincr-1);
71: blokp=bloktop;
72: bloktop=bloktop->word=BLK(Rcheat(bloktop)+reqd);
73: bloktop->word=BLK(ADR(end)+1);
74: BEGIN
75: REG STKPTR stakadr=STK(bloktop+2);
76: staktop=movstr(stakbot,stakadr);
77: stakbas=stakbot=stakadr;
78: END
79: }
80:
81: VOID free(ap)
82: BLKPTR ap;
83: {
84: REG BLKPTR p;
85:
86: IF (p=ap) ANDF p<bloktop
87: THEN Lcheat((--p)->word) &= ~BUSY;
88: FI
89: }
90:
91: #ifdef DEBUG
92: chkbptr(ptr)
93: BLKPTR ptr;
94: {
95: INT exf=0;
96: REG BLKPTR p = end;
97: REG BLKPTR q;
98: INT us=0, un=0;
99:
100: LOOP
101: q = Rcheat(p->word)&~BUSY;
102: IF p==ptr THEN exf++ FI
103: IF q<end ORF q>bloktop THEN abort(3) FI
104: IF p==bloktop THEN break FI
105: IF busy(p)
106: THEN us += q-p;
107: ELSE un += q-p;
108: FI
109: IF p>=q THEN abort(4) FI
110: p=q;
111: POOL
112: IF exf==0 THEN abort(1) FI
113: prn(un); prc(SP); prn(us); prc(NL);
114: }
115: #endif
Defined functions
alloc
defined in line
31;
never used
free
defined in line
81; used 7 times
Defined variables
sccsid
defined in line
2;
never used
Defined macros
BUSY
defined in line
22; used 6 times
busy
defined in line
23; used 3 times