Browse Source

tdb2: test: fix run-57-die-during-transaction.c to be more efficient.

We track malloc and free, but we didn't catch the free() inside
external_agent, which means that our list of allocations keeps
growing.  Particularly under valgrind, which re-uses memory less than
the glibc allocator.
Rusty Russell 14 years ago
parent
commit
d9cbd7d445

+ 4 - 2
ccan/tdb2/test/external-agent.c

@@ -17,6 +17,8 @@
 
 static struct tdb_context *tdb;
 
+void (*external_agent_free)(void *) = free;
+
 static enum TDB_ERROR clear_if_first(int fd, void *arg)
 {
 /* We hold a lock offset 4 always, so we can tell if anyone is holding it.
@@ -100,10 +102,10 @@ static enum agent_return do_operation(enum operation op, const char *name)
 			ret = OTHER_FAILURE;
 		} else if (!tdb_deq(data, k)) {
 			ret = OTHER_FAILURE;
-			free(data.dptr);
+			external_agent_free(data.dptr);
 		} else {
 			ret = SUCCESS;
-			free(data.dptr);
+			external_agent_free(data.dptr);
 		}
 		break;
 	case STORE:

+ 3 - 0
ccan/tdb2/test/external-agent.h

@@ -35,6 +35,9 @@ enum agent_return external_agent_operation(struct agent *handle,
 					   enum operation op,
 					   const char *name);
 
+/* Hook into free() on tdb_data in external agent. */
+void (*external_agent_free)(void *);
+
 /* Mapping enum -> string. */
 const char *agent_return_name(enum agent_return ret);
 const char *operation_name(enum operation op);

+ 11 - 1
ccan/tdb2/test/run-57-die-during-transaction.c

@@ -15,8 +15,9 @@ static int ftruncate_check(int fd, off_t length);
 
 /* There's a malloc inside transaction_setup_recovery, and valgrind complains
  * when we longjmp and leak it. */
-#define MAX_ALLOCATIONS 200
+#define MAX_ALLOCATIONS 10
 static void *allocated[MAX_ALLOCATIONS];
+static unsigned max_alloc = 0;
 
 static void *malloc_noleak(size_t len)
 {
@@ -25,6 +26,10 @@ static void *malloc_noleak(size_t len)
 	for (i = 0; i < MAX_ALLOCATIONS; i++)
 		if (!allocated[i]) {
 			allocated[i] = malloc(len);
+			if (i > max_alloc) {
+				max_alloc = i;
+				diag("max_alloc: %i", max_alloc);
+			}
 			return allocated[i];
 		}
 	diag("Too many allocations!");
@@ -37,6 +42,10 @@ static void *realloc_noleak(void *p, size_t size)
 
 	for (i = 0; i < MAX_ALLOCATIONS; i++) {
 		if (allocated[i] == p) {
+			if (i > max_alloc) {
+				max_alloc = i;
+				diag("max_alloc: %i", max_alloc);
+			}
 			return allocated[i] = realloc(p, size);
 		}
 	}
@@ -270,6 +279,7 @@ int main(int argc, char *argv[])
 	plan_tests(24);
 	unlock_callback = maybe_die;
 
+	external_agent_free = free_noleak;
 	agent = prepare_external_agent();
 	if (!agent)
 		err(1, "preparing agent");