diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index b9fcbb265af..2fc49ca8e3a 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -24,7 +24,6 @@ #include #include -#include #include #include #include @@ -1674,12 +1673,10 @@ void LinuxDevice::setDisconnected(bool disconnected) d->setDisconnected(disconnected); } -QFuture LinuxDevice::tryToConnect() +bool LinuxDevice::tryToConnect() { - return Utils::asyncRun([this] { - QMutexLocker locker(&d->m_shellMutex); - return d->setupShell(sshParameters(), false); - }); + QMutexLocker locker(&d->m_shellMutex); + return d->setupShell(sshParameters(), false); } namespace Internal { diff --git a/src/plugins/remotelinux/linuxdevice.h b/src/plugins/remotelinux/linuxdevice.h index 0bb2468eacb..06e0da3f2a8 100644 --- a/src/plugins/remotelinux/linuxdevice.h +++ b/src/plugins/remotelinux/linuxdevice.h @@ -50,7 +50,7 @@ public: bool isDisconnected() const; void setDisconnected(bool disconnected); - QFuture tryToConnect(); + bool tryToConnect(); protected: LinuxDevice(); diff --git a/src/plugins/remotelinux/linuxdevicetester.cpp b/src/plugins/remotelinux/linuxdevicetester.cpp index d66e44be6e6..3281d32c49d 100644 --- a/src/plugins/remotelinux/linuxdevicetester.cpp +++ b/src/plugins/remotelinux/linuxdevicetester.cpp @@ -6,6 +6,8 @@ #include "linuxdevice.h" #include "remotelinuxtr.h" +#include + #include #include #include @@ -13,13 +15,12 @@ #include #include +#include #include #include #include #include -#include - using namespace ProjectExplorer; using namespace Tasking; using namespace Utils; @@ -39,6 +40,7 @@ public: QStringList commandsToTest() const; + GroupItem connectionTask() const; GroupItem echoTask(const QString &contents) const; GroupItem unameTask() const; GroupItem gathererTask() const; @@ -46,13 +48,9 @@ public: const Storage &storage) const; GroupItem transferTasks() const; GroupItem commandTasks() const; - void runCommandTests(); - - bool isRunning() const { return m_connectionTest || m_taskTreeRunner.isRunning(); } GenericLinuxDeviceTester *q = nullptr; LinuxDevice::Ptr m_device; - QFutureWatcher *m_connectionTest = nullptr; TaskTreeRunner m_taskTreeRunner; QStringList m_extraCommands; QList m_extraTests; @@ -98,6 +96,27 @@ QStringList GenericLinuxDeviceTesterPrivate::commandsToTest() const return commands; } +GroupItem GenericLinuxDeviceTesterPrivate::connectionTask() const +{ + const auto onSetup = [this](Async &task) { + emit q->progressMessage(Tr::tr("Connecting to device...")); + task.setConcurrentCallData([device = m_device] { return device->tryToConnect(); }); + task.setFutureSynchronizer(ExtensionSystem::PluginManager::futureSynchronizer()); + }; + const auto onDone = [this](const Async &task) { + const bool success = task.isResultAvailable() && task.result(); + if (success) { + // TODO: For master: move the '\n' outside of Tr(). + emit q->progressMessage(Tr::tr("Connected. Now doing extended checks.\n")); + } else { + emit q->errorMessage( + Tr::tr("Basic connectivity test failed, device is considered unusable.") + '\n'); + } + return toDoneResult(success); + }; + return AsyncTask(onSetup, onDone); +} + GroupItem GenericLinuxDeviceTesterPrivate::echoTask(const QString &contents) const { const auto onSetup = [this, contents](Process &process) { @@ -283,20 +302,6 @@ GroupItem GenericLinuxDeviceTesterPrivate::commandTasks() const return root; } -void GenericLinuxDeviceTesterPrivate::runCommandTests() -{ - const Group root { - echoTask("Hello"), // No quoting necessary - echoTask("Hello Remote World!"), // Checks quoting, too. - unameTask(), - gathererTask(), - transferTasks(), - m_extraTests, - commandTasks() - }; - m_taskTreeRunner.start(root); -} - } // namespace Internal using namespace Internal; @@ -323,39 +328,27 @@ void GenericLinuxDeviceTester::setExtraTests(const QList &extraTests) void GenericLinuxDeviceTester::testDevice(const IDevice::Ptr &deviceConfiguration) { - QTC_ASSERT(!d->isRunning(), return); - - emit progressMessage(Tr::tr("Connecting to device...")); + QTC_ASSERT(!d->m_taskTreeRunner.isRunning(), return); d->m_device = std::static_pointer_cast(deviceConfiguration); - d->m_connectionTest = new QFutureWatcher(this); - connect(d->m_connectionTest, &QFutureWatcher::finished, this, [this] { - const bool success = d->m_connectionTest->result(); - d->m_connectionTest->deleteLater(); - d->m_connectionTest = nullptr; - if (success) { - emit progressMessage(Tr::tr("Connected. Now doing extended checks.\n")); - d->runCommandTests(); - } else { - emit errorMessage( - Tr::tr("Basic connectivity test failed, device is considered unusable.")); - emit finished(TestFailure); - } - }); - d->m_connectionTest->setFuture(d->m_device->tryToConnect()); + const Group root { + d->connectionTask(), + d->echoTask("Hello"), // No quoting necessary + d->echoTask("Hello Remote World!"), // Checks quoting, too. + d->unameTask(), + d->gathererTask(), + d->transferTasks(), + d->m_extraTests, + d->commandTasks() + }; + d->m_taskTreeRunner.start(root); } void GenericLinuxDeviceTester::stopTest() { - QTC_ASSERT(d->isRunning(), return); - if (d->m_connectionTest) { - d->m_connectionTest->disconnect(); - d->m_connectionTest->cancel(); - d->m_connectionTest = nullptr; - } else { - d->m_taskTreeRunner.reset(); - } + QTC_ASSERT(d->m_taskTreeRunner.isRunning(), return); + d->m_taskTreeRunner.reset(); emit finished(TestFailure); }