aboutsummaryrefslogtreecommitdiff
path: root/src/libutil/serialise.hh
diff options
context:
space:
mode:
authorRobert Hensing <robert@roberthensing.nl>2020-10-30 20:55:53 +0100
committerRobert Hensing <robert@roberthensing.nl>2020-10-30 21:21:59 +0100
commitc4d903ddb009aa6472530699e154d85a24eac51d (patch)
tree684cdcab5dffc917082d5f997010babebb8e2706 /src/libutil/serialise.hh
parentdc5696b84f55a6706cddc3d747ef1aeffb564f43 (diff)
Fix memory corruption caused by GC-invisible coroutine stacks
Crucially this introduces BoehmGCStackAllocator, but it also adds a bunch of wiring to avoid making libutil depend on bdw-gc. Part of the solutions for #4178, #4200
Diffstat (limited to 'src/libutil/serialise.hh')
-rw-r--r--src/libutil/serialise.hh14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/libutil/serialise.hh b/src/libutil/serialise.hh
index d7fe0b81e..5c7d3ce76 100644
--- a/src/libutil/serialise.hh
+++ b/src/libutil/serialise.hh
@@ -5,6 +5,7 @@
#include "types.hh"
#include "util.hh"
+namespace boost::context { struct stack_context; }
namespace nix {
@@ -497,5 +498,18 @@ struct FramedSink : nix::BufferedSink
};
};
+/* Stack allocation strategy for sinkToSource.
+ Mutable to avoid a boehm gc dependency in libutil.
+
+ boost::context doesn't provide a virtual class, so we define our own.
+ */
+struct StackAllocator {
+ virtual boost::context::stack_context allocate() = 0;
+ virtual void deallocate(boost::context::stack_context sctx) = 0;
+
+ /* The stack allocator to use in sinkToSource and potentially elsewhere.
+ It is reassigned by the initGC() method in libexpr. */
+ static StackAllocator *defaultAllocator;
+};
}