Lua: Avoid potential leak

Fix the warning about potential leak of connection objects.
Use single shot connections and disconnect other connections
explicitly.

Change-Id: I5fbf55ac04a164a1bf42e2e27e8271ccf1385fbd
Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
This commit is contained in:
Jarek Kobus
2024-08-23 09:21:38 +02:00
parent 4740ecfecf
commit 869d334eba

View File

@@ -40,32 +40,18 @@ void setupLocalSocketModule()
if (socket->state() != QLocalSocket::UnconnectedState) if (socket->state() != QLocalSocket::UnconnectedState)
throw sol::error("socket is not in UnconnectedState"); throw sol::error("socket is not in UnconnectedState");
auto connection = new QMetaObject::Connection; QObject::connect(socket, &QLocalSocket::connected, socket, [socket, cb] {
auto connectionError = new QMetaObject::Connection;
*connection = QObject::connect(
socket, &QLocalSocket::connected, socket, [connectionError, connection, cb]() {
qDebug() << "CONNECTED"; qDebug() << "CONNECTED";
auto res = void_safe_call(cb, true); auto res = void_safe_call(cb, true);
QTC_CHECK_EXPECTED(res); QTC_CHECK_EXPECTED(res);
QObject::disconnect(*connection); QObject::disconnect(socket, &QLocalSocket::errorOccurred, socket, nullptr);
delete connection; }, Qt::SingleShotConnection);
QObject::disconnect(*connectionError); QObject::connect(socket, &QLocalSocket::errorOccurred, socket, [socket, cb] {
delete connectionError;
});
*connectionError = QObject::connect(
socket,
&QLocalSocket::errorOccurred,
socket,
[socket, connection, connectionError, cb]() {
qDebug() << "CONNECT ERROR"; qDebug() << "CONNECT ERROR";
auto res = void_safe_call(cb, false, socket->errorString()); auto res = void_safe_call(cb, false, socket->errorString());
QTC_CHECK_EXPECTED(res); QTC_CHECK_EXPECTED(res);
QObject::disconnect(*connection); QObject::disconnect(socket, &QLocalSocket::connected, socket, nullptr);
delete connection; }, Qt::SingleShotConnection);
QObject::disconnect(*connectionError);
delete connectionError;
});
socket->connectToServer(); socket->connectToServer();
}; };
@@ -91,14 +77,10 @@ void setupLocalSocketModule()
return; return;
} }
auto connection = new QMetaObject::Connection; QObject::connect(socket, &QLocalSocket::readyRead, socket, [socket, cb] {
*connection = QObject::connect(
socket, &QLocalSocket::readyRead, socket, [connection, cb, socket]() {
auto res = void_safe_call(cb, socket->readAll().toStdString()); auto res = void_safe_call(cb, socket->readAll().toStdString());
QTC_CHECK_EXPECTED(res); QTC_CHECK_EXPECTED(res);
QObject::disconnect(*connection); }, Qt::SingleShotConnection);
delete connection;
});
}; };
socketType["read"] = wrap(socketType["read_cb"].get<sol::function>()).get<sol::function>(); socketType["read"] = wrap(socketType["read_cb"].get<sol::function>()).get<sol::function>();