diff options
author | Shane Kearns <shane.kearns@accenture.com> | 2011-01-07 15:57:28 (GMT) |
---|---|---|
committer | Shane Kearns <shane.kearns@accenture.com> | 2011-01-10 10:47:55 (GMT) |
commit | 2b1b617664bfc78f6e95e53dc0f9749bd1f2d27a (patch) | |
tree | 7231535f2fd19987c9143cc581468bb5769b0271 /tests | |
parent | 6e6bdedd06c72f857590b32462548448da6d59b5 (diff) | |
download | Qt-2b1b617664bfc78f6e95e53dc0f9749bd1f2d27a.zip Qt-2b1b617664bfc78f6e95e53dc0f9749bd1f2d27a.tar.gz Qt-2b1b617664bfc78f6e95e53dc0f9749bd1f2d27a.tar.bz2 |
Fix handle leak in symbian QTimer implementation
The timer handle was only being closed when a timer was cancelled,
which resulted in a leak for one shot timers that have completed normally.
Instead the timer is now closed in a destructor (closing null handles is
safe, so it doesn't matter if the handle was never created - e.g. in the
case of a zero timer)
Also added a handle check before creating a timer to prevent a leak in
case the start function is called twice in the backend.
Task-number: QTBUG-16380
Reviewed-by: mread
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/qtimer/tst_qtimer.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/tests/auto/qtimer/tst_qtimer.cpp b/tests/auto/qtimer/tst_qtimer.cpp index 102308e..e964728 100644 --- a/tests/auto/qtimer/tst_qtimer.cpp +++ b/tests/auto/qtimer/tst_qtimer.cpp @@ -90,6 +90,9 @@ private slots: void QTBUG13633_dontBlockEvents(); void postedEventsShouldNotStarveTimers(); +#ifdef Q_OS_SYMBIAN + void handleLeaks(); +#endif }; class TimerHelper : public QObject @@ -750,5 +753,40 @@ void tst_QTimer::postedEventsShouldNotStarveTimers() QVERIFY(timerHelper.count > 5); } +#ifdef Q_OS_SYMBIAN +void tst_QTimer::handleLeaks() +{ + const int timercount = 5; + int processhandles_start; + int threadhandles_start; + RThread().HandleCount(processhandles_start, threadhandles_start); + { + TimerHelper timerHelper; + QList<QTimer*> timers; + for (int i=0;i<timercount;i++) { + QTimer* timer = new QTimer; + timers.append(timer); + connect(timer, SIGNAL(timeout()), &timerHelper, SLOT(timeout())); + timer->setSingleShot(true); + timer->start(i); //test both zero and normal timeouts + } + int processhandles_mid; + int threadhandles_mid; + RThread().HandleCount(processhandles_mid, threadhandles_mid); + qDebug() << threadhandles_mid - threadhandles_start << "new thread owned handles"; + QTest::qWait(100); + QCOMPARE(timerHelper.count, timercount); + qDeleteAll(timers); + } + int processhandles_end; + int threadhandles_end; + RThread().HandleCount(processhandles_end, threadhandles_end); + QCOMPARE(threadhandles_end, threadhandles_start); //RTimer::CreateLocal creates a thread owned handle + //Can not verify process handles because QObject::connect may create up to 2 mutexes + //from a QMutexPool (4 process owned handles with open C imp.) + //QCOMPARE(processhandles_end, processhandles_start); +} +#endif + QTEST_MAIN(tst_QTimer) #include "tst_qtimer.moc" |