diff --git a/src/threadpool.c b/src/threadpool.c
index f6476e2a929babae697c6ef03149c39252f6f015..465756f71d88df81921a880edf8cdb1ee17f6026 100644
--- a/src/threadpool.c
+++ b/src/threadpool.c
@@ -268,6 +268,7 @@ void threadpool_map(struct threadpool *tp, threadpool_map_function map_function,
   if (tp->num_threads == 1) {
     map_function(map_data, N, extra_data);
 #ifdef SWIFT_DEBUG_THREADPOOL
+    tp->map_function = map_function;
     threadpool_log(tp, 0, N, tic, getticks());
 #endif
     return;
@@ -330,10 +331,11 @@ void threadpool_clean(struct threadpool *tp) {
     if (pthread_barrier_destroy(&tp->wait_barrier) != 0 ||
         pthread_barrier_destroy(&tp->run_barrier) != 0)
       error("Failed to destroy threadpool barriers.");
+
+    /* Clean up memory. */
+    free(tp->threads);
   }
 
-  /* Clean up memory. */
-  free(tp->threads);
 #ifdef SWIFT_DEBUG_THREADPOOL
   for (int k = 0; k < tp->num_threads; k++) {
     free(tp->logs[k].log);
diff --git a/tests/testThreadpool.c b/tests/testThreadpool.c
index 81fee0a15ae1287276ada61de5eed79051b77e1e..bf9e73065fa5b830a0efc58ad7a90aefeb6b0284 100644
--- a/tests/testThreadpool.c
+++ b/tests/testThreadpool.c
@@ -33,7 +33,7 @@ void map_function_first(void *map_data, int num_elements, void *extra_data) {
   for (int ind = 0; ind < num_elements; ind++) {
     int input = inputs[ind];
     usleep(rand() % 1000000);
-    printf("map_function_first: got input %i.\n", input);
+    printf("   map_function_first: got input %i.\n", input);
     fflush(stdout);
   }
 }
@@ -43,7 +43,7 @@ void map_function_second(void *map_data, int num_elements, void *extra_data) {
   for (int ind = 0; ind < num_elements; ind++) {
     int input = inputs[ind];
     usleep(rand() % 1000000);
-    printf("map_function_second: got input %i.\n", input);
+    printf("   map_function_second: got input %i.\n", input);
     fflush(stdout);
   }
 }
@@ -51,42 +51,49 @@ void map_function_second(void *map_data, int num_elements, void *extra_data) {
 int main(int argc, char *argv[]) {
 
   // Some constants for this test.
-  const int num_threads = 16;
   const int N = 20;
   const int num_runs = 2;
 
-  // Create a threadpool with 8 threads.
-  struct threadpool tp;
-  threadpool_init(&tp, num_threads);
+  // Create threadpools with different numbers of threads.
+  for (int num_thread = 1; num_thread <= 16; num_thread *= 4) {
+    printf("# Creating threadpool with %d threads\n", num_thread);
+    struct threadpool tp;
+    threadpool_init(&tp, num_thread);
 
-  // Main loop.
-  for (int run = 0; run < num_runs; run++) {
+    // Main loop.
+    for (int run = 0; run < num_runs; run++) {
 
-    // Run over a set of integers and print them.
-    int data[N];
-    for (int k = 0; k < N; k++) data[k] = k;
-    printf("processing integers from 0..%i.\n", N);
-    fflush(stdout);
-    threadpool_map(&tp, map_function_first, data, N, sizeof(int), 1, NULL);
+      // Run over a set of integers and print them.
+      int data[N];
+      for (int k = 0; k < N; k++) data[k] = k;
+      printf("1..processing integers from 0..%i.\n", N);
+      fflush(stdout);
+      threadpool_map(&tp, map_function_first, data, N, sizeof(int), 1, NULL);
 
-    // Do the same thing again, with less jobs than threads.
-    printf("processing integers from 0..%i.\n", N / 2);
-    fflush(stdout);
-    threadpool_map(&tp, map_function_second, data, N / 2, sizeof(int), 1, NULL);
+      // Do the same thing again, with less jobs than threads.
+      printf("2..processing integers from 0..%i.\n", N / 2);
+      fflush(stdout);
+      threadpool_map(&tp, map_function_second, data, N / 2, sizeof(int), 1,
+                     NULL);
 
-    // Do the same thing again, with a chunk size of two.
-    printf("processing integers from 0..%i.\n", N);
-    fflush(stdout);
-    threadpool_map(&tp, map_function_first, data, N, sizeof(int), 2, NULL);
-  }
+      // Do the same thing again, with a chunk size of two.
+      printf("3..processing integers from 0..%i.\n", N);
+      fflush(stdout);
+      threadpool_map(&tp, map_function_first, data, N, sizeof(int), 2, NULL);
+    }
 
-/* If logging was enabled, dump the log. */
+    /* If logging was enabled, dump the log. */
 #ifdef SWIFT_DEBUG_THREADPOOL
-  threadpool_dump_log(&tp, "threadpool_log.txt", 1);
+    char filename[80];
+    sprintf(filename, "threadpool_log-%d.txt", num_thread);
+    printf("# Dumping log\n");
+    threadpool_dump_log(&tp, filename, 1);
 #endif
 
-  /* Be clean */
-  threadpool_clean(&tp);
+    /* Be clean */
+    threadpool_clean(&tp);
+    printf("\n");
+  }
 
   return 0;
 }