home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Geek Gadgets 1
/
ADE-1.bin
/
ade-dist
/
dbmalloc-1.14-src.tgz
/
tar.out
/
contrib
/
dbmalloc
/
sbrk.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-09-28
|
2KB
|
77 lines
/*
* Emulation of sbrk() that uses a fixed size preallocated buffer.
* The buffer consumes half of the largest available memory segment,
* or whatever it can get.
*/
#ifndef HAVE_SBRK
#include <errno.h>
#include <exec/memory.h>
#include <proto/exec.h>
char *_endptr; /* Start of sbrk() region */
static int sbrksize; /* Size of the preallocated sbrk buffer */
static char *sbrkval; /* Current pointer into sbrk buffer */
static void sbrk_free_all (void)
{
FreeMem (_endptr, sbrksize);
}
char *sbrk (int incr)
{
char *sbrkrtn;
char *newbrkval;
extern int atexit (void (*func)(void));
if (_endptr == (char *) 0)
{
sbrksize = AvailMem (MEMF_LARGEST);
while (sbrksize > 0) /* Should work first time... */
{
sbrksize >>= 1;
sbrkval = _endptr = AllocMem (sbrksize, 0);
if (sbrkval)
{
atexit (sbrk_free_all);
break;
}
}
}
sbrkrtn = sbrkval;
newbrkval = sbrkval + incr;
if ((newbrkval >= _endptr) && (newbrkval < (_endptr + sbrksize)))
{
sbrkval = newbrkval;
}
else
{
sbrkrtn = (char *) -1;
errno = ENOMEM;
}
return (sbrkrtn);
}
#endif /* HAVE_SBRK */
#ifdef TEST_MAIN
main ()
{
printf ("Begin value = 0x%x\n", sbrk (0));
printf ("End is at 0x%x\n", _endptr);
printf ("Sbrk buffer is 0x%x (%d) bytes\n", sbrksize, sbrksize);
printf ("sbrk (0) = 0x%x\n", sbrk (0x0));
printf ("sbrk (0x1000) = 0x%x\n", sbrk (0x1000));
printf ("sbrk (0x2000) = 0x%x\n", sbrk (0x2000));
printf ("sbrk (0x5000) = 0x%x\n", sbrk (0x5000));
printf ("sbrk (0) = 0x%x\n", sbrk (0x0));
printf ("sbrk (-0x5000) = 0x%x\n", sbrk (-0x5000));
printf ("sbrk (-0x2000) = 0x%x\n", sbrk (-0x2000));
printf ("sbrk (-0x1000) = 0x%x\n", sbrk (-0x1000));
printf ("sbrk (0) = 0x%x\n", sbrk (0x0));
}
#endif