1 #include <ccan/talloc_link/talloc_link.h>
2 #include <ccan/tap/tap.h>
3 #include <ccan/talloc_link/talloc_link.c>
7 static unsigned int destroy_count = 0;
8 static int destroy_obj(void *obj)
14 int main(int argc, char *argv[])
16 void *obj, *p1, *p2, *p3;
20 talloc_enable_leak_report();
22 /* Single parent case. */
23 p1 = talloc(NULL, char);
24 obj = talloc_linked(p1, talloc(NULL, char));
25 talloc_set_destructor(obj, destroy_obj);
27 ok(destroy_count == 0, "destroy_count = %u", destroy_count);
29 ok(destroy_count == 1, "destroy_count = %u", destroy_count);
31 /* Dual parent case. */
32 p1 = talloc(NULL, char);
33 obj = talloc_linked(p1, talloc(NULL, char));
34 talloc_set_destructor(obj, destroy_obj);
35 p2 = talloc(NULL, char);
39 ok(destroy_count == 1, "destroy_count = %u", destroy_count);
41 ok(destroy_count == 2, "destroy_count = %u", destroy_count);
43 /* Triple parent case. */
44 p1 = talloc(NULL, char);
45 obj = talloc_linked(p1, talloc(NULL, char));
46 talloc_set_destructor(obj, destroy_obj);
48 p2 = talloc(NULL, char);
49 p3 = talloc(NULL, char);
55 ok(destroy_count == 2, "destroy_count = %u", destroy_count);
57 ok(destroy_count == 2, "destroy_count = %u", destroy_count);
59 ok(destroy_count == 3, "destroy_count = %u", destroy_count);
61 /* Single delink case. */
62 p1 = talloc(NULL, char);
63 obj = talloc_linked(p1, talloc(NULL, char));
64 talloc_set_destructor(obj, destroy_obj);
66 ok(destroy_count == 3, "destroy_count = %u", destroy_count);
67 talloc_delink(p1, obj);
68 ok(destroy_count == 4, "destroy_count = %u", destroy_count);
71 /* Double delink case. */
72 p1 = talloc(NULL, char);
73 obj = talloc_linked(p1, talloc(NULL, char));
74 talloc_set_destructor(obj, destroy_obj);
76 p2 = talloc(NULL, char);
79 talloc_delink(p1, obj);
80 ok(destroy_count == 4, "destroy_count = %u", destroy_count);
81 talloc_delink(p2, obj);
82 ok(destroy_count == 5, "destroy_count = %u", destroy_count);
86 /* Delink and free. */
87 p1 = talloc(NULL, char);
88 obj = talloc_linked(p1, talloc(NULL, char));
89 talloc_set_destructor(obj, destroy_obj);
90 p2 = talloc(NULL, char);
93 talloc_delink(p1, obj);
94 ok(destroy_count == 5, "destroy_count = %u", destroy_count);
96 ok(destroy_count == 6, "destroy_count = %u", destroy_count);
99 /* Free and delink. */
100 p1 = talloc(NULL, char);
101 obj = talloc_linked(p1, talloc(NULL, char));
102 talloc_set_destructor(obj, destroy_obj);
103 p2 = talloc(NULL, char);
104 talloc_link(p2, obj);
107 ok(destroy_count == 6, "destroy_count = %u", destroy_count);
108 talloc_delink(p2, obj);
109 ok(destroy_count == 7, "destroy_count = %u", destroy_count);
113 ok1(talloc_total_size(NULL) == 0);
115 talloc_disable_null_tracking();
117 return exit_status();