diff options
author | Jason Barron <jason.barron@nokia.com> | 2010-10-07 13:52:27 (GMT) |
---|---|---|
committer | Jason Barron <jason.barron@nokia.com> | 2010-10-07 14:02:15 (GMT) |
commit | 7f875312dcc09a4b2dcc5030e813e921b1dc7ee4 (patch) | |
tree | abc2575737013ed3add439c886be668d34ecabe2 /tests/auto/qapplication | |
parent | a3c755e358596238dc7fc1c284328a6226c2ed3a (diff) | |
download | Qt-7f875312dcc09a4b2dcc5030e813e921b1dc7ee4.zip Qt-7f875312dcc09a4b2dcc5030e813e921b1dc7ee4.tar.gz Qt-7f875312dcc09a4b2dcc5030e813e921b1dc7ee4.tar.bz2 |
Fix crash when using Q_GLOBAL_STATIC(QWidget...)
If Q_GLOBAL_STATIC is used with a QWidget (or subclass) then the
destructor of QWidget will be executed after the destructor of
QApplication. Since ~QApplication() destroys the S60 environment and
the trap handler, we need to be sure that if QApplication is destroyed,
we do not attempt to use anything from the S60 environment. This
includes RWsSession and the trap handler.
The fix is to avoid flushing the WSERV buffer if QApplication has been
deleted already.
Reviewed-by: axis
Diffstat (limited to 'tests/auto/qapplication')
-rw-r--r-- | tests/auto/qapplication/tst_qapplication.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/tests/auto/qapplication/tst_qapplication.cpp b/tests/auto/qapplication/tst_qapplication.cpp index 91ae921..a198d7f 100644 --- a/tests/auto/qapplication/tst_qapplication.cpp +++ b/tests/auto/qapplication/tst_qapplication.cpp @@ -147,6 +147,10 @@ private slots: void symbianNeedForTraps(); void symbianLeaveThroughMain(); void qtbug_12673(); + + + + void globalStaticObjectDestruction(); // run this last }; class EventSpy : public QObject @@ -2257,6 +2261,42 @@ void tst_QApplication::qtbug_12673() #endif // Q_OS_SYMBIAN } +/* + This test is meant to ensure that certain objects (public & commonly used) + can safely be used in a Q_GLOBAL_STATIC such that their destructors are + executed *after* the destruction of QApplication. + */ +Q_GLOBAL_STATIC(QLocale, tst_qapp_locale); +Q_GLOBAL_STATIC(QProcess, tst_qapp_process); +Q_GLOBAL_STATIC(QFileSystemWatcher, tst_qapp_fileSystemWatcher); +Q_GLOBAL_STATIC(QSharedMemory, tst_qapp_sharedMemory); +Q_GLOBAL_STATIC(QElapsedTimer, tst_qapp_elapsedTimer); +Q_GLOBAL_STATIC(QMutex, tst_qapp_mutex); +Q_GLOBAL_STATIC(QWidget, tst_qapp_widget); +Q_GLOBAL_STATIC(QPixmap, tst_qapp_pixmap); +Q_GLOBAL_STATIC(QFont, tst_qapp_font); +Q_GLOBAL_STATIC(QRegion, tst_qapp_region); +Q_GLOBAL_STATIC(QFontDatabase, tst_qapp_fontDatabase); +Q_GLOBAL_STATIC(QCursor, tst_qapp_cursor); + +void tst_QApplication::globalStaticObjectDestruction() +{ + int argc = 1; + QApplication app(argc, &argv0, QApplication::GuiServer); + QVERIFY(tst_qapp_locale()); + QVERIFY(tst_qapp_process()); + QVERIFY(tst_qapp_fileSystemWatcher()); + QVERIFY(tst_qapp_sharedMemory()); + QVERIFY(tst_qapp_elapsedTimer()); + QVERIFY(tst_qapp_mutex()); + QVERIFY(tst_qapp_widget()); + QVERIFY(tst_qapp_pixmap()); + QVERIFY(tst_qapp_font()); + QVERIFY(tst_qapp_region()); + QVERIFY(tst_qapp_fontDatabase()); + QVERIFY(tst_qapp_cursor()); +} + //QTEST_APPLESS_MAIN(tst_QApplication) int main(int argc, char *argv[]) { |