forked from qt-creator/qt-creator
Cleanup ConnectionManager
- Do not block starting the puppet processes while waiting for the reply - Remove unnessecary connection.clear() from ConnectionManager::shutDown since this was already done in closeSocketsAndKillProcesses - Remove Timers from ConnectionManager::closeSocketsAndKillProcesses since they leak memory and termination of the processes is done in QProcessUniquePointerDeleter - Remove second deleteLater from QProcessUniquePointerDeleter since this is handled by the connection to the finished signal Change-Id: If845ea44f483c5d3c646595ff9298bcdd3dfd59a Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
@@ -53,17 +53,18 @@ void ConnectionManager::setUp(NodeInstanceServerInterface *nodeInstanceServerPro
|
|||||||
{
|
{
|
||||||
BaseConnectionManager::setUp(nodeInstanceServerProxy, qrcMappingString, target, view);
|
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 puppetCreator(target, view->model());
|
||||||
puppetCreator.setQrcMappingString(qrcMappingString);
|
puppetCreator.setQrcMappingString(qrcMappingString);
|
||||||
|
|
||||||
puppetCreator.createQml2PuppetExecutableIfMissing();
|
puppetCreator.createQml2PuppetExecutableIfMissing();
|
||||||
|
|
||||||
for (Connection &connection : m_connections) {
|
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.qmlPuppetProcess = puppetCreator.createPuppetProcess(
|
||||||
connection.mode,
|
connection.mode,
|
||||||
socketToken,
|
socketToken,
|
||||||
@@ -71,10 +72,11 @@ void ConnectionManager::setUp(NodeInstanceServerInterface *nodeInstanceServerPro
|
|||||||
[&](int exitCode, QProcess::ExitStatus exitStatus) {
|
[&](int exitCode, QProcess::ExitStatus exitStatus) {
|
||||||
processFinished(exitCode, exitStatus, connection.name);
|
processFinished(exitCode, exitStatus, connection.name);
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const int second = 1000;
|
const int second = 1000;
|
||||||
|
for (Connection &connection : m_connections) {
|
||||||
int waitConstant = 8 * second;
|
int waitConstant = 8 * second;
|
||||||
|
|
||||||
if (!connection.qmlPuppetProcess->waitForStarted(waitConstant)) {
|
if (!connection.qmlPuppetProcess->waitForStarted(waitConstant)) {
|
||||||
closeSocketsAndKillProcesses();
|
closeSocketsAndKillProcesses();
|
||||||
showCannotConnectToPuppetWarningAndSwitchToEditMode();
|
showCannotConnectToPuppetWarningAndSwitchToEditMode();
|
||||||
@@ -84,11 +86,11 @@ void ConnectionManager::setUp(NodeInstanceServerInterface *nodeInstanceServerPro
|
|||||||
waitConstant /= 2;
|
waitConstant /= 2;
|
||||||
|
|
||||||
bool connectedToPuppet = true;
|
bool connectedToPuppet = true;
|
||||||
if (!m_localServer->hasPendingConnections())
|
if (!connection.localServer->hasPendingConnections())
|
||||||
connectedToPuppet = m_localServer->waitForNewConnection(waitConstant);
|
connectedToPuppet = connection.localServer->waitForNewConnection(waitConstant);
|
||||||
|
|
||||||
if (connectedToPuppet) {
|
if (connectedToPuppet) {
|
||||||
connection.socket.reset(m_localServer->nextPendingConnection());
|
connection.socket.reset(connection.localServer->nextPendingConnection());
|
||||||
QObject::connect(connection.socket.get(), &QIODevice::readyRead, this, [&] {
|
QObject::connect(connection.socket.get(), &QIODevice::readyRead, this, [&] {
|
||||||
readDataStream(connection);
|
readDataStream(connection);
|
||||||
});
|
});
|
||||||
@@ -97,9 +99,8 @@ void ConnectionManager::setUp(NodeInstanceServerInterface *nodeInstanceServerPro
|
|||||||
showCannotConnectToPuppetWarningAndSwitchToEditMode();
|
showCannotConnectToPuppetWarningAndSwitchToEditMode();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
connection.localServer->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_localServer->close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionManager::shutDown()
|
void ConnectionManager::shutDown()
|
||||||
@@ -107,11 +108,6 @@ void ConnectionManager::shutDown()
|
|||||||
BaseConnectionManager::shutDown();
|
BaseConnectionManager::shutDown();
|
||||||
|
|
||||||
closeSocketsAndKillProcesses();
|
closeSocketsAndKillProcesses();
|
||||||
|
|
||||||
m_localServer.reset();
|
|
||||||
|
|
||||||
for (Connection &connection : m_connections)
|
|
||||||
connection.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionManager::writeCommand(const QVariant &command)
|
void ConnectionManager::writeCommand(const QVariant &command)
|
||||||
@@ -150,11 +146,6 @@ void ConnectionManager::closeSocketsAndKillProcesses()
|
|||||||
connection.socket->abort();
|
connection.socket->abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (connection.qmlPuppetProcess) {
|
|
||||||
QTimer::singleShot(3000, connection.qmlPuppetProcess.get(), &QProcess::terminate);
|
|
||||||
QTimer::singleShot(6000, connection.qmlPuppetProcess.get(), &QProcess::kill);
|
|
||||||
}
|
|
||||||
|
|
||||||
connection.clear();
|
connection.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -70,8 +70,6 @@ private:
|
|||||||
void closeSocketsAndKillProcesses();
|
void closeSocketsAndKillProcesses();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<QLocalServer> m_localServer;
|
|
||||||
|
|
||||||
std::vector<Connection> m_connections;
|
std::vector<Connection> m_connections;
|
||||||
quint32 m_writeCommandCounter = 0;
|
quint32 m_writeCommandCounter = 0;
|
||||||
};
|
};
|
||||||
|
@@ -26,6 +26,7 @@
|
|||||||
#include "connectionmanagerinterface.h"
|
#include "connectionmanagerinterface.h"
|
||||||
|
|
||||||
#include <QLocalSocket>
|
#include <QLocalSocket>
|
||||||
|
#include <QLocalServer>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
namespace QmlDesigner {
|
namespace QmlDesigner {
|
||||||
@@ -45,6 +46,7 @@ void ConnectionManagerInterface::Connection::clear()
|
|||||||
{
|
{
|
||||||
qmlPuppetProcess.reset();
|
qmlPuppetProcess.reset();
|
||||||
socket.reset();
|
socket.reset();
|
||||||
|
localServer.reset();
|
||||||
blockSize = 0;
|
blockSize = 0;
|
||||||
lastReadCommandCounter = 0;
|
lastReadCommandCounter = 0;
|
||||||
timer.reset();
|
timer.reset();
|
||||||
|
@@ -30,6 +30,7 @@
|
|||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
class QLocalSocket;
|
class QLocalSocket;
|
||||||
|
class QLocalServer;
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
namespace ProjectExplorer {
|
namespace ProjectExplorer {
|
||||||
@@ -59,6 +60,7 @@ public:
|
|||||||
QString mode;
|
QString mode;
|
||||||
QProcessUniquePointer qmlPuppetProcess;
|
QProcessUniquePointer qmlPuppetProcess;
|
||||||
std::unique_ptr<QLocalSocket> socket;
|
std::unique_ptr<QLocalSocket> socket;
|
||||||
|
std::unique_ptr<QLocalServer> localServer;
|
||||||
quint32 blockSize = 0;
|
quint32 blockSize = 0;
|
||||||
quint32 lastReadCommandCounter = 0;
|
quint32 lastReadCommandCounter = 0;
|
||||||
std::unique_ptr<QTimer> timer;
|
std::unique_ptr<QTimer> timer;
|
||||||
|
@@ -41,10 +41,7 @@ public:
|
|||||||
QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
|
QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
|
||||||
process,
|
process,
|
||||||
&QProcess::deleteLater);
|
&QProcess::deleteLater);
|
||||||
|
process->kill();
|
||||||
process->terminate();
|
|
||||||
|
|
||||||
process->deleteLater();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user