chiark / gitweb /
Consistency checks: Distinguish "entry" from exit
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 10 Dec 2016 22:27:08 +0000 (22:27 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 26 May 2020 19:24:04 +0000 (20:24 +0100)
Many externally-facing functions are called by adns itself.  In such a
case, on entry, there may be intdone queries in flight.  This is fine.

So distinguish cc_enter from cc_exit, and check intdone only on
cc_exit.

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

index c773508d722d63d4fb6a4e2d371cb2b0210132d3..f6af1c7e606ef5157a8bb4c4e20c808478a5556e 100644 (file)
@@ -187,7 +187,10 @@ void adns__consistency(adns_state ads, adns_query qu, consistency_checks cc) {
   switch (cc) {
   case cc_user:
     break;
-  case cc_entex:
+  case cc_enter:
+    if (!(ads->iflags & adns_if_checkc_entex)) return;
+    break;
+  case cc_exit:
     if (!(ads->iflags & adns_if_checkc_entex)) return;
     assert(!ads->intdone.head);
     break;
index 81766c5ac48f8d605da5dab8788589e4ec367b4d..903426025dce94fa8b14f1498962a029bd0e50c5 100644 (file)
@@ -284,7 +284,7 @@ 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,0,cc_entex);
+  adns__consistency(ads,0,cc_enter);
   adns__timeouts(ads, 0, tv_io,tvbuf, now);
   adns__returning(ads,0);
 }
@@ -292,7 +292,7 @@ void adns_firsttimeout(adns_state ads,
 void adns_processtimeouts(adns_state ads, const struct timeval *now) {
   struct timeval tv_buf;
 
-  adns__consistency(ads,0,cc_entex);
+  adns__consistency(ads,0,cc_enter);
   adns__must_gettimeofday(ads,&now,&tv_buf);
   if (now) adns__timeouts(ads, 1, 0,0, *now);
   adns__returning(ads,0);
@@ -346,7 +346,7 @@ int adns_processreadable(adns_state ads, int fd, const struct timeval *now) {
   struct udpsocket *udp;
   adns_sockaddr udpaddr;
   
-  adns__consistency(ads,0,cc_entex);
+  adns__consistency(ads,0,cc_enter);
 
   switch (ads->tcpstate) {
   case server_disconnected:
@@ -433,7 +433,7 @@ xit:
 int adns_processwriteable(adns_state ads, int fd, const struct timeval *now) {
   int r;
   
-  adns__consistency(ads,0,cc_entex);
+  adns__consistency(ads,0,cc_enter);
 
   switch (ads->tcpstate) {
   case server_disconnected:
@@ -506,7 +506,7 @@ xit:
   
 int adns_processexceptional(adns_state ads, int fd,
                            const struct timeval *now) {
-  adns__consistency(ads,0,cc_entex);
+  adns__consistency(ads,0,cc_enter);
   switch (ads->tcpstate) {
   case server_disconnected:
   case server_broken:
@@ -575,7 +575,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,0,cc_entex);
+  adns__consistency(ads,0,cc_enter);
 
   if (tv_mod && (!*tv_mod || (*tv_mod)->tv_sec || (*tv_mod)->tv_usec)) {
     /* The caller is planning to sleep. */
@@ -606,7 +606,7 @@ void adns_afterselect(adns_state ads, int maxfd, const fd_set *readfds,
   struct pollfd pollfds[MAX_POLLFDS];
   int npollfds, i;
 
-  adns__consistency(ads,0,cc_entex);
+  adns__consistency(ads,0,cc_enter);
   adns__must_gettimeofday(ads,&now,&tv_buf);
   if (!now) goto xit;
   adns_processtimeouts(ads,now);
@@ -627,7 +627,7 @@ void adns_globalsystemfailure(adns_state ads) {
   /* Must not be called by adns during actual processing of a
    * particular query, since it reenters adns.  Only safe to call in
    * situations where it would be safe to call adns_returning. */
-  adns__consistency(ads,0,cc_entex);
+  adns__consistency(ads,0,cc_enter);
 
   for (;;) {
     adns_query qu;
@@ -663,7 +663,7 @@ int adns_processany(adns_state ads) {
   struct pollfd pollfds[MAX_POLLFDS];
   int npollfds;
 
-  adns__consistency(ads,0,cc_entex);
+  adns__consistency(ads,0,cc_enter);
 
   r= gettimeofday(&now,0);
   if (!r) adns_processtimeouts(ads,&now);
@@ -722,7 +722,7 @@ int adns_wait(adns_state ads,
   fd_set readfds, writefds, exceptfds;
   struct timeval tvbuf, *tvp;
   
-  adns__consistency(ads,*query_io,cc_entex);
+  adns__consistency(ads,*query_io,cc_enter);
   for (;;) {
     r= adns__internal_check(ads,query_io,answer_r,context_r);
     if (r != EAGAIN) break;
@@ -754,7 +754,7 @@ int adns_check(adns_state ads,
   struct timeval now;
   int r;
   
-  adns__consistency(ads,*query_io,cc_entex);
+  adns__consistency(ads,*query_io,cc_enter);
   r= gettimeofday(&now,0);
   if (!r) adns__autosys(ads,now);
 
index 45d8ab1dac903187f37a16df938a9b78202faa45..1741bf11cfeefe25da99f0888649ecbbeafd9ded 100644 (file)
@@ -95,7 +95,8 @@ typedef unsigned char byte;
 
 typedef enum {
   cc_user,
-  cc_entex,
+  cc_enter,
+  cc_exit,
   cc_freq
 } consistency_checks;
 
index 917a524344d76832ad21f87c0c7431d7f503c3e3..35a42820d3229e2a28adb1d8a0686fb1c63fec33 100644 (file)
@@ -37,7 +37,7 @@ int adns_beforepoll(adns_state ads, struct pollfd *fds, int *nfds_io,
   int space, found, timeout_ms, r;
   struct pollfd fds_tmp[MAX_POLLFDS];
 
-  adns__consistency(ads,0,cc_entex);
+  adns__consistency(ads,0,cc_enter);
 
   if (timeout_io) {
     adns__must_gettimeofday(ads,&now,&tv_nowbuf);
@@ -85,7 +85,7 @@ void adns_afterpoll(adns_state ads, const struct pollfd *fds, int nfds,
                    const struct timeval *now) {
   struct timeval tv_buf;
 
-  adns__consistency(ads,0,cc_entex);
+  adns__consistency(ads,0,cc_enter);
   adns__must_gettimeofday(ads,&now,&tv_buf);
   if (now) {
     adns__timeouts(ads, 1, 0,0, *now);
@@ -102,7 +102,7 @@ int adns_wait_poll(adns_state ads,
   int r, nfds, to;
   struct pollfd fds[MAX_POLLFDS];
   
-  adns__consistency(ads,0,cc_entex);
+  adns__consistency(ads,0,cc_enter);
 
   for (;;) {
     r= adns__internal_check(ads,query_io,answer_r,context_r);
index 438b4fd21a5f9f658e69185c7259c0a09545ccbd..4d6ef8dd5017536c56ab3c24c3283a44669c06c8 100644 (file)
@@ -273,7 +273,7 @@ int adns_submit(adns_state ads,
   adns_query qu;
   const char *p;
 
-  adns__consistency(ads,0,cc_entex);
+  adns__consistency(ads,0,cc_enter);
 
   if (flags & ~(adns_queryflags)0x4009ffff)
     /* 0x40080000 are reserved for `harmless' future expansion
@@ -520,7 +520,7 @@ void adns__intdone_process(adns_state ads) {
 
 void adns__returning(adns_state ads, adns_query qu_for_caller) {
   adns__intdone_process(ads);
-  adns__consistency(ads,qu_for_caller,cc_entex);
+  adns__consistency(ads,qu_for_caller,cc_exit);
 }
 
 void adns__cancel(adns_query qu) {
@@ -558,7 +558,7 @@ void adns_cancel(adns_query qu) {
 
   assert(!qu->parent);
   ads= qu->ads;
-  adns__consistency(ads,qu,cc_entex);
+  adns__consistency(ads,qu,cc_enter);
   adns__cancel(qu);
   adns__returning(ads,0);
 }
index f1c7dfec3f9247f6625ee2a1a08d225492438e30..26338e8b392494d3a4a5acb9c6987e11d68e3ef6 100644 (file)
@@ -742,7 +742,7 @@ static int init_files(adns_state *ads_r, adns_initflags flags,
   r= init_finish(ads);
   if (r) return r;
 
-  adns__consistency(ads,0,cc_entex);
+  adns__consistency(ads,0,cc_exit);
   *ads_r= ads;
   return 0;
 }
@@ -768,7 +768,7 @@ static int init_strcfg(adns_state *ads_r, adns_initflags flags,
   }
 
   r= init_finish(ads);  if (r) return r;
-  adns__consistency(ads,0,cc_entex);
+  adns__consistency(ads,0,cc_exit);
   *ads_r= ads;
   return 0;
 }
@@ -794,7 +794,7 @@ int adns_init_logfn(adns_state *newstate_r, adns_initflags flags,
 
 void adns_finish(adns_state ads) {
   int i;
-  adns__consistency(ads,0,cc_entex);
+  adns__consistency(ads,0,cc_enter);
   for (;;) {
     if (ads->udpw.head) adns__cancel(ads->udpw.head);
     else if (ads->tcpw.head) adns__cancel(ads->tcpw.head);
@@ -812,7 +812,7 @@ void adns_finish(adns_state ads) {
 }
 
 void adns_forallqueries_begin(adns_state ads) {
-  adns__consistency(ads,0,cc_entex);
+  adns__consistency(ads,0,cc_enter);
   ads->forallnext=
     ads->udpw.head ? ads->udpw.head :
     ads->tcpw.head ? ads->tcpw.head :
@@ -823,7 +823,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,0,cc_entex);
+  adns__consistency(ads,0,cc_enter);
   nqu= ads->forallnext;
   for (;;) {
     qu= nqu;