From dfef293aa4217ed4044a1d566ad04c208195ea27 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 30 May 2024 13:20:56 +0200 Subject: [PATCH] Android: Fix find process and user PID recipe Before, the loop got finished after the very first failure of the pid command. Fix it so that the loop stops on the first successful execution of any child. Make timeout task return error, so that the loop continues executing after the timeout. Simplify some commands' constructions. Amends a7ece15f6ef9d74a575babb9da74e46332778ea1 Change-Id: I637002f0248ec69e61e058c7246471396aac1142 Reviewed-by: Alessandro Portale --- src/plugins/android/androidrunnerworker.cpp | 23 ++++++++++----------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index 7202c93f4cf..b5041917b09 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -628,17 +628,15 @@ void AndroidRunnerWorker::asyncStart() using namespace Tasking; const Storage pidStorage; - const LoopUntil iterator([pidStorage](int) { return pidStorage->first <= 0; }); const FilePath adbPath = AndroidConfig::adbToolPath(); const QStringList args = selector(); + const QString pidScript = m_isPreNougat + ? QString("for p in /proc/[0-9]*; do cat <$p/cmdline && echo :${p##*/}; done") + : QString("pidof -s '%1'").arg(m_packageName); - const auto onPidSetup = [adbPath, args, packageName = m_packageName, - isPreNougat = m_isPreNougat](Process &process) { - const QString pidScript = isPreNougat - ? QString("for p in /proc/[0-9]*; do cat <$p/cmdline && echo :${p##*/}; done") - : QString("pidof -s '%1'").arg(packageName); - process.setCommand({adbPath, args + QStringList{"shell", pidScript}}); + const auto onPidSetup = [adbPath, args, pidScript](Process &process) { + process.setCommand({adbPath, {args, "shell", pidScript}}); }; const auto onPidDone = [pidStorage, packageName = m_packageName, isPreNougat = m_isPreNougat](const Process &process) { @@ -650,8 +648,8 @@ void AndroidRunnerWorker::asyncStart() }; const auto onUserSetup = [pidStorage, adbPath, args](Process &process) { - process.setCommand({adbPath, args - + QStringList{"shell", "ps", "-o", "user", "-p", QString::number(pidStorage->first)}}); + process.setCommand({adbPath, {args, "shell", "ps", "-o", "user", "-p", + QString::number(pidStorage->first)}}); }; const auto onUserDone = [pidStorage](const Process &process) { const QString out = process.allOutput(); @@ -674,10 +672,11 @@ void AndroidRunnerWorker::asyncStart() const Group root { pidStorage, onGroupSetup([pidStorage] { *pidStorage = {-1, 0}; }), - Group { - iterator, + Forever { + stopOnSuccess, ProcessTask(onPidSetup, onPidDone, CallDoneIf::Success), - TimeoutTask([](std::chrono::milliseconds &timeout) { timeout = 200ms; }) + TimeoutTask([](std::chrono::milliseconds &timeout) { timeout = 200ms; }, + [] { return DoneResult::Error; }) }.withTimeout(45s), ProcessTask(onUserSetup, onUserDone, CallDoneIf::Success), onGroupDone([pidStorage, this] { onProcessIdChanged(*pidStorage); })