Simple locking for talloc.
[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_realloc(const void *parent, void *ptr, size_t size)
9 {
10         ok1(parent == expected_parent);
11         if (ptr == NULL)
12                 ext_alloc_count++;
13         if (size == 0)
14                 ext_free_count++;
15         if (ptr && size)
16                 ext_realloc_count++;
17         return realloc(ptr, size);
18 }
19
20 int main(void)
21 {
22         char *p, *p2, *head;
23         plan_tests(12);
24
25         expected_parent = NULL;
26         head = talloc_add_external(NULL, ext_realloc);
27         assert(head);
28         ok1(ext_alloc_count == 1);
29
30         expected_parent = head;
31         p = talloc_array(head, char, 1);
32         ok1(ext_alloc_count == 2);
33         assert(p);
34
35         /* Child is also externally allocated */
36         expected_parent = p;
37         p2 = talloc(p, char);
38         ok1(ext_alloc_count == 3);
39
40         expected_parent = head;
41         p = talloc_realloc(NULL, p, char, 1000);
42         ok1(ext_realloc_count == 1);
43         assert(p);
44
45         expected_parent = p;
46         talloc_free(p2);
47         ok1(ext_free_count == 1);
48
49         expected_parent = head;
50         talloc_free(p);
51         ok1(ext_free_count == 2);
52
53         return exit_status();
54 }