]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/timerunx.cpp
fixed wxXmlResource::Load's detection of filenames to be done as early as possible
[wxWidgets.git] / src / unix / timerunx.cpp
index c3c563af04ff219d91dfd0a8c20c31f3bf94d699..bcdebf91679b28944a660b19971a1c642ce61f48 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "wx/apptrait.h"
 #include "wx/longlong.h"
+#include "wx/vector.h"
 
 #include <sys/time.h>
 #include <signal.h>
@@ -134,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<wxUnixTimerImpl *> 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 )
@@ -180,9 +182,25 @@ void wxTimerScheduler::NotifyExpired()
             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;
 }
 
 // ============================================================================