diff options
author | AmineChikhaoui <amine.chikhaoui91@gmail.com> | 2017-10-25T15·13+0100 |
---|---|---|
committer | AmineChikhaoui <amine.chikhaoui91@gmail.com> | 2017-10-25T15·13+0100 |
commit | 9f01a3f0a87679ac3ba2c71ab6d31478bcbef481 (patch) | |
tree | 1fcb4095a7f2da1cd281023ee0e86a782777d528 /src | |
parent | 82327e3cc474be3c72a22480ad6e219f072e27e0 (diff) |
attempt to fix #1630: make the queries of store paths run in parallel using a thread pool
Diffstat (limited to 'src')
-rw-r--r-- | src/libstore/store-api.cc | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc index c57e42fec00d..82e0bda5468c 100644 --- a/src/libstore/store-api.cc +++ b/src/libstore/store-api.cc @@ -389,8 +389,9 @@ PathSet Store::queryValidPaths(const PathSet & paths, SubstituteFlag maybeSubsti Sync<State> state_(State{paths.size(), PathSet()}); std::condition_variable wakeup; + ThreadPool pool; - for (auto & path : paths) + auto doQuery = [&](const Path & path ) { queryPathInfo(path, [path, &state_, &wakeup](ref<ValidPathInfo> info) { auto state(state_.lock()); @@ -411,6 +412,12 @@ PathSet Store::queryValidPaths(const PathSet & paths, SubstituteFlag maybeSubsti if (!--state->left) wakeup.notify_one(); }); + }; + + for (auto & path : paths) + pool.enqueue(std::bind(doQuery, path)); + + pool.process(); while (true) { auto state(state_.lock()); |