[MEDIUM] ensure we don't recursively call pool_gc2()
A race condition exists in the hot reconfiguration code. It is
theorically possible that the second signal is sent during a free()
in the first list, which can cause crashes or freezes (the later
have been observed). Just set up a counter to ensure we do not
recurse.
diff --git a/src/memory.c b/src/memory.c
index 05178e5..36db92e 100644
--- a/src/memory.c
+++ b/src/memory.c
@@ -122,11 +122,17 @@
/*
* This function frees whatever can be freed in all pools, but respecting
- * the minimum thresholds imposed by owners.
+ * the minimum thresholds imposed by owners. It takes care of avoiding
+ * recursion because it may be called from a signal handler.
*/
void pool_gc2()
{
+ static int recurse;
struct pool_head *entry;
+
+ if (recurse++)
+ goto out;
+
list_for_each_entry(entry, &pools, list) {
void *temp, *next;
//qfprintf(stderr, "Flushing pool %s\n", entry->name);
@@ -141,6 +147,8 @@
}
entry->free_list = next;
}
+ out:
+ recurse--;
}
/*