External allocator support.
[ccan] / ccan / talloc / test / run-external-alloc.c
1 #include "talloc/talloc.c"
2 #include "tap/tap.h"
3 #include <assert.h>
4
5 static int ext_alloc_count, ext_free_count, ext_realloc_count;
6 static void *expected_parent;
7
8 static void *ext_alloc(void *parent, size_t size)
9 {
10         ok1(parent == expected_parent);
11         ext_alloc_count++;
12         return malloc(size);
13 }
14
15 static void ext_free(void *ptr, void *parent)
16 {
17         ok1(parent == expected_parent);
18         ext_free_count++;
19         free(ptr);
20 }
21
22 static void *ext_realloc(void *ptr, void *parent, size_t size)
23 {
24         ok1(parent == expected_parent);
25         ext_realloc_count++;
26         return realloc(ptr, size);
27 }
28
29 int main(void)
30 {
31         char *p, *p2, *head;
32         plan_tests(10);
33
34         talloc_external_enable(ext_alloc, ext_free, ext_realloc);
35         head = talloc(NULL, char);
36         assert(head);
37         expected_parent = head;
38
39         talloc_mark_external(head);
40
41         p = talloc_array(head, char, 1);
42         ok1(ext_alloc_count == 1);
43         assert(p);
44
45         /* Child is also externally allocated */
46         expected_parent = p;
47         p2 = talloc(p, char);
48         ok1(ext_alloc_count == 2);
49
50         expected_parent = head;
51         p = talloc_realloc(NULL, p, char, 1000);
52         ok1(ext_realloc_count == 1);
53         assert(p);
54
55         expected_parent = p;
56         talloc_free(p2);
57         ok1(ext_free_count == 1);
58
59         expected_parent = head;
60         talloc_free(p);
61         ok1(ext_free_count == 2);
62
63         return exit_status();
64 }