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)316682SmckusickADDRESS 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)566682SmckusickVOID 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)816682SmckusickVOID 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)926682Smckusickchkbptr(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*67270Sbosticrealloc(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