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