chiark / gitweb /
timeout robustness: Introduce adns__timeout_{set,clear}
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 9 Dec 2016 20:46:40 +0000 (20:46 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 11 Jun 2020 15:13:02 +0000 (16:13 +0100)
This abstracts away the open-coded handling of qu->timeout.
Rename the field to catch all call sites.

No functional change.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/event.c
src/internal.h
src/query.c
src/transmit.c

index 28cc60cbeac9f40a09319020d8176a311883d4d6..845bc690af88a80a3308d2ef3f5c89cb1baa3902 100644 (file)
@@ -149,6 +149,11 @@ void adns__tcp_tryconnect(adns_state ads, struct timeval now) {
 
 /* 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;
@@ -212,8 +217,8 @@ static void timeouts_queue(adns_state ads, int act,
   
   for (qu= queue->head; qu; qu= nqu) {
     nqu= qu->next;
-    if (!timercmp(&now,&qu->timeout,>)) {
-      inter_maxtoabs(tv_io,tvbuf,now,qu->timeout);
+    if (!timercmp(&now,&qu->timeout_expires,>)) {
+      inter_maxtoabs(tv_io,tvbuf,now,qu->timeout_expires);
     } else {
       if (!act) { inter_immed(tv_io,tvbuf); return; }
       LIST_UNLINK(*queue,qu);
index 0fd64da3791fbe8ce89608676d756f07a1f78782..23c7aa6fddc3dd371173fc889e3c3af7260e2b94 100644 (file)
@@ -298,7 +298,7 @@ struct adns__query {
   int id, flags, retries;
   int udpnextserver;
   unsigned long udpsent; /* bitmap indexed by server */
-  struct timeval timeout;
+  struct timeval timeout_expires;
   time_t expires; /* Earliest expiry time of any record we used. */
 
   qcontext ctx;
@@ -885,6 +885,11 @@ void adns__autosys(adns_state ads, struct timeval now);
  * 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); }
+
+
 void adns__must_gettimeofday(adns_state ads, const struct timeval **now_io,
                             struct timeval *tv_buf);
 /* Call with care - might reentrantly cause queries to be completed! */
index 393478a0bad75590c7bdeeaf0c150764afcdc18a..4eba88871f651c921fbf727206868c9b2f009e3e 100644 (file)
@@ -72,7 +72,7 @@ static adns_query query_alloc(adns_state ads,
   qu->retries= 0;
   qu->udpnextserver= 0;
   qu->udpsent= 0;
-  timerclear(&qu->timeout);
+  adns__timeout_clear(qu);
   qu->expires= now.tv_sec + MAXTTLBELIEVE;
 
   memset(&qu->ctx,0,sizeof(qu->ctx));
index 1674dbc67fb6702c7adc525c7664a63dc1377a2d..bf2f8c608d47fdf8a74efb42402be781d6fa0bb8 100644 (file)
@@ -234,8 +234,7 @@ void adns__querysend_tcp(adns_query qu, struct timeval now) {
 
 static void query_usetcp(adns_query qu, struct timeval now) {
   qu->state= query_tcpw;
-  qu->timeout= now;
-  timevaladd(&qu->timeout,TCPWAITMS);
+  adns__timeout_set(qu,now,TCPWAITMS);
   LIST_LINK_TAIL(qu->ads->tcpw,qu);
   adns__querysend_tcp(qu,now);
   adns__tcp_tryconnect(qu->ads,now);
@@ -281,8 +280,7 @@ void adns__query_send(adns_query qu, struct timeval now) {
   if (r<0 && errno != EAGAIN)
     adns__warn(ads,serv,0,"sendto failed: %s",strerror(errno));
   
-  qu->timeout= now;
-  timevaladd(&qu->timeout,UDPRETRYMS);
+  adns__timeout_set(qu, now, UDPRETRYMS);
   qu->udpsent |= (1<<serv);
   qu->udpnextserver= (serv+1)%ads->nservers;
   qu->retries++;