chiark / gitweb /
Also check specific query where applicable.
authorian <ian>
Sat, 25 Sep 1999 16:13:03 +0000 (16:13 +0000)
committerian <ian>
Sat, 25 Sep 1999 16:13:03 +0000 (16:13 +0000)
src/adns.h
src/check.c
src/event.c
src/internal.h
src/poll.c
src/query.c
src/setup.c

index c440222..96eb0a5 100644 (file)
@@ -381,9 +381,11 @@ adns_query adns_forallqueries_next(adns_state ads, void **context_r);
  * context_r may be 0.  *context_r may not be set when _next returns 0.
  */
 
-void adns_checkconsistency(adns_state ads);
+void adns_checkconsistency(adns_state ads, adns_query qu);
 /* Checks the consistency of adns's internal data structures.
  * If any error is found, the program will abort().
+ * You may pass 0 for qu; if you pass non-null then additional checks
+ * are done to make sure that qu is a valid query.
  */
 
 /*
index 80c5ac3..84fe168 100644 (file)
@@ -22,7 +22,9 @@
 
 #include "internal.h"
 
-void adns_checkconsistency(adns_state ads) { adns__consistency(ads,cc_user); }
+void adns_checkconsistency(adns_state ads, adns_query qu) {
+  adns__consistency(ads,qu,cc_user);
+}
 
 #define DLIST_CHECK(list, nodevar, part, body)                                 \
   if ((list).head) {                                                           \
@@ -35,6 +37,15 @@ void adns_checkconsistency(adns_state ads) { adns__consistency(ads,cc_user); }
     }                                                                          \
   }
 
+#define DLIST_ASSERTON(node, nodevar, list, part)                              \
+  do {                                                                         \
+    for ((nodevar)= (list).head;                                               \
+        (nodevar) != (node);                                                   \
+        (nodevar)= (nodevar)->part next) {                                     \
+      assert((nodevar));                                                       \
+    }                                                                          \
+  } while(0)
+
 static void checkc_query_alloc(adns_state ads, adns_query qu) {
   allocnode *an;
 
@@ -43,11 +54,14 @@ static void checkc_query_alloc(adns_state ads, adns_query qu) {
 }
 
 static void checkc_query(adns_state ads, adns_query qu) {
+  adns_query child;
+
   assert(qu->udpnextserver < ads->nservers);
   assert(!(qu->udpsent & (~0UL << ads->nservers)));
   assert(!(qu->tcpfailed & (~0UL << ads->nservers)));
   assert(qu->udpretries <= UDPMAXRETRIES);
   assert(qu->search_pos <= ads->nsearchlist);
+  if (qu->parent) DLIST_ASSERTON(qu, child, qu->parent->children, siblings.);
 }
 
 static void checkc_global(adns_state ads) {
@@ -126,7 +140,9 @@ static void checkc_queue_output(adns_state ads) {
   });
 }
 
-void adns__consistency(adns_state ads, consistency_checks cc) {
+void adns__consistency(adns_state ads, adns_query qu, consistency_checks cc) {
+  adns_query search;
+  
   switch (cc) {
   case cc_user:
     break;
@@ -144,4 +160,22 @@ void adns__consistency(adns_state ads, consistency_checks cc) {
   checkc_queue_timew(ads);
   checkc_queue_childw(ads);
   checkc_queue_output(ads);
+
+  if (qu) {
+    switch (qu->state) {
+    case query_tosend:
+    case query_tcpwait:
+    case query_tcpsent:
+      DLIST_ASSERTON(qu, search, ads->timew, );
+      break;
+    case query_child:
+      DLIST_ASSERTON(qu, search, ads->childw, );
+      break;
+    case query_done:
+      DLIST_ASSERTON(qu, search, ads->output, );
+      break;
+    default:
+      assert(!"specific query state");
+    }
+  }
 }
index f84204d..7702fe1 100644 (file)
@@ -191,18 +191,18 @@ void adns__timeouts(adns_state ads, int act,
 void adns_firsttimeout(adns_state ads,
                       struct timeval **tv_io, struct timeval *tvbuf,
                       struct timeval now) {
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
   adns__timeouts(ads, 0, tv_io,tvbuf, now);
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
 }
 
 void adns_processtimeouts(adns_state ads, const struct timeval *now) {
   struct timeval tv_buf;
 
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
   adns__must_gettimeofday(ads,&now,&tv_buf);
   if (now) adns__timeouts(ads, 1, 0,0, *now);
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
 }
 
 /* fd handling functions.  These are the top-level of the real work of
@@ -239,7 +239,7 @@ int adns_processreadable(adns_state ads, int fd, const struct timeval *now) {
   byte udpbuf[DNS_MAXUDP];
   struct sockaddr_in udpaddr;
   
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
 
   switch (ads->tcpstate) {
   case server_disconnected:
@@ -325,14 +325,14 @@ int adns_processreadable(adns_state ads, int fd, const struct timeval *now) {
   }
   r= 0;
 xit:
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
   return r;
 }
 
 int adns_processwriteable(adns_state ads, int fd, const struct timeval *now) {
   int r;
   
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
 
   switch (ads->tcpstate) {
   case server_disconnected:
@@ -378,12 +378,12 @@ int adns_processwriteable(adns_state ads, int fd, const struct timeval *now) {
   }
   r= 0;
 xit:
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
   return r;
 }
   
 int adns_processexceptional(adns_state ads, int fd, const struct timeval *now) {
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
   switch (ads->tcpstate) {
   case server_disconnected:
     break;
@@ -395,7 +395,7 @@ int adns_processexceptional(adns_state ads, int fd, const struct timeval *now) {
   default:
     abort();
   }
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
   return 0;
 }
 
@@ -446,7 +446,7 @@ void adns_beforeselect(adns_state ads, int *maxfd_io, fd_set *readfds_io,
   struct pollfd pollfds[MAX_POLLFDS];
   int i, fd, maxfd, npollfds;
   
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
 
   if (tv_mod && (!*tv_mod || (*tv_mod)->tv_sec || (*tv_mod)->tv_usec)) {
     /* The caller is planning to sleep. */
