xref: /csrg-svn/old/sh/blok.c (revision 67270)
114477Ssam #ifndef lint
2*67270Sbostic static char sccsid[] = "@(#)blok.c	4.3 05/30/94";
314477Ssam #endif
46682Smckusick 
56682Smckusick #
66682Smckusick /*
76682Smckusick  *	UNIX shell
86682Smckusick  *
96682Smckusick  *	S. R. Bourne
106682Smckusick  *	Bell Telephone Laboratories
116682Smckusick  *
126682Smckusick  */
136682Smckusick 
146682Smckusick #include	"defs.h"
156682Smckusick 
166682Smckusick 
176682Smckusick /*
186682Smckusick  *	storage allocator
196682Smckusick  *	(circular first fit strategy)
206682Smckusick  */
216682Smckusick 
226682Smckusick #define BUSY 01
236682Smckusick #define busy(x)	(Rcheat((x)->word)&BUSY)
246682Smckusick 
256682Smckusick POS		brkincr=BRKINCR;
266682Smckusick BLKPTR		blokp;			/*current search pointer*/
276682Smckusick BLKPTR		bloktop=BLK(end);	/*top of arena (last blok)*/
286682Smckusick 
296682Smckusick 
306682Smckusick 
alloc(nbytes)316682Smckusick ADDRESS	alloc(nbytes)
326682Smckusick 	POS		nbytes;
336682Smckusick {
346682Smckusick 	REG POS		rbytes = round(nbytes+BYTESPERWORD,BYTESPERWORD);
356682Smckusick 
366682Smckusick 	LOOP	INT		c=0;
376682Smckusick 		REG BLKPTR	p = blokp;
386682Smckusick 		REG BLKPTR	q;
396682Smckusick 		REP	IF !busy(p)
406682Smckusick 			THEN	WHILE !busy(q = p->word) DO p->word = q->word OD
416682Smckusick 				IF ADR(q)-ADR(p) >= rbytes
426682Smckusick 				THEN	blokp = BLK(ADR(p)+rbytes);
436682Smckusick 					IF q > blokp
446682Smckusick 					THEN	blokp->word = p->word;
456682Smckusick 					FI
466682Smckusick 					p->word=BLK(Rcheat(blokp)|BUSY);
476682Smckusick 					return(ADR(p+1));
486682Smckusick 				FI
496682Smckusick 			FI
506682Smckusick 			q = p; p = BLK(Rcheat(p->word)&~BUSY);
516682Smckusick 		PER	p>q ORF (c++)==0 DONE
526682Smckusick 		addblok(rbytes);
536682Smckusick 	POOL
546682Smckusick }
556682Smckusick 
addblok(reqd)566682Smckusick VOID	addblok(reqd)
576682Smckusick 	POS		reqd;
586682Smckusick {
596682Smckusick 	IF stakbas!=staktop
606682Smckusick 	THEN	REG STKPTR	rndstak;
616682Smckusick 		REG BLKPTR	blokstak;
626682Smckusick 
636682Smckusick 		pushstak(0);
646682Smckusick 		rndstak=round(staktop,BYTESPERWORD);
656682Smckusick 		blokstak=BLK(stakbas)-1;
666682Smckusick 		blokstak->word=stakbsy; stakbsy=blokstak;
676682Smckusick 		bloktop->word=BLK(Rcheat(rndstak)|BUSY);
686682Smckusick 		bloktop=BLK(rndstak);
696682Smckusick 	FI
706682Smckusick 	reqd += brkincr; reqd &= ~(brkincr-1);
716682Smckusick 	blokp=bloktop;
726682Smckusick 	bloktop=bloktop->word=BLK(Rcheat(bloktop)+reqd);
736682Smckusick 	bloktop->word=BLK(ADR(end)+1);
746682Smckusick 	BEGIN
756682Smckusick 	   REG STKPTR stakadr=STK(bloktop+2);
766682Smckusick 	   staktop=movstr(stakbot,stakadr);
776682Smckusick 	   stakbas=stakbot=stakadr;
786682Smckusick 	END
796682Smckusick }
806682Smckusick 
free(ap)816682Smckusick VOID	free(ap)
826682Smckusick 	BLKPTR		ap;
836682Smckusick {
846682Smckusick 	REG BLKPTR	p;
856682Smckusick 
866682Smckusick 	IF (p=ap) ANDF p<bloktop
876682Smckusick 	THEN	Lcheat((--p)->word) &= ~BUSY;
886682Smckusick 	FI
896682Smckusick }
906682Smckusick 
916682Smckusick #ifdef DEBUG
chkbptr(ptr)926682Smckusick chkbptr(ptr)
936682Smckusick 	BLKPTR	ptr;
946682Smckusick {
956682Smckusick 	INT		exf=0;
966682Smckusick 	REG BLKPTR	p = end;
976682Smckusick 	REG BLKPTR	q;
986682Smckusick 	INT		us=0, un=0;
996682Smckusick 
1006682Smckusick 	LOOP
1016682Smckusick 	   q = Rcheat(p->word)&~BUSY;
1026682Smckusick 	   IF p==ptr THEN exf++ FI
1036682Smckusick 	   IF q<end ORF q>bloktop THEN abort(3) FI
1046682Smckusick 	   IF p==bloktop THEN break FI
1056682Smckusick 	   IF busy(p)
1066682Smckusick 	   THEN us += q-p;
1076682Smckusick 	   ELSE un += q-p;
1086682Smckusick 	   FI
1096682Smckusick 	   IF p>=q THEN abort(4) FI
1106682Smckusick 	   p=q;
1116682Smckusick 	POOL
1126682Smckusick 	IF exf==0 THEN abort(1) FI
1136682Smckusick 	prn(un); prc(SP); prn(us); prc(NL);
1146682Smckusick }
1156682Smckusick #endif
116*67270Sbostic 
117*67270Sbostic void *
realloc(cp,nbytes)118*67270Sbostic realloc(cp, nbytes)
119*67270Sbostic 	void *cp;
120*67270Sbostic 	unsigned int nbytes;
121*67270Sbostic {
122*67270Sbostic 	void *new;
123*67270Sbostic 
124*67270Sbostic 	new = malloc(nbytes);
125*67270Sbostic 	if (cp == 0)
126*67270Sbostic 		return (new);
127*67270Sbostic 	bcopy(cp, new, nbytes);
128*67270Sbostic 	free(cp);
129*67270Sbostic 	return (new);
130*67270Sbostic }
131