MEDIUM: pool: support purging jemalloc arenas in trim_all_pools()
In the case of Linux/glibc, falling back to malloc_trim if jemalloc
had not been detected beforehand.
diff --git a/src/pool.c b/src/pool.c
index 514a53e..1d4f2df 100644
--- a/src/pool.c
+++ b/src/pool.c
@@ -48,10 +48,23 @@
/* ask the allocator to trim memory pools */
static void trim_all_pools(void)
{
+ if (my_mallctl) {
+ unsigned int i, narenas = 0;
+ size_t len = sizeof(narenas);
+
+ if (my_mallctl("arenas.narenas", &narenas, &len, NULL, 0) == 0) {
+ for (i = 0; i < narenas; i ++) {
+ char mib[32] = {0};
+ snprintf(mib, sizeof(mib), "arena.%u.purge", i);
+ (void)my_mallctl(mib, NULL, NULL, NULL, 0);
+ }
+ }
+ } else {
#if defined(HA_HAVE_MALLOC_TRIM)
- if (using_default_allocator)
- malloc_trim(0);
+ if (using_default_allocator)
+ malloc_trim(0);
#endif
+ }
}
/* check if we're using the same allocator as the one that provides