* Bell Telephone Laboratories
* (circular first fit strategy)
#define busy(x) (Rcheat((x)->word)&BUSY)
BLKPTR blokp
; /*current search pointer*/
BLKPTR bloktop
=BLK(end
); /*top of arena (last blok)*/
REG POS rbytes
= round(nbytes
+BYTESPERWORD
,BYTESPERWORD
);
THEN WHILE
!busy(q
= p
->word
) DO p
->word
= q
->word OD
IF
ADR(q
)-ADR(p
) >= rbytes
THEN blokp
= BLK(ADR(p
)+rbytes
);
THEN blokp
->word
= p
->word
;
p
->word
=BLK(Rcheat(blokp
)|BUSY
);
q
= p
; p
= BLK(Rcheat(p
->word
)&~BUSY
);
PER p
>q
ORF (c
++)==0 DONE
rndstak
=round(staktop
,BYTESPERWORD
);
blokstak
->word
=stakbsy
; stakbsy
=blokstak
;
bloktop
->word
=BLK(Rcheat(rndstak
)|BUSY
);
reqd
+= brkincr
; reqd
&= ~(brkincr
-1);
bloktop
=bloktop
->word
=BLK(Rcheat(bloktop
)+reqd
);
bloktop
->word
=BLK(ADR(end
)+1);
REG STKPTR stakadr
=STK(bloktop
+2);
staktop
=movstr(stakbot
,stakadr
);
THEN
Lcheat((--p
)->word
) &= ~BUSY
;
q
= Rcheat(p
->word
)&~BUSY
;
IF q
<end ORF q
>bloktop THEN
abort(3) FI
IF p
==bloktop THEN
break FI
IF exf
==0 THEN
abort(1) FI
prn(un
); prc(SP
); prn(us
); prc(NL
);