QNAM: Work around QObject finicky orphan cleanup details

Details described in a comment.

Task-number: QTBUG-88063
Pick-to: 5.15
Change-Id: I763ecfedf518de97615e04a8eaae0fe1fd784f52
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
This commit is contained in:
Mårten Nordheim 2020-11-06 12:51:42 +01:00
parent 7b2011bd14
commit 1c6d6cbb62

View File

@ -791,7 +791,17 @@ void QNetworkReplyHttpImplPrivate::postRequest(const QNetworkRequest &newHttpReq
// For the synchronous HTTP, this is the normal way the delegate gets deleted
// For the asynchronous HTTP this is a safety measure, the delegate deletes itself when HTTP is finished
QObject::connect(thread, SIGNAL(finished()), delegate, SLOT(deleteLater()));
QMetaObject::Connection threadFinishedConnection =
QObject::connect(thread, SIGNAL(finished()), delegate, SLOT(deleteLater()));
// QTBUG-88063: When 'delegate' is deleted the connection will be added to 'thread''s orphaned
// connections list. This orphaned list will be cleaned up next time 'thread' emits a signal,
// unfortunately that's the finished signal. It leads to a soft-leak so we do this to disconnect
// it on deletion so that it cleans up the orphan immediately.
QObject::connect(delegate, &QObject::destroyed, delegate, [threadFinishedConnection]() {
if (bool(threadFinishedConnection))
QObject::disconnect(threadFinishedConnection);
});
// Set the properties it needs
delegate->httpRequest = httpRequest;