/* Timeout handling functions. */
-void adns__timeout_set(adns_query qu, struct timeval now, int ms) {
- qu->timeout_expires= now;
- timevaladd(&qu->timeout_expires,ms);
-}
-
void adns__must_gettimeofday(adns_state ads, const struct timeval **now_io,
struct timeval *tv_buf) {
const struct timeval *now;
struct timeval **tv_io, struct timeval *tvbuf,
struct timeval now, struct query_queue *queue) {
adns_query qu, nqu;
+ struct timeval expires;
for (qu= queue->head; qu; qu= nqu) {
nqu= qu->next;
- if (!timercmp(&now,&qu->timeout_expires,>)) {
- inter_maxtoabs(tv_io,tvbuf,now,qu->timeout_expires);
+ if (timercmp(&now,&qu->timeout_started,<)) /* clock rewound */
+ qu->timeout_started= now;
+ expires= qu->timeout_started;
+ timevaladd(&expires, qu->timeout_ms);
+ if (!timercmp(&now,&expires,>)) {
+ inter_maxtoabs(tv_io,tvbuf,now,expires);
} else {
if (!act) { inter_immed(tv_io,tvbuf); return; }
LIST_UNLINK(*queue,qu);