From 1a2a81b1378d0e60c72518e7b1cfc1194d58ced3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Mon, 22 Nov 2021 13:19:54 +0100 Subject: [PATCH] logic: fix extensive wait for short-lived processes (#1227) --- src/lib_gui/utility/utilityApp.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/lib_gui/utility/utilityApp.cpp b/src/lib_gui/utility/utilityApp.cpp index 175e67a0..402527c1 100644 --- a/src/lib_gui/utility/utilityApp.cpp +++ b/src/lib_gui/utility/utilityApp.cpp @@ -44,6 +44,20 @@ std::wstring utility::searchPath(const std::wstring& bin) return searchPath(bin, ok); } +namespace { +template +bool safely_wait_for(boost::process::child& process, const std::chrono::duration< Rep, Period > & rel_time) +{ + // This wrapper around boost::process::wait_for handles the following edge case: + // Calling wait_for on an already exitted process will wait for the entire timeout. + if (process.running()) { + return process.wait_for(rel_time); + } else { + return true; // The process exitted + } +} +} + utility::ProcessOutput utility::executeProcess( const std::wstring& command, const std::vector& arguments, @@ -148,7 +162,7 @@ utility::ProcessOutput utility::executeProcess( { if (waitUntilNoOutput) { - while (!process->wait_for(std::chrono::milliseconds(timeout))) + while (!safely_wait_for(*process, std::chrono::milliseconds(timeout))) { if (!outputReceived) { @@ -164,7 +178,7 @@ utility::ProcessOutput utility::executeProcess( } else { - if (!process->wait_for(std::chrono::milliseconds(timeout))) + if (!safely_wait_for(*process, std::chrono::milliseconds(timeout))) { LOG_WARNING( "Canceling process because it timed out after " +