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 a7ece15f6e

Change-Id: I637002f0248ec69e61e058c7246471396aac1142
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Jarek Kobus
2024-05-30 13:20:56 +02:00
parent 831b93905b
commit dfef293aa4

View File

@@ -628,17 +628,15 @@ void AndroidRunnerWorker::asyncStart()
using namespace Tasking; using namespace Tasking;
const Storage<PidUserPair> pidStorage; const Storage<PidUserPair> pidStorage;
const LoopUntil iterator([pidStorage](int) { return pidStorage->first <= 0; });
const FilePath adbPath = AndroidConfig::adbToolPath(); const FilePath adbPath = AndroidConfig::adbToolPath();
const QStringList args = selector(); const QStringList args = selector();
const QString pidScript = m_isPreNougat
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("for p in /proc/[0-9]*; do cat <$p/cmdline && echo :${p##*/}; done")
: QString("pidof -s '%1'").arg(packageName); : QString("pidof -s '%1'").arg(m_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, const auto onPidDone = [pidStorage, packageName = m_packageName,
isPreNougat = m_isPreNougat](const Process &process) { isPreNougat = m_isPreNougat](const Process &process) {
@@ -650,8 +648,8 @@ void AndroidRunnerWorker::asyncStart()
}; };
const auto onUserSetup = [pidStorage, adbPath, args](Process &process) { const auto onUserSetup = [pidStorage, adbPath, args](Process &process) {
process.setCommand({adbPath, args process.setCommand({adbPath, {args, "shell", "ps", "-o", "user", "-p",
+ QStringList{"shell", "ps", "-o", "user", "-p", QString::number(pidStorage->first)}}); QString::number(pidStorage->first)}});
}; };
const auto onUserDone = [pidStorage](const Process &process) { const auto onUserDone = [pidStorage](const Process &process) {
const QString out = process.allOutput(); const QString out = process.allOutput();
@@ -674,10 +672,11 @@ void AndroidRunnerWorker::asyncStart()
const Group root { const Group root {
pidStorage, pidStorage,
onGroupSetup([pidStorage] { *pidStorage = {-1, 0}; }), onGroupSetup([pidStorage] { *pidStorage = {-1, 0}; }),
Group { Forever {
iterator, stopOnSuccess,
ProcessTask(onPidSetup, onPidDone, CallDoneIf::Success), ProcessTask(onPidSetup, onPidDone, CallDoneIf::Success),
TimeoutTask([](std::chrono::milliseconds &timeout) { timeout = 200ms; }) TimeoutTask([](std::chrono::milliseconds &timeout) { timeout = 200ms; },
[] { return DoneResult::Error; })
}.withTimeout(45s), }.withTimeout(45s),
ProcessTask(onUserSetup, onUserDone, CallDoneIf::Success), ProcessTask(onUserSetup, onUserDone, CallDoneIf::Success),
onGroupDone([pidStorage, this] { onProcessIdChanged(*pidStorage); }) onGroupDone([pidStorage, this] { onProcessIdChanged(*pidStorage); })