diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2010-10-29T15·04+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2010-10-29T15·04+0000 |
commit | 4aced7f8d0d5d2c1057b0f46a70a37a577f81fa5 (patch) | |
tree | 1908294aa8f029be6bc4c0f227074391dbaeee9b /src/libmain | |
parent | 8dadcede65c75488da4cc5e5d8266c4b176cb7e5 (diff) | |
parent | 26def5392f6f6364aa0939a2d4fc7705e786d38d (diff) |
* Merge the GC branch.
Diffstat (limited to 'src/libmain')
-rw-r--r-- | src/libmain/Makefile.am | 2 | ||||
-rw-r--r-- | src/libmain/shared.cc | 32 |
2 files changed, 33 insertions, 1 deletions
diff --git a/src/libmain/Makefile.am b/src/libmain/Makefile.am index a9ee6604255e..1a2146e0448f 100644 --- a/src/libmain/Makefile.am +++ b/src/libmain/Makefile.am @@ -2,7 +2,7 @@ pkglib_LTLIBRARIES = libmain.la libmain_la_SOURCES = shared.cc -libmain_la_LIBADD = ../libstore/libstore.la +libmain_la_LIBADD = ../libstore/libstore.la @boehmgc_lib@ pkginclude_HEADERS = shared.hh diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index eddc4e64b3d7..29fc13e33627 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -13,6 +13,10 @@ #include <sys/stat.h> #include <unistd.h> +#if HAVE_BOEHMGC +#include <gc/gc.h> +#endif + namespace nix { @@ -314,6 +318,14 @@ static void setuidInit() } +/* 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(); +} + + } @@ -335,6 +347,26 @@ int main(int argc, char * * argv) std::ios::sync_with_stdio(false); +#if HAVE_BOEHMGC + /* 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 (384 MiB) so + that in most cases we don't need to garbage collect at all. + (Collection has a fairly significant overhead, some.) 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); +#endif + try { try { initAndRun(argc, argv); |