summaryrefslogtreecommitdiffstats
path: root/tests/auto
diff options
context:
space:
mode:
authorJason Barron <jason.barron@nokia.com>2010-10-07 13:52:27 (GMT)
committerJason Barron <jason.barron@nokia.com>2010-10-07 14:02:15 (GMT)
commit7f875312dcc09a4b2dcc5030e813e921b1dc7ee4 (patch)
treeabc2575737013ed3add439c886be668d34ecabe2 /tests/auto
parenta3c755e358596238dc7fc1c284328a6226c2ed3a (diff)
downloadQt-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')
-rw-r--r--tests/auto/qapplication/tst_qapplication.cpp40
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[])
{