From: Ian Jackson Date: Sat, 10 Dec 2016 22:27:08 +0000 (+0000) Subject: Consistency checks: Distinguish "entry" from exit X-Git-Tag: adns-1.5.2~5 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=adns.git;a=commitdiff_plain;h=df072b499795ce3bdfc65fab6675a3d68d84e7f2 Consistency checks: Distinguish "entry" from exit 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 --- diff --git a/src/check.c b/src/check.c index c773508..f6af1c7 100644 --- a/src/check.c +++ b/src/check.c @@ -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; diff --git a/src/event.c b/src/event.c index 81766c5..9034260 100644 --- a/src/event.c +++ b/src/event.c @@ -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); diff --git a/src/internal.h b/src/internal.h index 45d8ab1..1741bf1 100644 --- a/src/internal.h +++ b/src/internal.h @@ -95,7 +95,8 @@ typedef unsigned char byte; typedef enum { cc_user, - cc_entex, + cc_enter, + cc_exit, cc_freq } consistency_checks; diff --git a/src/poll.c b/src/poll.c index 917a524..35a4282 100644 --- a/src/poll.c +++ b/src/poll.c @@ -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); diff --git a/src/query.c b/src/query.c index 438b4fd..4d6ef8d 100644 --- a/src/query.c +++ b/src/query.c @@ -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); } diff --git a/src/setup.c b/src/setup.c index f1c7dfe..26338e8 100644 --- a/src/setup.c +++ b/src/setup.c @@ -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;