home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 9 / FreshFishVol9-CD2.bin / bbs / gnu / dbmalloc-1.14-src.lha / dbmalloc-1.14 / sbrk.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-12  |  1.8 KB  |  80 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.  
  12. char *_endptr;            /* Start of sbrk() region */
  13. static int sbrksize;        /* Size of the preallocated sbrk buffer */
  14. static char *sbrkval;        /* Current pointer into sbrk buffer */
  15.  
  16. static void sbrk_free_all (void)
  17. {
  18.   extern void FreeMem (char *, int);
  19.  
  20.   FreeMem (_endptr, sbrksize);
  21. }
  22.  
  23. char *sbrk (int incr)
  24. {
  25.   char *sbrkrtn;
  26.   char *newbrkval;
  27.   extern char *AllocMem (int, int);
  28.   extern int AvailMem (int);
  29.   extern int atexit (void (*func)(void));
  30.  
  31.   if (_endptr == (char *) 0)
  32.     {
  33.       sbrksize = AvailMem (MEMF_LARGEST);
  34.       while (sbrksize > 0)    /* Should work first time... */
  35.     {
  36.       sbrksize >>= 1;
  37.       sbrkval = _endptr = AllocMem (sbrksize, 0);
  38.       if (sbrkval)
  39.         {
  40.           atexit (sbrk_free_all);
  41.           break;
  42.         }
  43.     }
  44.     }
  45.   sbrkrtn = sbrkval;
  46.   newbrkval = sbrkval + incr;
  47.   if ((newbrkval >= _endptr) && (newbrkval < (_endptr + sbrksize)))
  48.     {
  49.       sbrkval = newbrkval;
  50.     }
  51.   else
  52.     {
  53.       sbrkrtn = (char *) -1;
  54.       errno = ENOMEM;
  55.     }
  56.   return (sbrkrtn);
  57. }
  58.  
  59. #endif    /* HAVE_SBRK */
  60.  
  61. #ifdef TEST_MAIN
  62.  
  63. main ()
  64. {
  65.   printf ("Begin value = 0x%x\n", sbrk (0));
  66.   printf ("End is at 0x%x\n", _endptr);
  67.   printf ("Sbrk buffer is 0x%x (%d) bytes\n", sbrksize, sbrksize);
  68.   printf ("sbrk (0) = 0x%x\n", sbrk (0x0));
  69.   printf ("sbrk (0x1000) = 0x%x\n", sbrk (0x1000));
  70.   printf ("sbrk (0x2000) = 0x%x\n", sbrk (0x2000));
  71.   printf ("sbrk (0x5000) = 0x%x\n", sbrk (0x5000));
  72.   printf ("sbrk (0) = 0x%x\n", sbrk (0x0));
  73.   printf ("sbrk (-0x5000) = 0x%x\n", sbrk (-0x5000));
  74.   printf ("sbrk (-0x2000) = 0x%x\n", sbrk (-0x2000));
  75.   printf ("sbrk (-0x1000) = 0x%x\n", sbrk (-0x1000));
  76.   printf ("sbrk (0) = 0x%x\n", sbrk (0x0));
  77. }
  78.  
  79. #endif
  80.