@@ -467,7 +467,7 @@ void adns_beforeselect(adns_state ads, int *maxfd_io, fd_set *readfds_io,
   *maxfd_io= maxfd;
 
 xit:
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
 }
 
 void adns_afterselect(adns_state ads, int maxfd, const fd_set *readfds,
@@ -477,7 +477,7 @@ void adns_afterselect(adns_state ads, int maxfd, const fd_set *readfds,
   struct pollfd pollfds[MAX_POLLFDS];
   int npollfds, i;
 
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
   adns__must_gettimeofday(ads,&now,&tv_buf);
   if (!now) goto xit;
   adns_processtimeouts(ads,now);
@@ -489,13 +489,13 @@ void adns_afterselect(adns_state ads, int maxfd, const fd_set *readfds,
                 maxfd,readfds,writefds,exceptfds,
                 *now, 0);
 xit:
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
 }
 
 /* General helpful functions. */
 
 void adns_globalsystemfailure(adns_state ads) {
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
 
   while (ads->timew.head) {
     adns__query_fail(ads->timew.head, adns_s_systemfail);
@@ -511,7 +511,7 @@ void adns_globalsystemfailure(adns_state ads) {
   default:
     abort();
   }
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
 }
 
 int adns_processany(adns_state ads) {
@@ -520,7 +520,7 @@ int adns_processany(adns_state ads) {
   struct pollfd pollfds[MAX_POLLFDS];
   int npollfds;
 
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
 
   r= gettimeofday(&now,0);
   if (!r) adns_processtimeouts(ads,&now);
@@ -531,7 +531,7 @@ int adns_processany(adns_state ads) {
                 0,0,0,0,
                 now,&r);
 
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
   return r;
 }
 
@@ -569,7 +569,7 @@ int adns_wait(adns_state ads,
   fd_set readfds, writefds, exceptfds;
   struct timeval tvbuf, *tvp;
   
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,*query_io,cc_entex);
   for (;;) {
     r= internal_check(ads,query_io,answer_r,context_r);
     if (r != EWOULDBLOCK) break;
@@ -589,7 +589,7 @@ int adns_wait(adns_state ads,
       adns_afterselect(ads,maxfd,&readfds,&writefds,&exceptfds,0);
     }
   }
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
   return r;
 }
 
@@ -600,11 +600,11 @@ int adns_check(adns_state ads,
   struct timeval now;
   int r;
   
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,*query_io,cc_entex);
   r= gettimeofday(&now,0);
   if (!r) adns__autosys(ads,now);
 
   r= internal_check(ads,query_io,answer_r,context_r);
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
   return r;
 }
index 6dbbff0..12ecd6f 100644 (file)
@@ -642,7 +642,7 @@ void adns__fdevents(adns_state ads,
 
 /* From check.c: */
 
-void adns__consistency(adns_state ads, consistency_checks cc);
+void adns__consistency(adns_state ads, adns_query qu, consistency_checks cc);
 
 /* Useful static inline functions: */
 
index 6183e46..7b1054a 100644 (file)
@@ -32,7 +32,7 @@ int adns_beforepoll(adns_state ads, struct pollfd *fds, int *nfds_io, int *timeo
   int space, found, timeout_ms, r;
   struct pollfd fds_tmp[MAX_POLLFDS];
 
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
 
   if (timeout_io) {
     adns__must_gettimeofday(ads,&now,&tv_nowbuf);
@@ -72,7 +72,7 @@ int adns_beforepoll(adns_state ads, struct pollfd *fds, int *nfds_io, int *timeo
   }
   r= 0;
 xit:
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
   return r;
 }
 
@@ -80,13 +80,13 @@ void adns_afterpoll(adns_state ads, const struct pollfd *fds, int nfds,
                    const struct timeval *now) {
   struct timeval tv_buf;
 
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
   adns__must_gettimeofday(ads,&now,&tv_buf);
   if (now) {
     adns__timeouts(ads, 1, 0,0, *now);
     adns__fdevents(ads, fds,nfds, 0,0,0,0, *now,0);
   }
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
 }
 
 #endif
index d1d0b31..172ff06 100644 (file)
@@ -201,7 +201,7 @@ int adns_submit(adns_state ads,
   adns_query qu;
   const char *p;
 
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
 
   typei= adns__findtype(type);
   if (!typei) return ENOSYS;
@@ -238,18 +238,18 @@ int adns_submit(adns_state ads,
     }
     query_simple(ads,qu, owner,ol, typei,flags, now);
   }
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,qu,cc_entex);
   return 0;
 
  x_adnsfail:
   adns__query_fail(qu,stat);
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,qu,cc_entex);
   return 0;
 
  x_errno:
   r= errno;
   assert(r);
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
   return r;
 }
 
