summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nix/libstore/local-store.cc25
-rw-r--r--nix/libstore/local-store.hh5
2 files changed, 15 insertions, 15 deletions
diff --git a/nix/libstore/local-store.cc b/nix/libstore/local-store.cc
index 4219573a56..c304e2ddd1 100644
--- a/nix/libstore/local-store.cc
+++ b/nix/libstore/local-store.cc
@@ -850,14 +850,7 @@ PathSet LocalStore::querySubstitutablePaths(const PathSet & paths)
if (!settings.useSubstitutes || paths.empty()) return res;
- if (!runningSubstituter) {
- const Strings args = { "substitute", "--query" };
- const std::map<string, string> env = { { "_NIX_OPTIONS", settings.pack() } };
- std::unique_ptr<Agent> fresh(new Agent(settings.guixProgram, args, env));
- runningSubstituter.swap(fresh);
- }
-
- Agent & run = *runningSubstituter;
+ Agent & run = *substituter();
string s = "have ";
foreach (PathSet::const_iterator, j, paths)
@@ -877,18 +870,22 @@ PathSet LocalStore::querySubstitutablePaths(const PathSet & paths)
}
-void LocalStore::querySubstitutablePathInfos(PathSet & paths, SubstitutablePathInfos & infos)
+std::shared_ptr<Agent> LocalStore::substituter()
{
- if (!settings.useSubstitutes) return;
-
if (!runningSubstituter) {
const Strings args = { "substitute", "--query" };
const std::map<string, string> env = { { "_NIX_OPTIONS", settings.pack() } };
- std::unique_ptr<Agent> fresh(new Agent(settings.guixProgram, args, env));
- runningSubstituter.swap(fresh);
+ runningSubstituter = std::make_shared<Agent>(settings.guixProgram, args, env);
}
- Agent & run = *runningSubstituter;
+ return runningSubstituter;
+}
+
+void LocalStore::querySubstitutablePathInfos(PathSet & paths, SubstitutablePathInfos & infos)
+{
+ if (!settings.useSubstitutes) return;
+
+ Agent & run = *substituter();
string s = "info ";
foreach (PathSet::const_iterator, i, paths)
diff --git a/nix/libstore/local-store.hh b/nix/libstore/local-store.hh
index 57d15bac7e..9ba37219da 100644
--- a/nix/libstore/local-store.hh
+++ b/nix/libstore/local-store.hh
@@ -42,7 +42,10 @@ class LocalStore : public StoreAPI
{
private:
/* The currently running substituter or empty. */
- std::unique_ptr<Agent> runningSubstituter;
+ std::shared_ptr<Agent> runningSubstituter;
+
+ /* Ensure the substituter is running and return it. */
+ std::shared_ptr<Agent> substituter();
Path linksDir;