home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / nuweb087.zip / arena.c next >
C/C++ Source or Header  |  1996-02-28  |  971b  |  49 lines

  1. #include "global.h"
  2. typedef struct chunk {
  3.   struct chunk *next;
  4.   char *limit;
  5.   char *avail;
  6. } Chunk;
  7. static Chunk first = { NULL, NULL, NULL };
  8. static Chunk *arena = &first;
  9. void *arena_getmem(n)
  10.      size_t n;
  11. {
  12.   char *q;
  13.   char *p = arena->avail;
  14.   n = (n + 7) & ~7;             /* ensuring alignment to 8 bytes */
  15.   q = p + n;
  16.   if (q <= arena->limit) {
  17.     arena->avail = q;
  18.     return p;
  19.   }
  20.   {
  21.     Chunk *ap = arena;
  22.     Chunk *np = ap->next;
  23.     while (np) {
  24.       char *v = sizeof(Chunk) + (char *) np;
  25.       if (v + n <= np->limit) {
  26.         np->avail = v + n;
  27.         arena = np;
  28.         return v;
  29.       }
  30.       ap = np;
  31.       np = ap->next;
  32.     }
  33.     {
  34.       size_t m = n + 10000;
  35.       np = (Chunk *) malloc(m);
  36.       np->limit = m + (char *) np;
  37.       np->avail = n + sizeof(Chunk) + (char *) np;
  38.       np->next = NULL;
  39.       ap->next = np;
  40.       arena = np;
  41.       return sizeof(Chunk) + (char *) np;
  42.     }
  43.   }
  44. }
  45. void arena_free()
  46. {
  47.   arena = &first;
  48. }
  49.