aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compat.h4
-rw-r--r--configure.ac25
-rw-r--r--grid.c3
3 files changed, 32 insertions, 0 deletions
diff --git a/compat.h b/compat.h
index 4efad6ee..b213336f 100644
--- a/compat.h
+++ b/compat.h
@@ -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).
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. */