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);
static void pinger_schedule(Pinger pinger)
{
- int next;
+ unsigned long next;
if (!pinger->interval) {
pinger->pending = FALSE; /* cancel any pending ping */
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;
}
}