From 644756d80a38c6aa63c6fac65cc77f905a5b7209 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 27 Oct 2016 16:45:20 +0200 Subject: [PATCH] iOS: Make updating available simulators asynchronous Also remove unneeded lock Change-Id: I8db798bd0b8790ced198cf57e30e22a96a0eb0a2 Reviewed-by: Tobias Hunger --- src/plugins/ios/simulatorcontrol.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/plugins/ios/simulatorcontrol.cpp b/src/plugins/ios/simulatorcontrol.cpp index b300e77e6d5..6746c27d789 100644 --- a/src/plugins/ios/simulatorcontrol.cpp +++ b/src/plugins/ios/simulatorcontrol.cpp @@ -27,6 +27,8 @@ #include "iossimulator.h" #include "iosconfigurations.h" +#include + #ifdef Q_OS_MAC #include #endif @@ -95,7 +97,6 @@ private: QHash simulatorProcesses; QReadWriteLock processDataLock; QList availableDevices; - QReadWriteLock deviceDataLock; friend class SimulatorControl; }; @@ -108,16 +109,15 @@ SimulatorControl::SimulatorControl() QList SimulatorControl::availableSimulators() { - QReadLocker locer(&d->deviceDataLock); return d->availableDevices; } -void SimulatorControl::updateAvailableSimulators() +static QList getAvailableSimulators() { + QList availableDevices; const QByteArray output = runSimCtlCommand({QLatin1String("list"), QLatin1String("-j"), QLatin1String("devices")}); QJsonDocument doc = QJsonDocument::fromJson(output); if (!doc.isNull()) { - QList availableDevices; const QJsonObject buildInfo = doc.object().value("devices").toObject(); foreach (const QString &buildVersion, buildInfo.keys()) { QJsonArray devices = buildInfo.value(buildVersion).toArray(); @@ -134,14 +134,18 @@ void SimulatorControl::updateAvailableSimulators() } } std::stable_sort(availableDevices.begin(), availableDevices.end()); - - { - QWriteLocker locker(&d->deviceDataLock); - d->availableDevices = availableDevices; - } } else { qCDebug(simulatorLog) << "Error parsing json output from simctl. Output:" << output; } + return availableDevices; +} + +void SimulatorControl::updateAvailableSimulators() +{ + QFuture> future = Utils::runAsync(getAvailableSimulators); + Utils::onResultReady(future, d, [](const QList &devices) { + SimulatorControl::d->availableDevices = devices; + }); } // Blocks until simulators reaches "Booted" state.