Sebastian Kuschel reports that pfd_closing can be called for a socket
[u/mdw/putty] / timing.c
index 9c2a878..ccd76cd 100644 (file)
--- a/timing.c
+++ b/timing.c
 struct timer {
     timer_fn_t fn;
     void *ctx;
-    long now;
-    long when_set;
+    unsigned long now;
+    unsigned long when_set;
 };
 
 static tree234 *timers = NULL;
 static tree234 *timer_contexts = NULL;
-static long now = 0L;
+static unsigned long now = 0L;
 
 static int compare_timers(void *av, void *bv)
 {
@@ -62,7 +62,11 @@ static int compare_timers(void *av, void *bv)
      */
 #if defined(__LCC__) || defined(__clang__)
     /* lcc won't let us compare function pointers. Legal, but annoying. */
-    return memcmp(&a->fn, &b->fn, sizeof(a->fn));
+    {
+       int c = memcmp(&a->fn, &b->fn, sizeof(a->fn));
+       if (c)
+           return c;
+    }
 #else    
     if (a->fn < b->fn)
        return -1;
@@ -102,9 +106,9 @@ static void init_timers(void)
     }
 }
 
-long schedule_timer(int ticks, timer_fn_t fn, void *ctx)
+unsigned long schedule_timer(int ticks, timer_fn_t fn, void *ctx)
 {
-    long when;
+    unsigned long when;
     struct timer *t, *first;
 
     init_timers();
@@ -149,7 +153,7 @@ long schedule_timer(int ticks, timer_fn_t fn, void *ctx)
  * Returns the time (in ticks) expected until the next timer after
  * that triggers.
  */
-int run_timers(long anow, long *next)
+int run_timers(unsigned long anow, unsigned long *next)
 {
     struct timer *first;
 
@@ -170,8 +174,8 @@ int run_timers(long anow, long *next)
             */
            delpos234(timers, 0);
            sfree(first);
-       } else if (first->now - now <= 0 ||
-                  now - (first->when_set - 10) < 0) {
+       } else if (now - (first->when_set - 10) >
+                  first->now - (first->when_set - 10)) {
            /*
             * This timer is active and has reached its running
             * time. Run it.