--- ray/src/common/malloc.c 1990/12/04 20:46:46 1.11 +++ ray/src/common/malloc.c 1991/07/17 11:35:47 1.13 @@ -1,4 +1,4 @@ -/* Copyright (c) 1990 Regents of the University of California */ +/* Copyright (c) 1991 Regents of the University of California */ #ifndef lint static char SCCSid[] = "$SunId$ LBL"; @@ -46,18 +46,25 @@ static unsigned m_nwasted = 0; /* malloc free lists */ typedef union m_head { union m_head *next; - int bucket; + struct { + short magic; + short bucket; + } a; ALIGN dummy; } M_HEAD; +#define MAGIC 0x1a2 /* magic number for allocated memory */ + #define FIRSTBUCKET 3 #define NBUCKETS 30 static M_HEAD *free_list[NBUCKETS]; -static char DUMMYLOC[BYTES_WORD]; +static ALIGN dummy_mem; +#define DUMMYLOC ((char *)&dummy_mem) + char * mscrounge(np) /* search free lists to satisfy request */ register unsigned *np; @@ -94,9 +101,6 @@ register unsigned n; unsigned thisamnt; register char *p; -#ifdef MSTATS - b_nalloced += n; -#endif if (pagesz == 0) { /* initialize */ pagesz = amnt = getpagesize(); nrem = (int)sbrk(0); /* page align break */ @@ -132,6 +136,9 @@ register unsigned n; p = bpos; bpos += n; /* advance */ nrem -= n; +#ifdef MSTATS + b_nalloced += n; +#endif return(p); } @@ -184,10 +191,6 @@ unsigned n; errno = EINVAL; return(NULL); } -#ifdef MSTATS - m_nalloced += bsiz + sizeof(M_HEAD); - m_nwasted += bsiz + sizeof(M_HEAD) - n; -#endif if (free_list[bucket] == NULL) { /* need more core */ mp = (M_HEAD *)bmalloc(bsiz+sizeof(M_HEAD)); if (mp == NULL) @@ -196,7 +199,12 @@ unsigned n; mp = free_list[bucket]; free_list[bucket] = mp->next; } - mp->bucket = bucket; /* tag block */ +#ifdef MSTATS + m_nalloced += bsiz + sizeof(M_HEAD); + m_nwasted += bsiz + sizeof(M_HEAD) - n; +#endif + mp->a.magic = MAGIC; /* tag block */ + mp->a.bucket = bucket; return((char *)(mp+1)); } @@ -209,20 +217,22 @@ unsigned n; char *p; register unsigned on; /* get old size */ - if (op != NULL && op != DUMMYLOC) - on = 1 << ((M_HEAD *)op-1)->bucket; + if (op != NULL && op != DUMMYLOC && ((M_HEAD *)op-1)->a.magic == MAGIC) + on = 1 << ((M_HEAD *)op-1)->a.bucket; else on = 0; if (n <= on && (n > on>>1 || on == 1<on ? on : n); #else (void)memcpy(p, op, n>on ? on : n); #endif - free(op); + free(op); + } return(p); } @@ -234,14 +244,17 @@ char *p; register int bucket; if (p == NULL || p == DUMMYLOC) - return; + return(1); mp = (M_HEAD *)p - 1; - bucket = mp->bucket; + if (mp->a.magic != MAGIC) /* sanity check */ + return(0); + bucket = mp->a.bucket; mp->next = free_list[bucket]; free_list[bucket] = mp; #ifdef MSTATS m_nfreed += (1 << bucket) + sizeof(M_HEAD); #endif + return(1); }