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; qDebug() << "CONNECTED";
auto res = void_safe_call(cb, true);
*connection = QObject::connect( QTC_CHECK_EXPECTED(res);
socket, &QLocalSocket::connected, socket, [connectionError, connection, cb]() { QObject::disconnect(socket, &QLocalSocket::errorOccurred, socket, nullptr);
qDebug() << "CONNECTED"; }, Qt::SingleShotConnection);
auto res = void_safe_call(cb, true); QObject::connect(socket, &QLocalSocket::errorOccurred, socket, [socket, cb] {
QTC_CHECK_EXPECTED(res); qDebug() << "CONNECT ERROR";
QObject::disconnect(*connection); auto res = void_safe_call(cb, false, socket->errorString());
delete connection; QTC_CHECK_EXPECTED(res);
QObject::disconnect(*connectionError); QObject::disconnect(socket, &QLocalSocket::connected, socket, nullptr);
delete connectionError; }, Qt::SingleShotConnection);
});
*connectionError = QObject::connect(
socket,
&QLocalSocket::errorOccurred,
socket,
[socket, connection, connectionError, cb]() {
qDebug() << "CONNECT ERROR";
auto res = void_safe_call(cb, false, socket->errorString());
QTC_CHECK_EXPECTED(res);
QObject::disconnect(*connection);
delete connection;
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( auto res = void_safe_call(cb, socket->readAll().toStdString());
socket, &QLocalSocket::readyRead, socket, [connection, cb, socket]() { QTC_CHECK_EXPECTED(res);
auto res = void_safe_call(cb, socket->readAll().toStdString()); }, Qt::SingleShotConnection);
QTC_CHECK_EXPECTED(res);
QObject::disconnect(*connection);
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>();