From 20cccf53ae12f707a6341c0550d106cc0970e229 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 21 Jun 2019 13:26:00 +0200 Subject: [PATCH] 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 --- .../cmakeprojectmanager/servermodereader.cpp | 36 ++++++++++++++++--- .../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 86f463b67b8..d88e6523227 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 91b2d25bd2b..3c4e9216c7d 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 m_delayedConfigurationData; + QString m_delayedErrorMessage; CMakeConfig m_cmakeConfiguration;