1 #include <sys/mman.h>
2 #include <sys/types.h>
3
4 /*
5 * Allow old BSD naming too, it would be a pity to have to make a
6 * separate file just for this.
7 */
8 #ifndef MAP_ANONYMOUS
9 #define MAP_ANONYMOUS MAP_ANON
10 #endif
11
12 /*
13 * Our blob allocator enforces the strict CHUNK size
14 * requirement, as a portability check.
15 */
blob_alloc(unsigned long size)16 void *blob_alloc(unsigned long size)
17 {
18 void *ptr;
19
20 if (size & ~CHUNK)
21 die("internal error: bad allocation size (%lu bytes)", size);
22 ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
23 if (ptr == MAP_FAILED)
24 ptr = NULL;
25 return ptr;
26 }
27
blob_free(void * addr,unsigned long size)28 void blob_free(void *addr, unsigned long size)
29 {
30 if (!size || (size & ~CHUNK) || ((unsigned long) addr & 512))
31 die("internal error: bad blob free (%lu bytes at %p)", size, addr);
32 #ifndef DEBUG
33 munmap(addr, size);
34 #else
35 mprotect(addr, size, PROT_NONE);
36 #endif
37 }
38