diff --git a/packaging/dependencies.nix b/packaging/dependencies.nix index dda9ef8dc..17ba06b4d 100644 --- a/packaging/dependencies.nix +++ b/packaging/dependencies.nix @@ -50,9 +50,19 @@ scope: { requiredSystemFeatures = [ ]; }; - boehmgc = pkgs.boehmgc.override { - enableLargeConfig = true; - }; + boehmgc = + (pkgs.boehmgc.override { + enableLargeConfig = true; + }).overrideAttrs + (attrs: { + # Increase the initial mark stack size to avoid stack + # overflows, since these inhibit parallel marking (see + # GC_mark_some()). To check whether the mark stack is too + # small, run Nix with GC_PRINT_STATS=1 and look for messages + # such as `Mark stack overflow`, `No room to copy back mark + # stack`, and `Grew mark stack to ... frames`. + NIX_CFLAGS_COMPILE = "-DINITIAL_MARK_STACK_SIZE=1048576"; + }); # TODO Hack until https://github.com/NixOS/nixpkgs/issues/45462 is fixed. boost = diff --git a/src/libexpr/eval-gc.cc b/src/libexpr/eval-gc.cc index 5a4ecf035..b17336a90 100644 --- a/src/libexpr/eval-gc.cc +++ b/src/libexpr/eval-gc.cc @@ -15,8 +15,6 @@ # include # endif -# include -# include # include # include @@ -53,6 +51,9 @@ static inline void initGCReal() GC_INIT(); + /* Enable parallel marking. */ + GC_allow_register_threads(); + /* Register valid displacements in case we are using alignment niches for storing the type information. This way tagged pointers are considered to be valid, even when they are not aligned. */ diff --git a/src/libexpr/include/nix/expr/eval-gc.hh b/src/libexpr/include/nix/expr/eval-gc.hh index 25144d40c..813c2920d 100644 --- a/src/libexpr/include/nix/expr/eval-gc.hh +++ b/src/libexpr/include/nix/expr/eval-gc.hh @@ -3,12 +3,13 @@ #include -// For `NIX_USE_BOEHMGC`, and if that's set, `GC_THREADS` +// For `NIX_USE_BOEHMGC` #include "nix/expr/config.hh" #if NIX_USE_BOEHMGC # define GC_INCLUDE_NEW +# define GC_THREADS 1 # include # include diff --git a/src/libexpr/include/nix/expr/eval-inline.hh b/src/libexpr/include/nix/expr/eval-inline.hh index a1fd0ae4a..749e51537 100644 --- a/src/libexpr/include/nix/expr/eval-inline.hh +++ b/src/libexpr/include/nix/expr/eval-inline.hh @@ -6,9 +6,6 @@ #include "nix/expr/eval-error.hh" #include "nix/expr/eval-settings.hh" -// For `NIX_USE_BOEHMGC`, and if that's set, `GC_THREADS` -#include "nix/expr/config.hh" - namespace nix { /** diff --git a/src/libexpr/meson.build b/src/libexpr/meson.build index adf26008d..e1a12106d 100644 --- a/src/libexpr/meson.build +++ b/src/libexpr/meson.build @@ -61,8 +61,6 @@ if bdw_gc.found() define_value = cxx.has_function(funcspec).to_int() configdata_priv.set(define_name, define_value) endforeach - # Affects ABI, because it changes what bdw_gc itself does! - configdata_pub.set('GC_THREADS', 1) endif # Used in public header. Affects ABI! configdata_pub.set('NIX_USE_BOEHMGC', bdw_gc.found().to_int())