@@ -194,6 +194,15 @@ static Symbol getName(const AttrName & name, EvalState & state, Env & env)
194194
195195static constexpr size_t BASE_ENV_SIZE = 128 ;
196196
197+ EvalMemory::EvalMemory ()
198+ #if NIX_USE_BOEHMGC
199+ : valueAllocCache(std::allocate_shared<void *>(traceable_allocator<void *>(), nullptr ))
200+ , env1AllocCache(std::allocate_shared<void *>(traceable_allocator<void *>(), nullptr ))
201+ #endif
202+ {
203+ assertGCInitialized ();
204+ }
205+
197206EvalState::EvalState (
198207 const LookupPath & lookupPathFromArguments,
199208 ref<Store> store,
@@ -267,12 +276,10 @@ EvalState::EvalState(
267276 , fileEvalCache(make_ref<decltype (fileEvalCache)::element_type>())
268277 , regexCache(makeRegexCache())
269278#if NIX_USE_BOEHMGC
270- , valueAllocCache(std::allocate_shared<void *>(traceable_allocator<void *>(), nullptr ))
271- , env1AllocCache(std::allocate_shared<void *>(traceable_allocator<void *>(), nullptr ))
272- , baseEnvP(std::allocate_shared<Env *>(traceable_allocator<Env *>(), &allocEnv (BASE_ENV_SIZE)))
279+ , baseEnvP(std::allocate_shared<Env *>(traceable_allocator<Env *>(), &mem.allocEnv(BASE_ENV_SIZE)))
273280 , baseEnv(**baseEnvP)
274281#else
275- , baseEnv(allocEnv(BASE_ENV_SIZE))
282+ , baseEnv(mem. allocEnv(BASE_ENV_SIZE))
276283#endif
277284 , staticBaseEnv{std::make_shared<StaticEnv>(nullptr , nullptr )}
278285{
@@ -281,8 +288,6 @@ EvalState::EvalState(
281288
282289 countCalls = getEnv (" NIX_COUNT_CALLS" ).value_or (" 0" ) != " 0" ;
283290
284- assertGCInitialized ();
285-
286291 static_assert (sizeof (Env) <= 16 , " environment must be <= 16 bytes" );
287292 static_assert (sizeof (Counter) == 64 , " counters must be 64 bytes" );
288293
@@ -878,11 +883,10 @@ inline Value * EvalState::lookupVar(Env * env, const ExprVar & var, bool noEval)
878883 }
879884}
880885
881- ListBuilder::ListBuilder (EvalState & state, size_t size)
886+ ListBuilder::ListBuilder (size_t size)
882887 : size(size)
883888 , elems(size <= 2 ? inlineElems : (Value **) allocBytes(size * sizeof (Value *)))
884889{
885- state.nrListElems += size;
886890}
887891
888892Value * EvalState::getBool (bool b)
@@ -1176,7 +1180,7 @@ void ExprPath::eval(EvalState & state, Env & env, Value & v)
11761180
11771181Env * ExprAttrs::buildInheritFromEnv (EvalState & state, Env & up)
11781182{
1179- Env & inheritEnv = state.allocEnv (inheritFromExprs->size ());
1183+ Env & inheritEnv = state.mem . allocEnv (inheritFromExprs->size ());
11801184 inheritEnv.up = &up;
11811185
11821186 Displacement displ = 0 ;
@@ -1195,7 +1199,7 @@ void ExprAttrs::eval(EvalState & state, Env & env, Value & v)
11951199 if (recursive) {
11961200 /* Create a new environment that contains the attributes in
11971201 this `rec'. */
1198- Env & env2 (state.allocEnv (attrs.size ()));
1202+ Env & env2 (state.mem . allocEnv (attrs.size ()));
11991203 env2.up = &env;
12001204 dynamicEnv = &env2;
12011205 Env * inheritEnv = inheritFromExprs ? buildInheritFromEnv (state, env2) : nullptr ;
@@ -1287,7 +1291,7 @@ void ExprLet::eval(EvalState & state, Env & env, Value & v)
12871291{
12881292 /* Create a new environment that contains the attributes in this
12891293 `let'. */
1290- Env & env2 (state.allocEnv (attrs->attrs .size ()));
1294+ Env & env2 (state.mem . allocEnv (attrs->attrs .size ()));
12911295 env2.up = &env;
12921296
12931297 Env * inheritEnv = attrs->inheritFromExprs ? attrs->buildInheritFromEnv (state, env2) : nullptr ;
@@ -1493,7 +1497,7 @@ void EvalState::callFunction(Value & fun, std::span<Value *> args, Value & vRes,
14931497 ExprLambda & lambda (*vCur.lambda ().fun );
14941498
14951499 auto size = (!lambda.arg ? 0 : 1 ) + (lambda.hasFormals () ? lambda.formals ->formals .size () : 0 );
1496- Env & env2 (allocEnv (size));
1500+ Env & env2 (mem. allocEnv (size));
14971501 env2.up = vCur.lambda ().env ;
14981502
14991503 Displacement displ = 0 ;
@@ -1782,7 +1786,7 @@ values, or passed explicitly with '--arg' or '--argstr'. See
17821786
17831787void ExprWith::eval (EvalState & state, Env & env, Value & v)
17841788{
1785- Env & env2 (state.allocEnv (1 ));
1789+ Env & env2 (state.mem . allocEnv (1 ));
17861790 env2.up = &env;
17871791 env2.values [0 ] = attrs->maybeThunk (state, env);
17881792
@@ -2909,10 +2913,12 @@ void EvalState::printStatistics()
29092913 std::chrono::microseconds cpuTimeDuration = getCpuUserTime ();
29102914 float cpuTime = std::chrono::duration_cast<std::chrono::duration<float >>(cpuTimeDuration).count ();
29112915
2912- uint64_t bEnvs = nrEnvs * sizeof (Env) + nrValuesInEnvs * sizeof (Value *);
2913- uint64_t bLists = nrListElems * sizeof (Value *);
2914- uint64_t bValues = nrValues * sizeof (Value);
2915- uint64_t bAttrsets = nrAttrsets * sizeof (Bindings) + nrAttrsInAttrsets * sizeof (Attr);
2916+ auto & memstats = mem.getStats ();
2917+
2918+ uint64_t bEnvs = memstats.nrEnvs * sizeof (Env) + memstats.nrValuesInEnvs * sizeof (Value *);
2919+ uint64_t bLists = memstats.nrListElems * sizeof (Value *);
2920+ uint64_t bValues = memstats.nrValues * sizeof (Value);
2921+ uint64_t bAttrsets = memstats.nrAttrsets * sizeof (Bindings) + memstats.nrAttrsInAttrsets * sizeof (Attr);
29162922
29172923#if NIX_USE_BOEHMGC
29182924 GC_word heapSize, totalBytes;
@@ -2938,28 +2944,28 @@ void EvalState::printStatistics()
29382944#endif
29392945 };
29402946 topObj[" envs" ] = {
2941- {" number" , nrEnvs.load ()},
2942- {" elements" , nrValuesInEnvs.load ()},
2947+ {" number" , memstats. nrEnvs .load ()},
2948+ {" elements" , memstats. nrValuesInEnvs .load ()},
29432949 {" bytes" , bEnvs},
29442950 };
29452951 topObj[" nrExprs" ] = Expr::nrExprs.load ();
29462952 topObj[" list" ] = {
2947- {" elements" , nrListElems.load ()},
2953+ {" elements" , memstats. nrListElems .load ()},
29482954 {" bytes" , bLists},
29492955 {" concats" , nrListConcats.load ()},
29502956 };
29512957 topObj[" values" ] = {
2952- {" number" , nrValues.load ()},
2958+ {" number" , memstats. nrValues .load ()},
29532959 {" bytes" , bValues},
29542960 };
29552961 topObj[" symbols" ] = {
29562962 {" number" , symbols.size ()},
29572963 {" bytes" , symbols.totalSize ()},
29582964 };
29592965 topObj[" sets" ] = {
2960- {" number" , nrAttrsets.load ()},
2966+ {" number" , memstats. nrAttrsets .load ()},
29612967 {" bytes" , bAttrsets},
2962- {" elements" , nrAttrsInAttrsets.load ()},
2968+ {" elements" , memstats. nrAttrsInAttrsets .load ()},
29632969 };
29642970 topObj[" sizes" ] = {
29652971 {" Env" , sizeof (Env)},
0 commit comments