]> asedeno.scripts.mit.edu Git - PuTTY.git/blob - pinger.c
first pass
[PuTTY.git] / pinger.c
1 /*
2  * pinger.c: centralised module that deals with sending TS_PING
3  * keepalives, to avoid replicating this code in multiple backends.
4  */
5
6 #include "putty.h"
7
8 struct pinger_tag {
9     int interval;
10     int pending;
11     unsigned long when_set, next;
12     Backend *back;
13     void *backhandle;
14 };
15
16 static void pinger_schedule(Pinger pinger);
17
18 static void pinger_timer(void *ctx, unsigned long now)
19 {
20     Pinger pinger = (Pinger)ctx;
21
22     if (pinger->pending && now == pinger->next) {
23         pinger->back->special(pinger->backhandle, TS_PING);
24         pinger->pending = FALSE;
25         pinger_schedule(pinger);
26     }
27 }
28
29 static void pinger_schedule(Pinger pinger)
30 {
31     unsigned long next;
32
33     if (!pinger->interval) {
34         pinger->pending = FALSE;       /* cancel any pending ping */
35         return;
36     }
37
38     next = schedule_timer(pinger->interval * TICKSPERSEC,
39                           pinger_timer, pinger);
40     if (!pinger->pending ||
41         (next - pinger->when_set) < (pinger->next - pinger->when_set)) {
42         pinger->next = next;
43         pinger->when_set = timing_last_clock();
44         pinger->pending = TRUE;
45     }
46 }
47
48 Pinger pinger_new(Conf *conf, Backend *back, void *backhandle)
49 {
50     Pinger pinger = snew(struct pinger_tag);
51
52     pinger->interval = conf_get_int(conf, CONF_ping_interval);
53     pinger->pending = FALSE;
54     pinger->back = back;
55     pinger->backhandle = backhandle;
56     pinger_schedule(pinger);
57
58     return pinger;
59 }
60
61 void pinger_reconfig(Pinger pinger, Conf *oldconf, Conf *newconf)
62 {
63     int newinterval = conf_get_int(newconf, CONF_ping_interval);
64     if (conf_get_int(oldconf, CONF_ping_interval) != newinterval) {
65         pinger->interval = newinterval;
66         pinger_schedule(pinger);
67     }
68 }
69
70 void pinger_free(Pinger pinger)
71 {
72     expire_timer_context(pinger);
73     sfree(pinger);
74 }