diff --git a/src/plugins/qmldesigner/designercore/instances/connectionmanager.cpp b/src/plugins/qmldesigner/designercore/instances/connectionmanager.cpp index 7db7913c569..5b22c6c55e4 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(); - 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(); + 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) @@ -150,11 +146,6 @@ void ConnectionManager::closeSocketsAndKillProcesses() connection.socket->abort(); } - if (connection.qmlPuppetProcess) { - QTimer::singleShot(3000, connection.qmlPuppetProcess.get(), &QProcess::terminate); - QTimer::singleShot(6000, connection.qmlPuppetProcess.get(), &QProcess::kill); - } - connection.clear(); } } diff --git a/src/plugins/qmldesigner/designercore/instances/connectionmanager.h b/src/plugins/qmldesigner/designercore/instances/connectionmanager.h index 4f25724adba..604f787ede2 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 m_localServer; - std::vector 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 43ff7f48a28..a0d578aa4de 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 +#include #include 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 ce4206ca981..1edaf7f7306 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 socket; + std::unique_ptr localServer; quint32 blockSize = 0; quint32 lastReadCommandCounter = 0; std::unique_ptr timer; diff --git a/src/plugins/qmldesigner/designercore/instances/qprocessuniqueptr.h b/src/plugins/qmldesigner/designercore/instances/qprocessuniqueptr.h index b03c86f772b..9274f916b83 100644 --- a/src/plugins/qmldesigner/designercore/instances/qprocessuniqueptr.h +++ b/src/plugins/qmldesigner/designercore/instances/qprocessuniqueptr.h @@ -41,10 +41,7 @@ public: QOverload::of(&QProcess::finished), process, &QProcess::deleteLater); - - process->terminate(); - - process->deleteLater(); + process->kill(); } };