]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Use atomics to access find->status
authorMark Andrews <marka@isc.org>
Tue, 16 Jul 2024 03:36:54 +0000 (13:36 +1000)
committerMark Andrews <marka@isc.org>
Wed, 28 Aug 2024 22:42:16 +0000 (22:42 +0000)
lib/dns/adb.c
lib/dns/include/dns/adb.h

index a81ebddc1b3e747b6ab284784f182a34d0225a4c..ef92322afa88c3fac98dbb7c8e8e9b6bc7e12258 100644 (file)
@@ -935,7 +935,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);
 
@@ -2222,7 +2222,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;
        }
@@ -2276,7 +2276,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);
 
@@ -2323,14 +2323,9 @@ dns_adb_cancelfind(dns_adbfind_t *find) {
 
 unsigned int
 dns_adb_findstatus(dns_adbfind_t *find) {
-       unsigned int status;
        REQUIRE(DNS_ADBFIND_VALID(find));
 
-       UNLOCK(&find->lock);
-       status = find->status;
-       UNLOCK(&find->lock);
-
-       return (status);
+       return (atomic_load(&find->status));
 }
 
 void
index 9b40ab8f266344e4262e90d64a8e34205aa48dca..91f7039b73e822928776d88fddeab957a5656fad 100644 (file)
@@ -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;
 };