diff options
author | Tobias Hunger <tobias.hunger@qt.io> | 2019-06-21 13:26:00 +0200 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@qt.io> | 2019-07-23 08:50:20 +0000 |
commit | 20cccf53ae12f707a6341c0550d106cc0970e229 (patch) | |
tree | d82081c2abb303c941381827a32a14bf2987ba33 /src | |
parent | 5f71a27f7b79e6270a34c83026465111fdcc14dc (diff) | |
download | qt-creator-20cccf53ae12f707a6341c0550d106cc0970e229.tar.gz |
CMake: Make server-mode handle server restarts
Make ServerModeReader::parse handle the forceCMakeRun flag gracefully.
The problem there was two-fold:
1. The server would send a "isReadyNow" signal when its connection is
estabilshed. This made the ServerModeReader trigger another parse run
with the same parameters.
That would in turn would force a new ServerMode process to be created.
2. The "configure" request that is sent races the new ServerMode
process being connected.
Solve both issues by connecting a slot to the server-mode's
connected signal and have that do the right thing.
Change-Id: I26f9ac00d6ad6397a1fd1fab78610951f535ab53
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/cmakeprojectmanager/servermodereader.cpp | 36 | ||||
-rw-r--r-- | src/plugins/cmakeprojectmanager/servermodereader.h | 5 |
2 files changed, 36 insertions, 5 deletions
diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index 86f463b67b..d88e652322 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -148,8 +148,12 @@ void ServerModeReader::parse(bool forceCMakeRun, bool forceConfiguration) QTC_ASSERT(m_cmakeServer, return); QVariantMap extra; - if (forceCMakeRun) + + bool delayConfigurationRun = false; + if (forceCMakeRun && m_cmakeServer->isConnected()) { createNewServer(); + delayConfigurationRun = true; + } if (forceConfiguration) { QStringList cacheArguments = transform(m_parameters.configuration, @@ -173,8 +177,11 @@ void ServerModeReader::parse(bool forceCMakeRun, bool forceConfiguration) tr("Configuring \"%1\"").arg(m_parameters.projectName), "CMake.Configure"); - m_delayedErrorMessage.clear(); - m_cmakeServer->sendRequest(CONFIGURE_TYPE, extra); + if (!delayConfigurationRun) { + sendConfigureRequest(extra); + } else { + m_delayedConfigurationData = extra; + } } void ServerModeReader::stop() @@ -367,8 +374,11 @@ void ServerModeReader::createNewServer() }); connect(m_cmakeServer.get(), &ServerMode::message, this, [](const QString &m) { Core::MessageManager::write(m); }); - connect(m_cmakeServer.get(), &ServerMode::connected, - this, &ServerModeReader::isReadyNow, Qt::QueuedConnection); // Delay + connect(m_cmakeServer.get(), + &ServerMode::connected, + this, + &ServerModeReader::handleServerConnected, + Qt::QueuedConnection); // Delay connect(m_cmakeServer.get(), &ServerMode::disconnected, this, [this]() { stop(); @@ -461,6 +471,22 @@ void ServerModeReader::handleSignal(const QString &signal, const QVariantMap &da emit dirty(); } +void ServerModeReader::handleServerConnected() +{ + if (m_delayedConfigurationData) { + sendConfigureRequest(*m_delayedConfigurationData); + m_delayedConfigurationData.reset(); + } else { + emit isReadyNow(); + } +} + +void ServerModeReader::sendConfigureRequest(const QVariantMap &extra) +{ + m_delayedErrorMessage.clear(); + m_cmakeServer->sendRequest(CONFIGURE_TYPE, extra); +} + void ServerModeReader::reportError() { stop(); diff --git a/src/plugins/cmakeprojectmanager/servermodereader.h b/src/plugins/cmakeprojectmanager/servermodereader.h index 91b2d25bd2..3c4e9216c7 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.h +++ b/src/plugins/cmakeprojectmanager/servermodereader.h @@ -67,6 +67,9 @@ private: void handleError(const QString &message); void handleProgress(int min, int cur, int max, const QString &inReplyTo); void handleSignal(const QString &signal, const QVariantMap &data); + void handleServerConnected(); + + void sendConfigureRequest(const QVariantMap &extra); void reportError(); @@ -163,6 +166,8 @@ private: int m_progressStepMinimum = 0; int m_progressStepMaximum = 1000; + Utils::optional<QVariantMap> m_delayedConfigurationData; + QString m_delayedErrorMessage; CMakeConfig m_cmakeConfiguration; |