]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
Another fix to timer handling.
authorSimon Tatham <anakin@pobox.com>
Sun, 13 Jul 2014 07:49:29 +0000 (07:49 +0000)
committerSimon Tatham <anakin@pobox.com>
Sun, 13 Jul 2014 07:49:29 +0000 (07:49 +0000)
Robert de Bath points out that failure to remove the timer whose
callback returned FALSE may not have been the cause of runaway timer
explosion; another possibility is that a function called from
timer_trigger()'s call to run_timers() has already set a timer up by
the time run_timers() returns, and then we set another one up on top
of it. Fix that too.

[originally from svn r10206]

unix/gtkwin.c

index fe597bf26206179f63290ee37b9320211211d525..4cce11e6e52b9431fab0df0423ced7c835a81605 100644 (file)
@@ -1477,15 +1477,20 @@ static gint timer_trigger(gpointer data)
     long ticks;
 
     /*
-     * Remove the timer we got here on; if we need another one, we'll
-     * set it up below.
+     * Destroy the timer we got here on.
      */
     if (timer_id) {
        gtk_timeout_remove(timer_id);
         timer_id = 0;
     }
 
-    if (run_timers(now, &next)) {
+    /*
+     * run_timers() may cause a call to timer_change_notify, in which
+     * case a new timer will already have been set up and left in
+     * timer_id. If it hasn't, and run_timers reports that some timing
+     * still needs to be done, we do it ourselves.
+     */
+    if (run_timers(now, &next) && !timer_id) {
        then = now;
        now = GETTICKCOUNT();
        if (now - then > next - then)