aboutsummaryrefslogtreecommitdiff
path: root/src/nix-prefetch-url/nix-prefetch-url.cc
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2018-06-12 17:26:36 +0200
committerEelco Dolstra <edolstra@gmail.com>2018-06-12 17:49:55 +0200
commit0629601da1d163a059fa19004256961f8ecdeb78 (patch)
treeb69f528da3cfa0a33395216fc4224bb4a27f6af4 /src/nix-prefetch-url/nix-prefetch-url.cc
parentc905d8b0a84877d3cab10d4a8b8ad81895a6500e (diff)
Move EvalState from the stack to the heap
EvalState contains a few counters (e.g. nrValues) that increase quickly enough that they end up being interpreted as pointers by the garbage collector. Moving it to the heap makes them invisible to the garbage collector. This reduces the max RSS doing 100 evaluations of nixos.tests.firefox.x86_64-linux.drvPath from 455 MiB to 292 MiB. Note: ideally, allocations would be much further up in the 64-bit address space to reduce the odds of an integer being misinterpreted as a pointer. Maybe we can use some linker magic to move the .bss segment to a higher address.
Diffstat (limited to 'src/nix-prefetch-url/nix-prefetch-url.cc')
-rw-r--r--src/nix-prefetch-url/nix-prefetch-url.cc28
1 files changed, 14 insertions, 14 deletions
diff --git a/src/nix-prefetch-url/nix-prefetch-url.cc b/src/nix-prefetch-url/nix-prefetch-url.cc
index fa7ee2545..50b2c2803 100644
--- a/src/nix-prefetch-url/nix-prefetch-url.cc
+++ b/src/nix-prefetch-url/nix-prefetch-url.cc
@@ -95,9 +95,9 @@ int main(int argc, char * * argv)
throw UsageError("too many arguments");
auto store = openStore();
- EvalState state(myArgs.searchPath, store);
+ auto state = std::make_unique<EvalState>(myArgs.searchPath, store);
- Bindings & autoArgs = *myArgs.getAutoArgs(state);
+ Bindings & autoArgs = *myArgs.getAutoArgs(*state);
/* If -A is given, get the URI from the specified Nix
expression. */
@@ -107,33 +107,33 @@ int main(int argc, char * * argv)
throw UsageError("you must specify a URI");
uri = args[0];
} else {
- Path path = resolveExprPath(lookupFileArg(state, args.empty() ? "." : args[0]));
+ Path path = resolveExprPath(lookupFileArg(*state, args.empty() ? "." : args[0]));
Value vRoot;
- state.evalFile(path, vRoot);
- Value & v(*findAlongAttrPath(state, attrPath, autoArgs, vRoot));
- state.forceAttrs(v);
+ state->evalFile(path, vRoot);
+ Value & v(*findAlongAttrPath(*state, attrPath, autoArgs, vRoot));
+ state->forceAttrs(v);
/* Extract the URI. */
- auto attr = v.attrs->find(state.symbols.create("urls"));
+ auto attr = v.attrs->find(state->symbols.create("urls"));
if (attr == v.attrs->end())
throw Error("attribute set does not contain a 'urls' attribute");
- state.forceList(*attr->value);
+ state->forceList(*attr->value);
if (attr->value->listSize() < 1)
throw Error("'urls' list is empty");
- uri = state.forceString(*attr->value->listElems()[0]);
+ uri = state->forceString(*attr->value->listElems()[0]);
/* Extract the hash mode. */
- attr = v.attrs->find(state.symbols.create("outputHashMode"));
+ attr = v.attrs->find(state->symbols.create("outputHashMode"));
if (attr == v.attrs->end())
printInfo("warning: this does not look like a fetchurl call");
else
- unpack = state.forceString(*attr->value) == "recursive";
+ unpack = state->forceString(*attr->value) == "recursive";
/* Extract the name. */
if (name.empty()) {
- attr = v.attrs->find(state.symbols.create("name"));
+ attr = v.attrs->find(state->symbols.create("name"));
if (attr != v.attrs->end())
- name = state.forceString(*attr->value);
+ name = state->forceString(*attr->value);
}
}
@@ -158,7 +158,7 @@ int main(int argc, char * * argv)
if (storePath.empty()) {
- auto actualUri = resolveMirrorUri(state, uri);
+ auto actualUri = resolveMirrorUri(*state, uri);
/* Download the file. */
DownloadRequest req(actualUri);