@@ -369,7 +369,7 @@ void adns_cancel(adns_query qu) {
   adns_state ads;
 
   ads= qu->ads;
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,qu,cc_entex);
   switch (qu->state) {
   case query_tosend: case query_tcpwait: case query_tcpsent:
     LIST_UNLINK(ads->timew,qu);
@@ -386,7 +386,7 @@ void adns_cancel(adns_query qu) {
   free_query_allocs(qu);
   free(qu->answer);
   free(qu);
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
 }
 
 void adns__update_expires(adns_query qu, unsigned long ttl, struct timeval now) {
index e29c2cf..6ef2d12 100644 (file)
@@ -545,7 +545,7 @@ int adns_init(adns_state *ads_r, adns_initflags flags, FILE *diagfile) {
   r= init_finish(ads);
   if (r) return r;
 
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
   *ads_r= ads;
   return 0;
 }
@@ -565,14 +565,14 @@ int adns_init_strcfg(adns_state *ads_r, adns_initflags flags,
   }
 
   r= init_finish(ads);  if (r) return r;
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
   *ads_r= ads;
   return 0;
 }
 
 
 void adns_finish(adns_state ads) {
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
   for (;;) {
     if (ads->timew.head) adns_cancel(ads->timew.head);
     else if (ads->childw.head) adns_cancel(ads->childw.head);
@@ -587,7 +587,7 @@ void adns_finish(adns_state ads) {
 }
 
 void adns_forallqueries_begin(adns_state ads) {
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
   ads->forallnext=
     ads->timew.head ? ads->timew.head :
     ads->childw.head ? ads->childw.head :
@@ -597,7 +597,7 @@ void adns_forallqueries_begin(adns_state ads) {
 adns_query adns_forallqueries_next(adns_state ads, void **context_r) {
   adns_query qu, nqu;
 
-  adns__consistency(ads,cc_entex);
+  adns__consistency(ads,0,cc_entex);
   nqu= ads->forallnext;
   for (;;) {
     qu= nqu;