Commit | Line | Data |
---|---|---|
8d5530c4 MW |
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 | } |