aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/build/substitution-goal.cc
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-07-20 21:05:19 +0200
committereldritch horrors <pennae@lix.systems>2024-07-22 19:01:40 +0000
commit58a91d70c9c6f22bbb5425f1e9973befe3fdebfb (patch)
tree001e6d080fa4fb3964ce9f6421078382e5b1e3b7 /src/libstore/build/substitution-goal.cc
parentad36fb43ada8b4b31a10f6a7e1bade9f00aaa661 (diff)
libstore: use std::async instead of Goal threads
the goals are either already using std::async and merely forgot to remove std::thread vestiges or they emulate async with threads and promises. we can simply use async directly everywhere for clarity. Change-Id: I3f05098310a25984f10fff1e68c573329002b500
Diffstat (limited to 'src/libstore/build/substitution-goal.cc')
-rw-r--r--src/libstore/build/substitution-goal.cc19
1 files changed, 6 insertions, 13 deletions
diff --git a/src/libstore/build/substitution-goal.cc b/src/libstore/build/substitution-goal.cc
index cc4cb3c8c..1330f061c 100644
--- a/src/libstore/build/substitution-goal.cc
+++ b/src/libstore/build/substitution-goal.cc
@@ -214,9 +214,7 @@ void PathSubstitutionGoal::tryToRun()
outPipe.create();
- promise = std::promise<void>();
-
- thr = std::thread([this]() {
+ thr = std::async(std::launch::async, [this]() {
auto & fetchPath = subPath ? *subPath : storePath;
try {
ReceiveInterrupts receiveInterrupts;
@@ -230,16 +228,12 @@ void PathSubstitutionGoal::tryToRun()
copyStorePath(
*sub, worker.store, fetchPath, repair, sub->isTrusted ? NoCheckSigs : CheckSigs
);
-
- promise.set_value();
} catch (const EndOfFile &) {
- promise.set_exception(std::make_exception_ptr(EndOfFile(
+ throw EndOfFile(
"NAR for '%s' fetched from '%s' is incomplete",
sub->printStorePath(fetchPath),
sub->getUri()
- )));
- } catch (...) {
- promise.set_exception(std::current_exception());
+ );
}
});
@@ -253,11 +247,10 @@ void PathSubstitutionGoal::finished()
{
trace("substitute finished");
- thr.join();
worker.childTerminated(this);
try {
- promise.get_future().get();
+ thr.get();
} catch (std::exception & e) {
printError(e.what());
@@ -316,9 +309,9 @@ void PathSubstitutionGoal::handleEOF(int fd)
void PathSubstitutionGoal::cleanup()
{
try {
- if (thr.joinable()) {
+ if (thr.valid()) {
// FIXME: signal worker thread to quit.
- thr.join();
+ thr.get();
worker.childTerminated(this);
}