refactor(tvix): completely remove boehm gc

We have decided that leaking memory is a better fate than random,
non-debuggable memory corruption. Future CLs will begin changing
various fields to std::unique_ptr and std::shared_ptr.

It turns out that disabling the GC does not have disasterous impact.
The Nix evaluator only runs on the client CLI, never in any long-
running process. Even the REPL does not leak too badly under this
change, because it uses one EvalState for the duration of the REPL.

Building an explicitly tracing garbage collector is likely in the
future of this project, but that giant amount of work cannot be
done under a nix evaluator that is constantly crashing. We need to
restore development velocity here, and this is the best way we've
figured out to do it.

Change-Id: I2fcda8fcee853c15a9a5e22eca7c5a784bc2bf76
Reviewed-on: https://cl.tvl.fyi/c/depot/+/1720
Reviewed-by: glittershark <grfn@gws.fyi>
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
This commit is contained in:
Kane York 2020-08-13 15:18:40 -07:00 committed by kanepyork
parent d4f5fcef66
commit 72e61aa584
15 changed files with 51 additions and 170 deletions

View file

@ -3,9 +3,6 @@
#include <tuple>
#include <vector>
#include <gc/gc_allocator.h>
#include <gc/gc_cpp.h>
#include "libexpr/symbol-table.hh"
#include "libutil/types.hh"
@ -66,32 +63,32 @@ struct Value;
the inputSrcs of the derivations.
For canonicity, the store paths should be in sorted order. */
struct NixString : public gc {
struct NixString {
const char* s;
const char** context; // must be in sorted order
};
struct NixThunk : public gc {
struct NixThunk {
Env* env;
Expr* expr;
};
struct NixApp : public gc {
struct NixApp {
Value *left, *right;
};
struct NixLambda : public gc {
struct NixLambda {
Env* env;
ExprLambda* fun;
};
struct NixPrimOpApp : public gc {
struct NixPrimOpApp {
Value *left, *right;
};
using NixList = std::vector<Value*, traceable_allocator<Value*>>;
using NixList = std::vector<Value*>;
struct Value : public gc {
struct Value {
ValueType type;
union { // TODO(tazjin): std::variant
NixInt integer;
@ -177,9 +174,7 @@ void mkPath(Value& v, const char* s);
not included. */
size_t valueSize(const Value& v);
typedef std::map<Symbol, Value*, std::less<Symbol>,
traceable_allocator<std::pair<const Symbol, Value*>>>
ValueMap;
using ValueMap = std::map<Symbol, Value*>;
std::shared_ptr<Value*> allocRootValue(Value* v);