1 /* CC0 (Public domain) - see LICENSE file for details */
2 #include <ccan/take/take.h>
3 #include <ccan/likely/likely.h>
7 static const void **takenarr;
8 static size_t max_taken, num_taken;
9 static size_t allocfail;
10 static void (*allocfailfn)(const void *p);
12 void *take_(const void *p)
14 if (unlikely(num_taken == max_taken)) {
17 new = realloc(takenarr, sizeof(*takenarr) * (max_taken+1));
24 /* Otherwise we leak p. */
30 takenarr[num_taken++] = p;
34 static size_t find_taken(const void *p)
38 for (i = 0; i < num_taken; i++) {
45 bool taken(const void *p)
49 if (!p && unlikely(allocfail)) {
58 memmove(&takenarr[i-1], &takenarr[i],
59 (--num_taken - (i - 1))*sizeof(takenarr[0]));
63 bool is_taken(const void *p)
65 if (!p && unlikely(allocfail))
68 return find_taken(p) > 0;
73 return num_taken != 0;
76 void take_cleanup(void)
78 max_taken = num_taken = 0;
83 void take_allocfail(void (*fn)(const void *p))