From 28de64428cfdb63ad07acfcfc254907b608d5137 Mon Sep 17 00:00:00 2001 From: ian Date: Sat, 25 Sep 1999 16:13:03 +0000 Subject: [PATCH] Also check specific query where applicable. --- src/adns.h | 4 +++- src/check.c | 38 ++++++++++++++++++++++++++++++++++++-- src/event.c | 44 ++++++++++++++++++++++---------------------- src/internal.h | 2 +- src/poll.c | 8 ++++---- src/query.c | 12 ++++++------ src/setup.c | 10 +++++----- 7 files changed, 77 insertions(+), 41 deletions(-) diff --git a/src/adns.h b/src/adns.h index c440222..96eb0a5 100644 --- a/src/adns.h +++ b/src/adns.h @@ -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. */ /* diff --git a/src/check.c b/src/check.c index 80c5ac3..84fe168 100644 --- a/src/check.c +++ b/src/check.c @@ -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"); + } + } } diff --git a/src/event.c b/src/event.c index f84204d..7702fe1 100644 --- a/src/event.c +++ b/src/event.c @@ -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; } diff --git a/src/internal.h b/src/internal.h index 6dbbff0..12ecd6f 100644 --- a/src/internal.h +++ b/src/internal.h @@ -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: */ diff --git a/src/poll.c b/src/poll.c index 6183e46..7b1054a 100644 --- a/src/poll.c +++ b/src/poll.c @@ -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 diff --git a/src/query.c b/src/query.c index d1d0b31..172ff06 100644 --- a/src/query.c +++ b/src/query.c @@ -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) { diff --git a/src/setup.c b/src/setup.c index e29c2cf..6ef2d12 100644 --- a/src/setup.c +++ b/src/setup.c @@ -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; -- 2.30.2