X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/faa80db058efda992c5b963912e5c14af71bd030..99bc1313918e09582e45b7437d0d1680caca88ac:/src/unix/timerunx.cpp diff --git a/src/unix/timerunx.cpp b/src/unix/timerunx.cpp index e742b79486..bcdebf9167 100644 --- a/src/unix/timerunx.cpp +++ b/src/unix/timerunx.cpp @@ -29,7 +29,9 @@ #include "wx/event.h" #endif +#include "wx/apptrait.h" #include "wx/longlong.h" +#include "wx/vector.h" #include #include @@ -133,16 +135,17 @@ bool wxTimerScheduler::GetNext(wxUsecClock_t *remaining) const return true; } -void wxTimerScheduler::NotifyExpired() +bool wxTimerScheduler::NotifyExpired() { if ( m_timers.empty() ) - return; + return false; const wxUsecClock_t now = wxGetLocalTimeUsec(); - wxTimerList::iterator cur, - next; - for ( cur = m_timers.begin(); cur != m_timers.end(); cur = next ) + typedef wxVector TimerImpls; + TimerImpls toNotify; + for ( wxTimerList::iterator next, + cur = m_timers.begin(); cur != m_timers.end(); cur = next ) { wxTimerSchedule * const s = *cur; if ( s->m_expiration > now ) @@ -171,13 +174,33 @@ void wxTimerScheduler::NotifyExpired() } else // reschedule the next timer expiration { - s->m_expiration += timer->GetInterval()*1000; + // always keep the expiration time in the future, i.e. base it on + // the current time instead of just offsetting it from the current + // expiration time because it could happen that we're late and the + // current expiration time is (far) in the past + s->m_expiration = now + timer->GetInterval()*1000; DoAddTimer(s); } - // and finally notify the timer - timer->Notify(); + // we can't notify the timer from this loop as the timer event handler + // could modify m_timers (for example, but not only, by stopping this + // timer) which would render our iterators invalid, so do it after the + // loop end + toNotify.push_back(timer); + } + + if ( toNotify.empty() ) + return false; + + for ( TimerImpls::const_iterator i = toNotify.begin(), + end = toNotify.end(); + i != end; + ++i ) + { + (*i)->Notify(); } + + return true; } // ============================================================================ @@ -256,5 +279,10 @@ wxUsecClock_t wxGetLocalTimeUsec() return wxGetLocalTimeMillis() * 1000L; } +wxTimerImpl *wxConsoleAppTraits::CreateTimerImpl(wxTimer *timer) +{ + return new wxUnixTimerImpl(timer); +} + #endif // wxUSE_TIMER