QObject: fix a memory leak in moveToThread
For some reason it seems to be supported to call moveToThread(0). That call will allocate a new QThreadData for the object. However, if we then detect that we're calling moveToThread from a thread which is not the one the QObject has affinity with, we error out leaking that QThreadData object. Change-Id: I0fe6625a2a9887535e457f3897b514d2a03d1480 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
This commit is contained in:
parent
d9e1a0f05b
commit
8c2f0ac382
@ -1461,14 +1461,14 @@ void QObject::moveToThread(QThread *targetThread)
|
|||||||
}
|
}
|
||||||
|
|
||||||
QThreadData *currentData = QThreadData::current();
|
QThreadData *currentData = QThreadData::current();
|
||||||
QThreadData *targetData = targetThread ? QThreadData::get2(targetThread) : new QThreadData(0);
|
QThreadData *targetData = targetThread ? QThreadData::get2(targetThread) : Q_NULLPTR;
|
||||||
if (d->threadData->thread == 0 && currentData == targetData) {
|
if (d->threadData->thread == 0 && currentData == targetData) {
|
||||||
// one exception to the rule: we allow moving objects with no thread affinity to the current thread
|
// one exception to the rule: we allow moving objects with no thread affinity to the current thread
|
||||||
currentData = d->threadData;
|
currentData = d->threadData;
|
||||||
} else if (d->threadData != currentData) {
|
} else if (d->threadData != currentData) {
|
||||||
qWarning("QObject::moveToThread: Current thread (%p) is not the object's thread (%p).\n"
|
qWarning("QObject::moveToThread: Current thread (%p) is not the object's thread (%p).\n"
|
||||||
"Cannot move to target thread (%p)\n",
|
"Cannot move to target thread (%p)\n",
|
||||||
currentData->thread, d->threadData->thread, targetData->thread);
|
currentData->thread, d->threadData->thread, targetData ? targetData->thread : Q_NULLPTR);
|
||||||
|
|
||||||
#ifdef Q_OS_MAC
|
#ifdef Q_OS_MAC
|
||||||
qWarning("On Mac OS X, you might be loading two sets of Qt binaries into the same process. "
|
qWarning("On Mac OS X, you might be loading two sets of Qt binaries into the same process. "
|
||||||
@ -1482,6 +1482,9 @@ void QObject::moveToThread(QThread *targetThread)
|
|||||||
// prepare to move
|
// prepare to move
|
||||||
d->moveToThread_helper();
|
d->moveToThread_helper();
|
||||||
|
|
||||||
|
if (!targetData)
|
||||||
|
targetData = new QThreadData(0);
|
||||||
|
|
||||||
QOrderedMutexLocker locker(¤tData->postEventList.mutex,
|
QOrderedMutexLocker locker(¤tData->postEventList.mutex,
|
||||||
&targetData->postEventList.mutex);
|
&targetData->postEventList.mutex);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user