about summary refs log tree commit diff
path: root/src/libexpr
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2011-02-09T22·59+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2011-02-09T22·59+0000
commit5a6b0398026a8a24b206a4b4d43894f9c683792c (patch)
tree4ad0c552602151a329dc9cf7970f08b739c2b4f2 /src/libexpr
parentf1462c208ba5d4efda864875f814c268366f4803 (diff)
* Don't call GC_expand_hp unless we're actually using the garbage
  collector.

Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/eval.cc18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 3ef17c36a287..b95c9a6d1765 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -151,6 +151,24 @@ EvalState::EvalState()
     createBaseEnv();
     
     allowUnsafeEquality = getEnv("NIX_NO_UNSAFE_EQ", "") == "";
+
+#if HAVE_BOEHMGC
+    static bool gcInitialised = true;
+    if (gcInitialised) {
+        /* Set the initial heap size to something fairly big (384 MiB)
+           so that in most cases we don't need to garbage collect at
+           all.  (Collection has a fairly significant overhead.)  The
+           heap size can be overriden through libgc's
+           GC_INITIAL_HEAP_SIZE environment variable.  We should
+           probably also provide a nix.conf setting for this.  Note
+           that GC_expand_hp() causes a lot of virtual, but not
+           physical (resident) memory to be allocated.  This might be
+           a problem on systems that don't overcommit. */
+        if (!getenv("GC_INITIAL_HEAP_SIZE"))
+            GC_expand_hp(384 * 1024 * 1024);
+        gcInitialised = true;
+    }
+#endif
 }