X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb2%2Ftest%2Frun-57-die-during-transaction.c;fp=ccan%2Ftdb2%2Ftest%2Frun-57-die-during-transaction.c;h=793636a9f6e9c0b30d9fbabfd358febb8bb1efb2;hp=4711e50e4392400f326f77013ecb0885bb408758;hb=c56e2b1b5e51b094d53f4012e226b352a91618f6;hpb=04cf551d15ee93716aa0462adadc0a3891480813 diff --git a/ccan/tdb2/test/run-57-die-during-transaction.c b/ccan/tdb2/test/run-57-die-during-transaction.c index 4711e50e..793636a9 100644 --- a/ccan/tdb2/test/run-57-die-during-transaction.c +++ b/ccan/tdb2/test/run-57-die-during-transaction.c @@ -1,6 +1,9 @@ #define _XOPEN_SOURCE 500 #include #include "lock-tracking.h" +#include +#include +#include static ssize_t pwrite_check(int fd, const void *buf, size_t count, off_t offset); static ssize_t write_check(int fd, const void *buf, size_t count); static int ftruncate_check(int fd, off_t length); @@ -10,6 +13,51 @@ static int ftruncate_check(int fd, off_t length); #define fcntl fcntl_with_lockcheck #define ftruncate ftruncate_check +/* There's a malloc inside transaction_setup_recovery, and valgrind complains + * when we longjmp and leak it. */ +#define MAX_ALLOCATIONS 200 +static void *allocated[MAX_ALLOCATIONS]; + +static void *malloc_noleak(size_t len) +{ + unsigned int i; + + for (i = 0; i < MAX_ALLOCATIONS; i++) + if (!allocated[i]) { + allocated[i] = malloc(len); + return allocated[i]; + } + diag("Too many allocations!"); + abort(); +} + +static void free_noleak(void *p) +{ + unsigned int i; + + /* We don't catch realloc, so don't care if we miss one. */ + for (i = 0; i < MAX_ALLOCATIONS; i++) { + if (allocated[i] == p) { + allocated[i] = NULL; + break; + } + } + free(p); +} + +static void free_all(void) +{ + unsigned int i; + + for (i = 0; i < MAX_ALLOCATIONS; i++) { + free(allocated[i]); + allocated[i] = NULL; + } +} + +#define malloc malloc_noleak +#define free free_noleak + #include #include #include @@ -17,8 +65,13 @@ static int ftruncate_check(int fd, off_t length); #include #include #include -#include -#include +#undef malloc +#undef free +#undef write +#undef pwrite +#undef fcntl +#undef ftruncate + #include #include #include @@ -26,11 +79,6 @@ static int ftruncate_check(int fd, off_t length); #include "external-agent.h" #include "logging.h" -#undef write -#undef pwrite -#undef fcntl -#undef ftruncate - static bool in_transaction; static int target, current; static jmp_buf jmpbuf; @@ -150,6 +198,7 @@ reset: suppress_lockcheck = false; target++; current = 0; + free_all(); goto reset; } @@ -217,5 +266,6 @@ int main(int argc, char *argv[]) ok1(test_death(ops[i], agent)); } + free_external_agent(agent); return exit_status(); }