From 5a1114ecdbbd115ec8aeb1a98326d793ff3e8058 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Sat, 23 Nov 2013 20:19:36 +0000 Subject: Drop the dependency on libgc in libmain Instead, libexpr now depends on libgc. This means commands like nix-store that don't do any evaluation no longer require libgc. --- src/libexpr/eval.cc | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src/libexpr/eval.cc') diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index e4a0d7fd2b..12c6aa8dcd 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -129,6 +129,14 @@ string showType(const Value & v) } +/* Called when the Boehm GC runs out of memory. */ +static void * oomHandler(size_t requested) +{ + /* Convert this to a proper C++ exception. */ + throw std::bad_alloc(); +} + + EvalState::EvalState() : sWith(symbols.create("")) , sOutPath(symbols.create("outPath")) @@ -158,6 +166,14 @@ EvalState::EvalState() #if HAVE_BOEHMGC static bool gcInitialised = false; if (!gcInitialised) { + + /* Initialise the Boehm garbage collector. This isn't + necessary on most platforms, but for portability we do it + anyway. */ + GC_INIT(); + + GC_oom_fn = oomHandler; + /* Set the initial heap size to something fairly big (25% of physical RAM, up to a maximum of 384 MiB) so that in most cases we don't need to garbage collect at all. (Collection @@ -181,6 +197,7 @@ EvalState::EvalState() debug(format("setting initial heap size to %1% bytes") % size); GC_expand_hp(size); } + gcInitialised = true; } #endif -- cgit 1.4.1