forked from qt-creator/qt-creator
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:
@@ -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>();
|
||||||
|
Reference in New Issue
Block a user