6 * antithread/alloc - memory allocator routines
8 * The alloc module implements a simple allocator which you can use to
9 * dynamically allocate space within a region of memory. This can be useful
10 * for suballocations within a given region, or a memory-mapped file.
12 * All metadata is kept within the memory handed to the allocator: you only
13 * need hand the pointer and the size of the memory to each call.
15 * The region contents is always in offsets, so it can be mapped in different
16 * places, but is not endian-safe.
19 * #include <sys/mman.h>
21 * #include <sys/types.h>
23 * #include <sys/stat.h>
27 * #include <ccan/antithread/alloc/alloc.h>
29 * static void usage(const char *name)
31 * errx(1, "Usage: %s --create <mapfile>\n"
32 * " %s --check <mapfile>\n"
33 * " %s --alloc <mapfile>\n"
34 * " %s --free=<offset> <mapfile>\n", name, name, name, name);
37 * // Create a memory mapped file, and allocate from within it
38 * int main(int argc, char *argv[])
42 * enum { CREATE, CHECK, ALLOC, FREE } cmd;
47 * if (strcmp(argv[1], "--create") == 0)
49 * else if (strcmp(argv[1], "--check") == 0)
51 * else if (strcmp(argv[1], "--alloc") == 0)
53 * else if (strncmp(argv[1], "--free=", strlen("--free=")) == 0)
58 * if (cmd == CREATE) {
59 * fd = open(argv[2], O_RDWR|O_CREAT|O_EXCL, 0600);
61 * err(1, "Could not create %s", argv[2]);
62 * if (ftruncate(fd, 1048576) != 0)
63 * err(1, "Could not set length on %s", argv[2]);
65 * fd = open(argv[2], O_RDWR);
67 * err(1, "Could not open %s", argv[2]);
70 * a = mmap(NULL, 1048576, PROT_READ|PROT_WRITE, MAP_SHARED, fd,0);
71 * if (a == MAP_FAILED)
72 * err(1, "Could not map %s", argv[2]);
76 * alloc_init(a, 1048576);
79 * if (!alloc_check(a, 1048576))
80 * err(1, "Region is corrupt");
83 * p = alloc_get(a, 1048576, 1024, 16);
85 * errx(1, "Could not allocate");
86 * printf("%zu\n", (char *)p - (char *)a);
89 * p = (char *)a + atol(argv[1] + strlen("--free="));
90 * alloc_free(a, 1048576, p);
96 * License: LGPL (v2.1 or any later version)
97 * Author: Rusty Russell <rusty@rustcorp.com.au>
99 int main(int argc, char *argv[])
104 if (strcmp(argv[1], "depends") == 0) {
105 printf("ccan/alignof\n");
106 printf("ccan/build_assert\n");
107 printf("ccan/compiler\n");
108 printf("ccan/ilog\n");
109 printf("ccan/likely\n");
110 printf("ccan/short_types\n");