From 680e7a382f9ea03568aceaf71f3fbb8ced83f76c Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Tue, 6 Oct 2020 08:18:42 +0100 Subject: glibc's malloc is very bad about returning memory from the kernel, add a call to its malloc_trim to prompt it to do so. Reported by Sarunas Valaskevicius. --- compat.h | 4 ++++ configure.ac | 25 +++++++++++++++++++++++++ grid.c | 3 +++ 3 files changed, 32 insertions(+) diff --git a/compat.h b/compat.h index 4efad6ee..b213336f 100644 --- a/compat.h +++ b/compat.h @@ -27,6 +27,10 @@ #include #include +#ifdef HAVE_MALLOC_TRIM +#include +#endif + #ifdef HAVE_UTF8PROC #include #endif diff --git a/configure.ac b/configure.ac index 82be9254..8f26cabd 100644 --- a/configure.ac +++ b/configure.ac @@ -328,6 +328,31 @@ AC_SEARCH_LIBS(inet_ntoa, nsl) AC_SEARCH_LIBS(socket, socket) AC_CHECK_LIB(xnet, socket) +# Check if using glibc and have malloc_trim(3). The glibc free(3) is pretty bad +# about returning memory to the kernel unless the application tells it when to +# with malloc_trim(3). +AC_MSG_CHECKING(if free doesn't work very well) +AC_LINK_IFELSE([AC_LANG_SOURCE( + [ + #include + #ifdef __GLIBC__ + #include + int main(void) { + malloc_trim (0); + exit(0); + } + #else + no + #endif + ])], + found_malloc_trim=yes, + found_malloc_trim=no +) +AC_MSG_RESULT($found_malloc_trim) +if test "x$found_malloc_trim" = xyes; then + AC_DEFINE(HAVE_MALLOC_TRIM) +fi + # Check for CMSG_DATA. On some platforms like HP-UX this requires UNIX 95 # (_XOPEN_SOURCE and _XOPEN_SOURCE_EXTENDED) (see xopen_networking(7)). On # others, UNIX 03 (_XOPEN_SOURCE 600, see standards(7) on Solaris). diff --git a/grid.c b/grid.c index 96302fc3..90e1a0a5 100644 --- a/grid.c +++ b/grid.c @@ -265,6 +265,9 @@ grid_free_lines(struct grid *gd, u_int py, u_int ny) for (yy = py; yy < py + ny; yy++) grid_free_line(gd, yy); +#ifdef HAVE_MALLOC_TRIM + malloc_trim(0); +#endif } /* Create a new grid. */ -- cgit