Annotation of researchv9/jtools/src/sam/alloc.c, revision 1.1.1.1

1.1       root        1: #include "sam.h"
                      2: /*
                      3:  *     Allocator.  Manages arena between initial bss and garbage-compacted
                      4:  *     arena.  Uses shiftgcarena() when it needs to expand its dominion.
                      5:  */
                      6: 
                      7: #define        BRKINCR         4096
                      8: #define        LBRKINCR        (BRKINCR/sizeof(long))
                      9: 
                     10: #define        FREE            1
                     11: typedef struct hdr{
                     12:        union{
                     13:                long    *Unext; /* pointer to next object */
                     14:                long    Uinext; /* integer next; odd if deallocated */
                     15:        }uu;
                     16:        long    nlongs;
                     17: }hdr;
                     18: #define        inext   uu.Uinext
                     19: #define        next    uu.Unext
                     20: #define        hp      ((struct hdr *)p)
                     21: 
                     22: #define        HEADERSIZE      (sizeof(struct hdr)/sizeof(long))
                     23: 
                     24: static long    *basep;         /* beginning of arena; only set once */
                     25: static long    *endp;          /* end of arena */
                     26: static long    *nextp;         /* next one to be used */
                     27: 
                     28: allocinit(){
                     29:        basep=(long *)sbrk(0);
                     30:        if(brk((char *)(basep+LBRKINCR))!=0)
                     31:                error(Ealloc);
                     32:        nextp=basep;
                     33:        endp=basep+LBRKINCR;
                     34: }
                     35: uchar *
                     36: alloc(nbytes)
                     37:        register ulong nbytes;
                     38: {
                     39:        register long *p, *q;
                     40:        register ulong nl;
                     41:        nbytes+=sizeof(long)-1;
                     42:        nbytes/=sizeof(long);   /* convert bytes to longs */
                     43: #define        Nlongs  nbytes
                     44:        Nlongs+=HEADERSIZE;
                     45:        /* look for exact match */
                     46:        for(p=basep; p<nextp; p=(long *)(hp->inext&~FREE))
                     47:                if((hp->inext&FREE) && hp->nlongs==Nlongs){
                     48:                        hp->inext&=~FREE;
                     49:                        goto Return;
                     50:                }
                     51:        /* try off the end */
                     52:        if(endp-nextp < Nlongs){
                     53:                nl=(nextp+Nlongs)-basep;                /* number we need */
                     54:                nl=((nl+LBRKINCR-1)/LBRKINCR)*LBRKINCR; /* rounded up */
                     55:                nl-=(endp-basep);                       /* minus number we have */
                     56:                if((int)sbrk((int)(nl*sizeof(long)))==-1)
                     57:                        error(Ealloc);
                     58:                shiftgcarena(nl);
                     59:                endp+=nl;
                     60:        }
                     61:        p=nextp;
                     62:        nextp+=Nlongs;
                     63:        hp->nlongs=Nlongs;
                     64:        hp->next=nextp;
                     65:     Return:
                     66:        for(q=p+HEADERSIZE, Nlongs-=HEADERSIZE; Nlongs-->0; )
                     67:                *q++=0;
                     68:        return (uchar *)(p+HEADERSIZE);
                     69: }
                     70: free(cp)
                     71:        uchar *cp;
                     72: {
                     73:        register long *p=(long *)cp;
                     74:        if(p<=basep || nextp<=p)
                     75:                panic("free");
                     76:        p-=HEADERSIZE;
                     77:        hp->inext|=FREE;
                     78: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.