Add alloc_size(): every allocator has to be able to answer this, since
[ccan] / ccan / alloc / test / run-testsize.c
1 #include "alloc/alloc.h"
2 #include "tap/tap.h"
3 #include "alloc/alloc.c"
4 #include <stdlib.h>
5 #include <stdbool.h>
6
7 #define POOL_ORD 16
8 #define POOL_SIZE (1 << POOL_ORD)
9
10 static void invert_bytes(unsigned char *p, unsigned long size)
11 {
12         unsigned int i;
13
14         for (i = 0; i < size; i++)
15                 p[i] ^= 0xFF;
16 }
17
18 static bool sizes_ok(void *mem, unsigned long poolsize, void *p[], unsigned num)
19 {
20         unsigned int i;
21
22         for (i = 0; i < num; i++)
23                 if (alloc_size(mem, poolsize, p[i]) < i)
24                         return false;
25         return true;
26 }
27
28 int main(int argc, char *argv[])
29 {
30         void *mem;
31         unsigned int i, num;
32         void *p[POOL_SIZE];
33
34         plan_tests(5);
35
36         /* FIXME: Needs to be page aligned for now. */
37         posix_memalign(&mem, 1 << POOL_ORD, POOL_SIZE);
38
39         alloc_init(mem, POOL_SIZE);
40
41         /* Check that alloc_size() gives reasonable answers. */
42         for (i = 0; i < POOL_SIZE; i++) {
43                 p[i] = alloc_get(mem, POOL_SIZE, i, 1);
44                 if (!p[i])
45                         break;
46                 invert_bytes(p[i], alloc_size(mem, POOL_SIZE, p[i]));
47         }
48         ok1(i < POOL_SIZE);
49         num = i;
50         ok1(alloc_check(mem, POOL_SIZE));
51         ok1(sizes_ok(mem, POOL_SIZE, p, num));
52
53         /* Free every second one. */
54         for (i = 0; i < num; i+=2) {
55                 alloc_free(mem, POOL_SIZE, p[i]);
56                 /* Compact. */
57                 if (i + 1 < num) {
58                         p[i/2] = p[i + 1];
59                         invert_bytes(p[i/2], alloc_size(mem,POOL_SIZE,p[i/2]));
60                 }
61         }
62         num /= 2;
63         ok1(alloc_check(mem, POOL_SIZE));
64         ok1(sizes_ok(mem, POOL_SIZE, p, num));
65
66         return exit_status();
67 }