IosToolHandler: Don't call stop() from the other thread

Task-number: QTCREATORBUG-30633
Change-Id: I0ddb354dbd3be685919b98589a5f0d534bd30dbe
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Jarek Kobus
2024-06-13 14:35:25 +02:00
parent f22660facb
commit 81ed276828

View File

@@ -848,6 +848,16 @@ void IosSimulatorToolHandlerPrivate::installAppOnSimulator()
futureSynchronizer.addFuture(Utils::onResultReady(installFuture, q, onResponseAppInstall)); futureSynchronizer.addFuture(Utils::onResultReady(installFuture, q, onResponseAppInstall));
} }
#ifdef Q_OS_UNIX
static void monitorPid(QPromise<void> &promise, qint64 pid)
{
do {
// Poll every 1 sec to check whether the app is running.
QThread::msleep(1000);
} while (!promise.isCanceled() && kill(pid, 0) == 0);
}
#endif
void IosSimulatorToolHandlerPrivate::launchAppOnSimulator(const QStringList &extraArgs) void IosSimulatorToolHandlerPrivate::launchAppOnSimulator(const QStringList &extraArgs)
{ {
const QString bundleId = SimulatorControl::bundleIdentifier(m_bundlePath); const QString bundleId = SimulatorControl::bundleIdentifier(m_bundlePath);
@@ -871,21 +881,7 @@ void IosSimulatorToolHandlerPrivate::launchAppOnSimulator(const QStringList &ext
"Install Xcode 8 or later.").arg(bundleId)); "Install Xcode 8 or later.").arg(bundleId));
} }
auto monitorPid = [this](QPromise<void> &promise, qint64 pid) { auto onResponseAppLaunch = [this, captureConsole, stdoutFile, stderrFile](
#ifdef Q_OS_UNIX
do {
// Poll every 1 sec to check whether the app is running.
QThread::msleep(1000);
} while (!promise.isCanceled() && kill(pid, 0) == 0);
#else
Q_UNUSED(pid)
#endif
// Future is cancelled if the app is stopped from the qt creator.
if (!promise.isCanceled())
stop(0);
};
auto onResponseAppLaunch = [this, captureConsole, monitorPid, stdoutFile, stderrFile](
const SimulatorControl::Response &response) { const SimulatorControl::Response &response) {
if (response) { if (response) {
if (!isResponseValid(*response)) if (!isResponseValid(*response))
@@ -893,8 +889,15 @@ void IosSimulatorToolHandlerPrivate::launchAppOnSimulator(const QStringList &ext
m_pid = response->inferiorPid; m_pid = response->inferiorPid;
gotInferiorPid(m_bundlePath, m_deviceId, response->inferiorPid); gotInferiorPid(m_bundlePath, m_deviceId, response->inferiorPid);
didStartApp(m_bundlePath, m_deviceId, Ios::IosToolHandler::Success); didStartApp(m_bundlePath, m_deviceId, Ios::IosToolHandler::Success);
#ifdef Q_OS_UNIX
// Start monitoring app's life signs. // Start monitoring app's life signs.
futureSynchronizer.addFuture(Utils::asyncRun(monitorPid, response->inferiorPid)); futureSynchronizer.addFuture(Utils::onFinished(
Utils::asyncRun(monitorPid, response->inferiorPid), q,
[this](const QFuture<void> &future) {
if (!future.isCanceled())
stop(0);
}));
#endif
if (captureConsole) if (captureConsole)
futureSynchronizer.addFuture(Utils::asyncRun(&LogTailFiles::exec, &outputLogger, futureSynchronizer.addFuture(Utils::asyncRun(&LogTailFiles::exec, &outputLogger,
stdoutFile, stderrFile)); stdoutFile, stderrFile));