+++ /dev/null
-/*\r
- * pinger.c: centralised module that deals with sending TS_PING\r
- * keepalives, to avoid replicating this code in multiple backends.\r
- */\r
-\r
-#include "putty.h"\r
-\r
-struct pinger_tag {\r
- int interval;\r
- int pending;\r
- long next;\r
- Backend *back;\r
- void *backhandle;\r
-};\r
-\r
-static void pinger_schedule(Pinger pinger);\r
-\r
-static void pinger_timer(void *ctx, long now)\r
-{\r
- Pinger pinger = (Pinger)ctx;\r
-\r
- if (pinger->pending && now - pinger->next >= 0) {\r
- pinger->back->special(pinger->backhandle, TS_PING);\r
- pinger->pending = FALSE;\r
- pinger_schedule(pinger);\r
- }\r
-}\r
-\r
-static void pinger_schedule(Pinger pinger)\r
-{\r
- int next;\r
-\r
- if (!pinger->interval) {\r
- pinger->pending = FALSE; /* cancel any pending ping */\r
- return;\r
- }\r
-\r
- next = schedule_timer(pinger->interval * TICKSPERSEC,\r
- pinger_timer, pinger);\r
- if (!pinger->pending || next < pinger->next) {\r
- pinger->next = next;\r
- pinger->pending = TRUE;\r
- }\r
-}\r
-\r
-Pinger pinger_new(Config *cfg, Backend *back, void *backhandle)\r
-{\r
- Pinger pinger = snew(struct pinger_tag);\r
-\r
- pinger->interval = cfg->ping_interval;\r
- pinger->pending = FALSE;\r
- pinger->back = back;\r
- pinger->backhandle = backhandle;\r
- pinger_schedule(pinger);\r
-\r
- return pinger;\r
-}\r
-\r
-void pinger_reconfig(Pinger pinger, Config *oldcfg, Config *newcfg)\r
-{\r
- if (oldcfg->ping_interval != newcfg->ping_interval) {\r
- pinger->interval = newcfg->ping_interval;\r
- pinger_schedule(pinger);\r
- }\r
-}\r
-\r
-void pinger_free(Pinger pinger)\r
-{\r
- expire_timer_context(pinger);\r
- sfree(pinger);\r
-}\r