static void
validated(void *arg);
static void
-maybe_cancel_validators(fetchctx_t *fctx);
-static void
add_bad(fetchctx_t *fctx, dns_message_t *rmessage, dns_adbaddrinfo_t *addrinfo,
isc_result_t reason, badnstype_t badtype);
static isc_result_t
fctx_stoptimer(fctx);
/*
- * Cancel all pending validators. Note that this must be done
- * without the fctx lock held, since that could cause
- * deadlock.
+ * Cancel all pending validators.
*/
- maybe_cancel_validators(fctx);
+ dns_validator_t *validator = NULL;
+ for (validator = ISC_LIST_HEAD(fctx->validators); validator != NULL;
+ validator = ISC_LIST_NEXT(validator, link))
+ {
+ dns_validator_cancel(validator);
+ }
if (fctx->nsfetch != NULL) {
dns_resolver_cancelfetch(fctx->nsfetch);
#define CHASE(r) (((r)->attributes & DNS_RDATASETATTR_CHASE) != 0)
#define CHECKNAMES(r) (((r)->attributes & DNS_RDATASETATTR_CHECKNAMES) != 0)
-/*
- * Cancel validators associated with '*fctx' if it is ready to be
- * destroyed (i.e., no queries waiting for it and no pending ADB finds).
- * Caller must hold fctx bucket lock.
- *
- * Requires:
- * '*fctx' is shutting down.
- */
-static void
-maybe_cancel_validators(fetchctx_t *fctx) {
- if (atomic_load_acquire(&fctx->pending) != 0 ||
- atomic_load_acquire(&fctx->nqueries) != 0)
- {
- return;
- }
-
- REQUIRE(SHUTTINGDOWN(fctx));
- for (dns_validator_t *validator = ISC_LIST_HEAD(fctx->validators);
- validator != NULL; validator = ISC_LIST_NEXT(validator, link))
- {
- dns_validator_cancel(validator);
- }
-}
-
/*
* typemap with just RRSIG(46) and NSEC(47) bits set.
*
*/
dns_db_detachnode(fctx->cache, &node);
if (SHUTTINGDOWN(fctx)) {
- maybe_cancel_validators(fctx);
+ dns_validator_t *validator = NULL;
+ for (validator = ISC_LIST_HEAD(fctx->validators);
+ validator != NULL;
+ validator = ISC_LIST_NEXT(validator, link))
+ {
+ dns_validator_cancel(validator);
+ }
}
UNLOCK(&fctx->lock);
goto cleanup_fetchctx;