aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2015-02-24 00:06:54 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2015-03-02 00:03:51 +0100
commita399be7f24d58080282316d1ec529bf5aed67634 (patch)
treeb67c1fb82969a60d359875e0fd0e51b4d9ff1c98
parentef82d22045f7e08eb6ebcd84893d23286be72ba5 (diff)
downloadsciteco-a399be7f24d58080282316d1ec529bf5aed67634.tar.gz
try hard to free heap memory after command-line termination using malloc_trim()
* this is a Linux/glibc-only optimization
-rw-r--r--configure.ac5
-rw-r--r--src/cmdline.cpp15
2 files changed, 18 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac
index 77b71a7..e2f230f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -94,6 +94,11 @@ case $host in
;;
esac
+# Check for optional GNU libc features.
+# Will probably only be found on Linux.
+AC_CHECK_HEADERS([malloc.h])
+AC_CHECK_FUNCS([malloc_trim])
+
#
# Config options
#
diff --git a/src/cmdline.cpp b/src/cmdline.cpp
index 83a90b4..599a469 100644
--- a/src/cmdline.cpp
+++ b/src/cmdline.cpp
@@ -19,6 +19,10 @@
#include "config.h"
#endif
+#ifdef HAVE_MALLOC_H
+#include <malloc.h>
+#endif
+
#include <string.h>
#include <signal.h>
@@ -446,10 +450,17 @@ Cmdline::process_edit_cmd(gchar key)
str = NULL;
len = rubout_len = 0;
+#ifdef HAVE_MALLOC_TRIM
/*
- * FIXME: Perhaps to the malloc_trim() here
- * instead of in UndoStack::clear()
+ * Glibc/Linux-only optimization: Undo stacks can grow very
+ * large - sometimes large enough to make the system
+ * swap and become unresponsive.
+ * This will often reduce the amount of memory previously
+ * freed that's still allocated to the program immediately
+ * when the command-line is terminated:
*/
+ malloc_trim(0);
+#endif
} else {
insert(key);
}