diff options
author | Nicholas Marriott <nicholas.marriott@gmail.com> | 2020-10-06 08:18:42 +0100 |
---|---|---|
committer | Nicholas Marriott <nicholas.marriott@gmail.com> | 2020-10-06 08:18:42 +0100 |
commit | 680e7a382f9ea03568aceaf71f3fbb8ced83f76c (patch) | |
tree | 8cacca7d0d2888c85816a261499256b74559d90b | |
parent | 847a061e31ceab5c94519fe25104e16de6a92f8d (diff) | |
download | rtmux-680e7a382f9ea03568aceaf71f3fbb8ced83f76c.tar.gz rtmux-680e7a382f9ea03568aceaf71f3fbb8ced83f76c.tar.bz2 rtmux-680e7a382f9ea03568aceaf71f3fbb8ced83f76c.zip |
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.
-rw-r--r-- | compat.h | 4 | ||||
-rw-r--r-- | configure.ac | 25 | ||||
-rw-r--r-- | grid.c | 3 |
3 files changed, 32 insertions, 0 deletions
@@ -27,6 +27,10 @@ #include <termios.h> #include <wchar.h> +#ifdef HAVE_MALLOC_TRIM +#include <malloc.h> +#endif + #ifdef HAVE_UTF8PROC #include <utf8proc.h> #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 <stdlib.h> + #ifdef __GLIBC__ + #include <malloc.h> + 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). @@ -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. */ |