From 7b7ad02681f2c28fb18d053618f6804e989b2f56 Mon Sep 17 00:00:00 2001 From: Jonathan Liu Date: Thu, 18 Sep 2014 19:54:46 +1000 Subject: Improve checking for event/socket notifiers and timers Starting/stopping timers from another thread may result in errors that may not appear until hours, days or weeks after if a release build of Qt is used with the GLib/UNIX event dispatchers. Such errors may manifest as warnings such as "QObject::killTimer(): Error: timer id 7 is not valid for object 0x2a51b488 (), timer has not been killed" and application crashes (e.g. crashes in malloc, realloc and malloc_consolidate). Initial-patch-by: Eike Ziller Task-number: QTBUG-40636 Change-Id: I2de50d50eb1fc7467fcebb9c73b74d2f85137933 Reviewed-by: Jocelyn Turcotte Reviewed-by: Thiago Macieira --- src/corelib/kernel/qeventdispatcher_winrt.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/corelib/kernel/qeventdispatcher_winrt.cpp') diff --git a/src/corelib/kernel/qeventdispatcher_winrt.cpp b/src/corelib/kernel/qeventdispatcher_winrt.cpp index aec0981677..d75d30f48e 100644 --- a/src/corelib/kernel/qeventdispatcher_winrt.cpp +++ b/src/corelib/kernel/qeventdispatcher_winrt.cpp @@ -254,13 +254,15 @@ void QEventDispatcherWinRT::registerTimer(int timerId, int interval, Qt::TimerTy { Q_UNUSED(timerType); +#ifndef QT_NO_DEBUG if (timerId < 1 || interval < 0 || !object) { qWarning("QEventDispatcherWinRT::registerTimer: invalid arguments"); return; } else if (object->thread() != thread() || thread() != QThread::currentThread()) { - qWarning("QObject::startTimer: timers cannot be started from another thread"); + qWarning("QEventDispatcherWinRT::registerTimer: timers cannot be started from another thread"); return; } +#endif Q_D(QEventDispatcherWinRT); @@ -289,14 +291,16 @@ void QEventDispatcherWinRT::registerTimer(int timerId, int interval, Qt::TimerTy bool QEventDispatcherWinRT::unregisterTimer(int timerId) { +#ifndef QT_NO_DEBUG if (timerId < 1) { qWarning("QEventDispatcherWinRT::unregisterTimer: invalid argument"); return false; } if (thread() != QThread::currentThread()) { - qWarning("QObject::killTimer: timers cannot be stopped from another thread"); + qWarning("QEventDispatcherWinRT::unregisterTimer: timers cannot be stopped from another thread"); return false; } +#endif Q_D(QEventDispatcherWinRT); @@ -310,15 +314,17 @@ bool QEventDispatcherWinRT::unregisterTimer(int timerId) bool QEventDispatcherWinRT::unregisterTimers(QObject *object) { +#ifndef QT_NO_DEBUG if (!object) { qWarning("QEventDispatcherWinRT::unregisterTimers: invalid argument"); return false; } QThread *currentThread = QThread::currentThread(); if (object->thread() != thread() || thread() != currentThread) { - qWarning("QObject::killTimers: timers cannot be stopped from another thread"); + qWarning("QEventDispatcherWinRT::unregisterTimers: timers cannot be stopped from another thread"); return false; } +#endif Q_D(QEventDispatcherWinRT); for (QHash::iterator it = d->timerDict.begin(); it != d->timerDict.end();) { -- cgit v1.2.3