4 static bool fail_realloc;
5 static void *my_realloc(void *p, size_t len)
9 return realloc(p, len);
11 #define realloc my_realloc
13 #include <ccan/take/take.h>
14 #include <ccan/take/take.c>
15 #include <ccan/tap/tap.h>
17 static int my_allocfail_called;
18 static void my_allocfail(const void *p UNNEEDED)
20 my_allocfail_called++;
23 static void recurse(const char *takeme, int count)
26 recurse(take(strdup(takeme)), count+1);
37 /* We can take NULL. */
38 ok1(take(NULL) == NULL);
41 ok1(taken(NULL)); /* Undoes take() */
45 /* We can take NULL twice! */
46 ok1(take(NULL) == NULL);
47 ok1(take(NULL) == NULL);
50 ok1(taken(NULL)); /* Undoes take() */
53 ok1(taken(NULL)); /* Undoes take() */
58 /* We can take a real pointer. */
62 ok1(taken(p)); /* Undoes take() */
67 /* Force a failure. */
68 ok1(!my_allocfail_called);
70 ok1(take(p+1) == p+1);
73 /* Without a handler, must pass through and leak. */
74 ok1(take(p+2) == p+2);
77 /* Now, with a handler. */
78 take_allocfail(my_allocfail);
79 ok1(take(p+2) == NULL);
81 ok1(my_allocfail_called == 1);
90 /* Test some deep nesting. */
93 ok1(max_taken == 1000);
99 ok1(takenarr == NULL);
101 return exit_status();