alloc.c
changeset 0 c045670f36e9
equal deleted inserted replaced
-1:000000000000 0:c045670f36e9
       
     1 #include "alloc.h"
       
     2 #include "error.h"
       
     3 extern char *malloc();
       
     4 extern void free();
       
     5 
       
     6 #define ALIGNMENT 16 /* XXX: assuming that this alignment is enough */
       
     7 #define SPACE 4096 /* must be multiple of ALIGNMENT */
       
     8 
       
     9 typedef union { char irrelevant[ALIGNMENT]; double d; } aligned;
       
    10 static aligned realspace[SPACE / ALIGNMENT];
       
    11 #define space ((char *) realspace)
       
    12 static unsigned int avail = SPACE; /* multiple of ALIGNMENT; 0<=avail<=SPACE */
       
    13 
       
    14 /*@null@*//*@out@*/char *alloc(n)
       
    15 unsigned int n;
       
    16 {
       
    17   char *x;
       
    18   n = ALIGNMENT + n - (n & (ALIGNMENT - 1)); /* XXX: could overflow */
       
    19   if (n <= avail) { avail -= n; return space + avail; }
       
    20   x = malloc(n);
       
    21   if (!x) errno = error_nomem;
       
    22   return x;
       
    23 }
       
    24 
       
    25 void alloc_free(x)
       
    26 char *x;
       
    27 {
       
    28   if (x >= space)
       
    29     if (x < space + SPACE)
       
    30       return; /* XXX: assuming that pointers are flat */
       
    31   free(x);
       
    32 }