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 *targetData = targetThread ? QThreadData::get2(targetThread) : new QThreadData(0);
|
||||
QThreadData *targetData = targetThread ? QThreadData::get2(targetThread) : Q_NULLPTR;
|
||||
if (d->threadData->thread == 0 && currentData == targetData) {
|
||||
// one exception to the rule: we allow moving objects with no thread affinity to the current thread
|
||||
currentData = d->threadData;
|
||||
} else if (d->threadData != currentData) {
|
||||
qWarning("QObject::moveToThread: Current thread (%p) is not the object's 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
|
||||
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
|
||||
d->moveToThread_helper();
|
||||
|
||||
if (!targetData)
|
||||
targetData = new QThreadData(0);
|
||||
|
||||
QOrderedMutexLocker locker(¤tData->postEventList.mutex,
|
||||
&targetData->postEventList.mutex);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user