forked from qt-creator/qt-creator
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:
@@ -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
|
||||||
|
? 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,
|
const auto onPidSetup = [adbPath, args, pidScript](Process &process) {
|
||||||
isPreNougat = m_isPreNougat](Process &process) {
|
process.setCommand({adbPath, {args, "shell", pidScript}});
|
||||||
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 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); })
|
||||||
|
Reference in New Issue
Block a user