]> asedeno.scripts.mit.edu Git - PuTTY.git/blobdiff - pinger.c
first pass
[PuTTY.git] / pinger.c
index 3e2626f562b3e9386067d613b249f8860425dc09..d8f110ac7fad6cee8a73ba7ae0c5d9cd3e1031e2 100644 (file)
--- a/pinger.c
+++ b/pinger.c
@@ -8,18 +8,18 @@
 struct pinger_tag {
     int interval;
     int pending;
-    long next;
+    unsigned long when_set, next;
     Backend *back;
     void *backhandle;
 };
 
 static void pinger_schedule(Pinger pinger);
 
-static void pinger_timer(void *ctx, long now)
+static void pinger_timer(void *ctx, unsigned long now)
 {
     Pinger pinger = (Pinger)ctx;
 
-    if (pinger->pending && now - pinger->next >= 0) {
+    if (pinger->pending && now == pinger->next) {
        pinger->back->special(pinger->backhandle, TS_PING);
        pinger->pending = FALSE;
        pinger_schedule(pinger);
@@ -28,7 +28,7 @@ static void pinger_timer(void *ctx, long now)
 
 static void pinger_schedule(Pinger pinger)
 {
-    int next;
+    unsigned long next;
 
     if (!pinger->interval) {
        pinger->pending = FALSE;       /* cancel any pending ping */
@@ -37,8 +37,10 @@ static void pinger_schedule(Pinger pinger)
 
     next = schedule_timer(pinger->interval * TICKSPERSEC,
                          pinger_timer, pinger);
-    if (!pinger->pending || next < pinger->next) {
+    if (!pinger->pending ||
+        (next - pinger->when_set) < (pinger->next - pinger->when_set)) {
        pinger->next = next;
+        pinger->when_set = timing_last_clock();
        pinger->pending = TRUE;
     }
 }