/* 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);
int id, flags, retries;
int udpnextserver;
unsigned long udpsent; /* bitmap indexed by server */
- struct timeval timeout_expires;
+ int timeout_ms;
+ struct timeval timeout_started;
time_t expires; /* Earliest expiry time of any record we used. */
qcontext ctx;
* lest we end up in recursive descent !
*/
-void adns__timeout_set(adns_query qu, struct timeval now, int ms);
-static inline void adns__timeout_clear(adns_query qu)
- { timerclear(&qu->timeout_expires); }
+static inline void
+adns__timeout_set(adns_query qu, struct timeval now, long ms)
+ { qu->timeout_ms= ms; qu->timeout_started= now; }
+
+static inline void
+adns__timeout_clear(adns_query qu)
+ { qu->timeout_ms= 0; timerclear(&qu->timeout_started); }
void adns__must_gettimeofday(adns_state ads, const struct timeval **now_io,