aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKnud Dollereder <knud.dollereder@qt.io>2022-02-08 12:59:50 +0100
committerThomas Hartmann <thomas.hartmann@qt.io>2022-02-09 17:50:13 +0000
commitb36bba03ba260afc2d117f3a9ae84067f250a2ee (patch)
tree24018f53a7b190fadb6865204365fca044b20fc9
parentcea31a2c4f16a8cdba279b2834cc3f795b22cf13 (diff)
QmlDesigner: Improve performance of ConnectionManager
This is a pertial cherry-pick from master. See commit: b9d59edeb16675c3c1442b36c63c156cd8236d04 I removed the changes to the process deletion. This requires an extra cleanup patch in master. Change-Id: If845ea44f483c5d3c646595ff9298bcdd3dfd59a Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
-rw-r--r--src/plugins/qmldesigner/designercore/instances/connectionmanager.cpp30
-rw-r--r--src/plugins/qmldesigner/designercore/instances/connectionmanager.h2
-rw-r--r--src/plugins/qmldesigner/designercore/instances/connectionmanagerinterface.cpp2
-rw-r--r--src/plugins/qmldesigner/designercore/instances/connectionmanagerinterface.h2
4 files changed, 17 insertions, 19 deletions
diff --git a/src/plugins/qmldesigner/designercore/instances/connectionmanager.cpp b/src/plugins/qmldesigner/designercore/instances/connectionmanager.cpp
index 7db7913c56..eb994376ea 100644
--- a/src/plugins/qmldesigner/designercore/instances/connectionmanager.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/connectionmanager.cpp
@@ -53,17 +53,18 @@ void ConnectionManager::setUp(NodeInstanceServerInterface *nodeInstanceServerPro
{
BaseConnectionManager::setUp(nodeInstanceServerProxy, qrcMappingString, target, view);
- m_localServer = std::make_unique<QLocalServer>();
- QString socketToken(QUuid::createUuid().toString());
- m_localServer->listen(socketToken);
- m_localServer->setMaxPendingConnections(3);
-
PuppetCreator puppetCreator(target, view->model());
puppetCreator.setQrcMappingString(qrcMappingString);
puppetCreator.createQml2PuppetExecutableIfMissing();
for (Connection &connection : m_connections) {
+
+ QString socketToken(QUuid::createUuid().toString());
+ connection.localServer = std::make_unique<QLocalServer>();
+ connection.localServer->listen(socketToken);
+ connection.localServer->setMaxPendingConnections(1);
+
connection.qmlPuppetProcess = puppetCreator.createPuppetProcess(
connection.mode,
socketToken,
@@ -71,10 +72,11 @@ void ConnectionManager::setUp(NodeInstanceServerInterface *nodeInstanceServerPro
[&](int exitCode, QProcess::ExitStatus exitStatus) {
processFinished(exitCode, exitStatus, connection.name);
});
+ }
- const int second = 1000;
+ const int second = 1000;
+ for (Connection &connection : m_connections) {
int waitConstant = 8 * second;
-
if (!connection.qmlPuppetProcess->waitForStarted(waitConstant)) {
closeSocketsAndKillProcesses();
showCannotConnectToPuppetWarningAndSwitchToEditMode();
@@ -84,11 +86,11 @@ void ConnectionManager::setUp(NodeInstanceServerInterface *nodeInstanceServerPro
waitConstant /= 2;
bool connectedToPuppet = true;
- if (!m_localServer->hasPendingConnections())
- connectedToPuppet = m_localServer->waitForNewConnection(waitConstant);
+ if (!connection.localServer->hasPendingConnections())
+ connectedToPuppet = connection.localServer->waitForNewConnection(waitConstant);
if (connectedToPuppet) {
- connection.socket.reset(m_localServer->nextPendingConnection());
+ connection.socket.reset(connection.localServer->nextPendingConnection());
QObject::connect(connection.socket.get(), &QIODevice::readyRead, this, [&] {
readDataStream(connection);
});
@@ -97,9 +99,8 @@ void ConnectionManager::setUp(NodeInstanceServerInterface *nodeInstanceServerPro
showCannotConnectToPuppetWarningAndSwitchToEditMode();
return;
}
+ connection.localServer->close();
}
-
- m_localServer->close();
}
void ConnectionManager::shutDown()
@@ -107,11 +108,6 @@ void ConnectionManager::shutDown()
BaseConnectionManager::shutDown();
closeSocketsAndKillProcesses();
-
- m_localServer.reset();
-
- for (Connection &connection : m_connections)
- connection.clear();
}
void ConnectionManager::writeCommand(const QVariant &command)
diff --git a/src/plugins/qmldesigner/designercore/instances/connectionmanager.h b/src/plugins/qmldesigner/designercore/instances/connectionmanager.h
index 4f25724adb..604f787ede 100644
--- a/src/plugins/qmldesigner/designercore/instances/connectionmanager.h
+++ b/src/plugins/qmldesigner/designercore/instances/connectionmanager.h
@@ -70,8 +70,6 @@ private:
void closeSocketsAndKillProcesses();
private:
- std::unique_ptr<QLocalServer> m_localServer;
-
std::vector<Connection> m_connections;
quint32 m_writeCommandCounter = 0;
};
diff --git a/src/plugins/qmldesigner/designercore/instances/connectionmanagerinterface.cpp b/src/plugins/qmldesigner/designercore/instances/connectionmanagerinterface.cpp
index 43ff7f48a2..a0d578aa4d 100644
--- a/src/plugins/qmldesigner/designercore/instances/connectionmanagerinterface.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/connectionmanagerinterface.cpp
@@ -26,6 +26,7 @@
#include "connectionmanagerinterface.h"
#include <QLocalSocket>
+#include <QLocalServer>
#include <QTimer>
namespace QmlDesigner {
@@ -45,6 +46,7 @@ void ConnectionManagerInterface::Connection::clear()
{
qmlPuppetProcess.reset();
socket.reset();
+ localServer.reset();
blockSize = 0;
lastReadCommandCounter = 0;
timer.reset();
diff --git a/src/plugins/qmldesigner/designercore/instances/connectionmanagerinterface.h b/src/plugins/qmldesigner/designercore/instances/connectionmanagerinterface.h
index ce4206ca98..1edaf7f730 100644
--- a/src/plugins/qmldesigner/designercore/instances/connectionmanagerinterface.h
+++ b/src/plugins/qmldesigner/designercore/instances/connectionmanagerinterface.h
@@ -30,6 +30,7 @@
QT_BEGIN_NAMESPACE
class QLocalSocket;
+class QLocalServer;
QT_END_NAMESPACE
namespace ProjectExplorer {
@@ -59,6 +60,7 @@ public:
QString mode;
QProcessUniquePointer qmlPuppetProcess;
std::unique_ptr<QLocalSocket> socket;
+ std::unique_ptr<QLocalServer> localServer;
quint32 blockSize = 0;
quint32 lastReadCommandCounter = 0;
std::unique_ptr<QTimer> timer;