diff --git a/lib/dns/adb.c b/lib/dns/adb.c index a8214c9d39..f1da638e5f 100644 --- a/lib/dns/adb.c +++ b/lib/dns/adb.c @@ -937,7 +937,7 @@ clean_finds_at_name(dns_adbname_t *name, dns_adbstatus_t astat, INSIST(!FIND_EVENTSENT(find)); - find->status = astat; + atomic_store(&find->status, astat); DP(DEF_LEVEL, "cfan: sending find %p to caller", find); @@ -2225,7 +2225,7 @@ post_copy: if (want_event) { INSIST((find->flags & DNS_ADBFIND_ADDRESSMASK) != 0); find->loop = loop; - find->status = DNS_ADB_UNSET; + atomic_store(&find->status, DNS_ADB_UNSET); find->cb = cb; find->cbarg = cbarg; } @@ -2279,7 +2279,7 @@ dns_adb_destroyfind(dns_adbfind_t **findp) { static void find_sendevent(dns_adbfind_t *find) { if (!FIND_EVENTSENT(find)) { - find->status = DNS_ADB_CANCELED; + atomic_store(&find->status, DNS_ADB_CANCELED); DP(DEF_LEVEL, "sending find %p to caller", find); @@ -2324,6 +2324,13 @@ dns_adb_cancelfind(dns_adbfind_t *find) { } } +unsigned int +dns_adb_findstatus(dns_adbfind_t *find) { + REQUIRE(DNS_ADBFIND_VALID(find)); + + return (atomic_load(&find->status)); +} + void dns_adb_dump(dns_adb_t *adb, FILE *f) { isc_stdtime_t now = isc_stdtime_now(); diff --git a/lib/dns/include/dns/adb.h b/lib/dns/include/dns/adb.h index 65acb09ccf..91f7039b73 100644 --- a/lib/dns/include/dns/adb.h +++ b/lib/dns/include/dns/adb.h @@ -121,15 +121,15 @@ struct dns_adbfind { ISC_LINK(dns_adbfind_t) publink; /*%< RW: client use */ /* Private */ - isc_mutex_t lock; /* locks all below */ - in_port_t port; - unsigned int flags; - dns_adbname_t *adbname; - dns_adb_t *adb; - isc_loop_t *loop; - dns_adbstatus_t status; - isc_job_cb cb; - void *cbarg; + isc_mutex_t lock; /* locks all below */ + in_port_t port; + unsigned int flags; + dns_adbname_t *adbname; + dns_adb_t *adb; + isc_loop_t *loop; + _Atomic(dns_adbstatus_t) status; + isc_job_cb cb; + void *cbarg; ISC_LINK(dns_adbfind_t) plink; }; @@ -387,6 +387,16 @@ dns_adbfind_done(dns_adbfind_t find); *\li 'find' != NULL and *find be valid dns_adbfind_t pointer. */ +unsigned int +dns_adb_findstatus(dns_adbfind_t *); +/*%< + * Returns the status field of the find. + * + * Requires: + * + *\li 'find' be a valid dns_adbfind_t pointer. + */ + void dns_adb_destroyfind(dns_adbfind_t **find); /*%< diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index b557b5ac60..9957663c2d 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -2910,7 +2910,7 @@ fctx_finddone(void *arg) { * The fetch is waiting for a name to be found. */ INSIST(!SHUTTINGDOWN(fctx)); - if (find->status == DNS_ADB_MOREADDRESSES) { + if (dns_adb_findstatus(find) == DNS_ADB_MOREADDRESSES) { FCTX_ATTR_CLR(fctx, FCTX_ATTR_ADDRWAIT); want_try = true; } else {