*/
int process_chk(struct task *t)
{
+ __label__ new_chk, out;
struct server *s = t->context;
struct sockaddr_in sa;
int fd;
+ int next_time;
//fprintf(stderr, "process_chk: task=%p\n", t);
//fprintf(stderr, "process_chk: 2\n");
if (!tv_ms_le2(&t->expire, &now)) { /* not good time yet */
task_queue(t); /* restore t to its place in the task list */
- return tv_ms_remain2(&now, &t->expire);
+ next_time = tv_ms_remain2(&now, &t->expire);
+ goto out;
}
/* we don't send any health-checks when the proxy is stopped or when
while (tv_ms_le2(&t->expire, &now))
tv_ms_add(&t->expire, &t->expire, s->inter);
task_queue(t); /* restore t to its place in the task list */
- return tv_ms_remain2(&now, &t->expire);
+ next_time = tv_ms_remain2(&now, &t->expire);
+ goto out;
}
/* we'll initiate a new check */
//fprintf(stderr, "process_chk: 11\n");
s->result = 0;
task_queue(t); /* restore t to its place in the task list */
- return tv_ms_remain2(&now, &t->expire);
+ next_time = tv_ms_remain2(&now, &t->expire);
+ out:
+ /* Ensure that we don't report sub-millisecond timeouts */
+ if (next_time != TIME_ETERNITY)
+ next_time++;
+ return next_time;
}
*/
int wake_expired_tasks()
{
+ __label__ out;
int slen;
struct task *task;
void *data;
if (likely(timer_wq.data != NULL)) {
task = LIST_ELEM(timer_wq.data, struct task *, qlist);
- if (likely(__tv_isge(&task->expire, &now) > 0))
- return tv_ms_remain(&now, &task->expire);
+ if (likely(__tv_isge(&task->expire, &now) > 0)) {
+ next_time = tv_ms_remain(&now, &task->expire);
+ goto out;
+ }
}
/* OK we lose. Let's scan the tree then. */
task->state = TASK_RUNNING;
}
}
+ out:
+ /* Ensure that we don't report sub-millisecond timeouts */
+ if (next_time != TIME_ETERNITY)
+ next_time++;
return next_time;
}