diff options
author | Théophane Hufschmitt <7226587+thufschmitt@users.noreply.github.com> | 2023-03-08 09:51:46 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-08 09:51:46 +0100 |
commit | 4a6244dcf7ece2b75d30f070feb362281de15749 (patch) | |
tree | 33f365c265ae6cfde7782b30ccf494f87079be30 /src/libexpr/eval.cc | |
parent | ba0486f045d4f7f304bd8c4a939ca2e658affcc8 (diff) | |
parent | 2683734936760dad87a33710d0264266aea96ca4 (diff) |
Merge pull request #7725 from yorickvP/check-coro-gc
Disable GC during coroutine execution + test
Diffstat (limited to 'src/libexpr/eval.cc')
-rw-r--r-- | src/libexpr/eval.cc | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 2721b6733..3e8857fc8 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -325,6 +325,22 @@ static Symbol getName(const AttrName & name, EvalState & state, Env & env) } } +#if HAVE_BOEHMGC +/* Disable GC while this object lives. Used by CoroutineContext. + * + * Boehm keeps a count of GC_disable() and GC_enable() calls, + * and only enables GC when the count matches. + */ +class BoehmDisableGC { +public: + BoehmDisableGC() { + GC_disable(); + }; + ~BoehmDisableGC() { + GC_enable(); + }; +}; +#endif static bool gcInitialised = false; @@ -349,6 +365,15 @@ void initGC() StackAllocator::defaultAllocator = &boehmGCStackAllocator; + +#if NIX_BOEHM_PATCH_VERSION != 1 + printTalkative("Unpatched BoehmGC, disabling GC inside coroutines"); + /* Used to disable GC when entering coroutines on macOS */ + create_coro_gc_hook = []() -> std::shared_ptr<void> { + return std::make_shared<BoehmDisableGC>(); + }; +#endif + /* 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 has a |