From 58a91d70c9c6f22bbb5425f1e9973befe3fdebfb Mon Sep 17 00:00:00 2001 From: eldritch horrors Date: Sat, 20 Jul 2024 21:05:19 +0200 Subject: [PATCH] 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 --- .../build/drv-output-substitution-goal.hh | 6 ------ src/libstore/build/substitution-goal.cc | 19 ++++++------------- src/libstore/build/substitution-goal.hh | 4 +--- 3 files changed, 7 insertions(+), 22 deletions(-) diff --git a/src/libstore/build/drv-output-substitution-goal.hh b/src/libstore/build/drv-output-substitution-goal.hh index 008b211a1..47b9ecc49 100644 --- a/src/libstore/build/drv-output-substitution-goal.hh +++ b/src/libstore/build/drv-output-substitution-goal.hh @@ -4,7 +4,6 @@ #include "store-api.hh" #include "goal.hh" #include "realisation.hh" -#include #include namespace nix { @@ -41,11 +40,6 @@ class DrvOutputSubstitutionGoal : public Goal { */ std::shared_ptr sub; - /** - * The substituter thread. - */ - std::thread thr; - std::unique_ptr> maintainRunningSubstitutions; struct DownloadState 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(); - - 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); } diff --git a/src/libstore/build/substitution-goal.hh b/src/libstore/build/substitution-goal.hh index 1d389d328..52780a967 100644 --- a/src/libstore/build/substitution-goal.hh +++ b/src/libstore/build/substitution-goal.hh @@ -50,9 +50,7 @@ struct PathSubstitutionGoal : public Goal /** * The substituter thread. */ - std::thread thr; - - std::promise promise; + std::future thr; /** * Whether to try to repair a valid path.