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 >
C/C++ Source or Header  |  1996-09-28  |  2KB  |  77 lines

  1. /*
  2.  *  Emulation of sbrk() that uses a fixed size preallocated buffer.
  3.  *  The buffer consumes half of the largest available memory segment,
  4.  *  or whatever it can get.
  5.  */
  6.  
  7. #ifndef HAVE_SBRK
  8.  
  9. #include <errno.h>
  10. #include <exec/memory.h>
  11. #include <proto/exec.h>
  12.  
  13. char *_endptr;            /* Start of sbrk() region */
  14. static int sbrksize;        /* Size of the preallocated sbrk buffer */
  15. static char *sbrkval;        /* Current pointer into sbrk buffer */
  16.  
  17. static void sbrk_free_all (void)
  18. {
  19.   FreeMem (_endptr, sbrksize);
  20. }
  21.  
  22. char *sbrk (int incr)
  23. {
  24.   char *sbrkrtn;
  25.   char *newbrkval;
  26.   extern int atexit (void (*func)(void));
  27.  
  28.   if (_endptr == (char *) 0)
  29.     {
  30.       sbrksize = AvailMem (MEMF_LARGEST);
  31.       while (sbrksize > 0)    /* Should work first time... */
  32.     {
  33.       sbrksize >>= 1;
  34.       sbrkval = _endptr = AllocMem (sbrksize, 0);
  35.       if (sbrkval)
  36.         {
  37.           atexit (sbrk_free_all);
  38.           break;
  39.         }
  40.     }
  41.     }
  42.   sbrkrtn = sbrkval;
  43.   newbrkval = sbrkval + incr;
  44.   if ((newbrkval >= _endptr) && (newbrkval < (_endptr + sbrksize)))
  45.     {
  46.       sbrkval = newbrkval;
  47.     }
  48.   else
  49.     {
  50.       sbrkrtn = (char *) -1;
  51.       errno = ENOMEM;
  52.     }
  53.   return (sbrkrtn);
  54. }
  55.  
  56. #endif    /* HAVE_SBRK */
  57.  
  58. #ifdef TEST_MAIN
  59.  
  60. main ()
  61. {
  62.   printf ("Begin value = 0x%x\n", sbrk (0));
  63.   printf ("End is at 0x%x\n", _endptr);
  64.   printf ("Sbrk buffer is 0x%x (%d) bytes\n", sbrksize, sbrksize);
  65.   printf ("sbrk (0) = 0x%x\n", sbrk (0x0));
  66.   printf ("sbrk (0x1000) = 0x%x\n", sbrk (0x1000));
  67.   printf ("sbrk (0x2000) = 0x%x\n", sbrk (0x2000));
  68.   printf ("sbrk (0x5000) = 0x%x\n", sbrk (0x5000));
  69.   printf ("sbrk (0) = 0x%x\n", sbrk (0x0));
  70.   printf ("sbrk (-0x5000) = 0x%x\n", sbrk (-0x5000));
  71.   printf ("sbrk (-0x2000) = 0x%x\n", sbrk (-0x2000));
  72.   printf ("sbrk (-0x1000) = 0x%x\n", sbrk (-0x1000));
  73.   printf ("sbrk (0) = 0x%x\n", sbrk (0x0));
  74. }
  75.  
  76. #endif
  77.