]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
make header->count atomic
authorMark Andrews <marka@isc.org>
Tue, 19 Nov 2019 05:53:36 +0000 (16:53 +1100)
committerMark Andrews <marka@isc.org>
Tue, 19 Nov 2019 06:29:20 +0000 (17:29 +1100)
lib/dns/rbtdb.c

index 26d0f1a41ec62faf7a97fd9f51593062838a4f16..9ac0cb8d1a49ef1feffe7d8936651b339d875fc2 100644 (file)
@@ -16,6 +16,7 @@
 #include <inttypes.h>
 #include <stdbool.h>
 
+#include <isc/atomic.h>
 #include <isc/crc64.h>
 #include <isc/event.h>
 #include <isc/heap.h>
@@ -221,13 +222,11 @@ typedef struct rdatasetheader {
         * this rdataset.
         */
 
-       uint32_t                    count;
+       atomic_uint_fast32_t            count;
        /*%<
         * Monotonously increased every time this rdataset is bound so that
         * it is used as the base of the starting point in DNS responses
-        * when the "cyclic" rrset-order is required.  Since the ordering
-        * should not be so crucial, no lock is set for the counter for
-        * performance reasons.
+        * when the "cyclic" rrset-order is required.
         */
 
        dns_rbtnode_t                   *node;
@@ -2984,7 +2983,7 @@ bind_rdataset(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
        rdataset->private2 = node;
        raw = (unsigned char *)header + sizeof(*header);
        rdataset->private3 = raw;
-       rdataset->count = header->count++;
+       rdataset->count = atomic_fetch_add_relaxed(&header->count, 1);
        if (rdataset->count == UINT32_MAX)
                rdataset->count = 0;
 
@@ -6469,7 +6468,8 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
                newheader->attributes |= RDATASET_ATTR_ZEROTTL;
        newheader->noqname = NULL;
        newheader->closest = NULL;
-       newheader->count = atomic_fetch_add(&init_count, 1);
+       atomic_init(&newheader->count,
+                   atomic_fetch_add_relaxed(&init_count, 1));
        newheader->trust = rdataset->trust;
        newheader->last_used = now;
        newheader->node = rbtnode;
@@ -6656,7 +6656,8 @@ subtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
        newheader->trust = 0;
        newheader->noqname = NULL;
        newheader->closest = NULL;
-       newheader->count = atomic_fetch_add(&init_count, 1);
+       atomic_init(&newheader->count,
+                   atomic_fetch_add_relaxed(&init_count, 1));
        newheader->last_used = 0;
        newheader->node = rbtnode;
        if ((rdataset->attributes & DNS_RDATASETATTR_RESIGN) != 0) {
@@ -6763,7 +6764,7 @@ subtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
                        newheader->serial = rbtversion->serial;
                        newheader->noqname = NULL;
                        newheader->closest = NULL;
-                       newheader->count = 0;
+                       atomic_init(&newheader->count, 0);
                        newheader->node = rbtnode;
                        newheader->resign = 0;
                        newheader->resign_lsb = 0;
@@ -6854,7 +6855,7 @@ deleterdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
                newheader->serial = rbtversion->serial;
        else
                newheader->serial = 0;
-       newheader->count = 0;
+       atomic_init(&newheader->count, 0);
        newheader->last_used = 0;
        newheader->node = rbtnode;
 
@@ -7040,7 +7041,8 @@ loading_addrdataset(void *arg, const dns_name_t *name,
        newheader->serial = 1;
        newheader->noqname = NULL;
        newheader->closest = NULL;
-       newheader->count = atomic_fetch_add(&init_count, 1);
+       atomic_init(&newheader->count,
+                   atomic_fetch_add_relaxed(&init_count, 1));
        newheader->last_used = 0;
        newheader->node = node;
        setownercase(newheader, name);