summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTobias Hunger <tobias.hunger@qt.io>2019-06-21 13:26:00 +0200
committerTobias Hunger <tobias.hunger@qt.io>2019-07-23 08:50:20 +0000
commit20cccf53ae12f707a6341c0550d106cc0970e229 (patch)
treed82081c2abb303c941381827a32a14bf2987ba33 /src
parent5f71a27f7b79e6270a34c83026465111fdcc14dc (diff)
downloadqt-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.cpp36
-rw-r--r--src/plugins/cmakeprojectmanager/servermodereader.h5
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;