home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 8
/
CDASC08.ISO
/
NEWS
/
RADIANCE
/
SRC
/
COMMON
/
BMALLOC.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-10-07
|
2KB
|
74 lines
/* Copyright (c) 1991 Regents of the University of California */
#ifndef lint
static char SCCSid[] = "@(#)bmalloc.c 2.2 3/10/92 LBL";
#endif
/*
* Bmalloc provides basic memory allocation without overhead (no free lists).
* Use only to take the load off of malloc for all those
* piddling little requests that you never expect to free.
* Bmalloc defers to malloc for big requests.
* Bfree should hand memory to bmalloc, but it usually fails here.
*/
#define NULL 0
#ifndef MBLKSIZ
#define MBLKSIZ 16376 /* size of memory allocation block */
#endif
#define WASTEFRAC 12 /* don't waste more than a fraction */
#ifndef ALIGN
#define ALIGN int /* type for alignment */
#endif
#define BYTES_WORD sizeof(ALIGN)
extern char *malloc();
static char *bposition = NULL;
static unsigned nremain = 0;
char *
bmalloc(n) /* allocate a block of n bytes */
register unsigned n;
{
if (n > nremain && (n > MBLKSIZ || nremain > MBLKSIZ/WASTEFRAC))
return(malloc(n)); /* too big */
n = (n+(BYTES_WORD-1))&~(BYTES_WORD-1); /* word align */
if (n > nremain && (bposition = malloc(nremain = MBLKSIZ)) == NULL) {
nremain = 0;
return(NULL);
}
bposition += n;
nremain -= n;
return(bposition - n);
}
bfree(p, n) /* free random memory */
register char *p;
register unsigned n;
{
register unsigned bsiz;
/* check alignment */
bsiz = BYTES_WORD - ((unsigned)p&(BYTES_WORD-1));
if (bsiz < BYTES_WORD) {
p += bsiz;
n -= bsiz;
}
if (p + n == bposition) { /* just allocated? */
bposition = p;
nremain += n;
return;
}
if (n > nremain) { /* better than what we've got? */
bposition = p;
nremain = n;
return;
}
/* just throw it away, then */
}