diff options
author | Thierry Bastian <thierry.bastian@nokia.com> | 2009-08-12 08:33:33 (GMT) |
---|---|---|
committer | Thierry Bastian <thierry.bastian@nokia.com> | 2009-08-12 08:40:45 (GMT) |
commit | b3b2bc3f190d80e30b968648dd91048df67b8a50 (patch) | |
tree | 65b0d075d2be2addb55aa7baf6af58a8154abbe6 /tests/auto/qobject | |
parent | 62aa09a47cc226518d42f1b3b2337fdcb440da33 (diff) | |
download | Qt-b3b2bc3f190d80e30b968648dd91048df67b8a50.zip Qt-b3b2bc3f190d80e30b968648dd91048df67b8a50.tar.gz Qt-b3b2bc3f190d80e30b968648dd91048df67b8a50.tar.bz2 |
Possible Dead lock in the destructor of QObject
The problem was that we were locking a mutex that was global to thread
to remove posted events associated with a QObject from the posted event
list. We were also immediately deleting those events. If that triggers
the deletion of another QObject, you would then trigger a dead-lock.
Task-number: 259514
Reviewed-by: brad
Reviewed-by: ogoffart
Diffstat (limited to 'tests/auto/qobject')
-rw-r--r-- | tests/auto/qobject/tst_qobject.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/tests/auto/qobject/tst_qobject.cpp b/tests/auto/qobject/tst_qobject.cpp index 2823c71..bb00a0b 100644 --- a/tests/auto/qobject/tst_qobject.cpp +++ b/tests/auto/qobject/tst_qobject.cpp @@ -119,6 +119,7 @@ private slots: void qobjectConstCast(); void uniqConnection(); void interfaceIid(); + void deleteQObjectWhenDeletingEvent(); protected: }; @@ -2898,5 +2899,22 @@ void tst_QObject::interfaceIid() QByteArray()); } +void tst_QObject::deleteQObjectWhenDeletingEvent() +{ + //this is related to task 259514 + //before the fix this used to dead lock when the QObject from the event was destroyed + + struct MyEvent : public QEvent + { + MyEvent() : QEvent(QEvent::User) { } + QObject obj; + }; + + QObject o; + QApplication::postEvent(&o, new MyEvent); + QCoreApplication::removePostedEvents(&o); // here you would get a deadlock +} + + QTEST_MAIN(tst_QObject) #include "tst_qobject.moc" |