]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Use reference counts instead of ISC_LIST_EMPTY to determine when to destroy ecdb.
authorMark Andrews <marka@isc.org>
Mon, 26 Aug 2019 01:22:04 +0000 (11:22 +1000)
committerMark Andrews <marka@isc.org>
Fri, 13 Sep 2019 02:43:52 +0000 (12:43 +1000)
lib/dns/ecdb.c

index 3c1ddec1d00fb990e33a6aa055e4067199f5e434..1f4b3adc95d4599569e92948c97672b428e0e384 100644 (file)
@@ -167,44 +167,36 @@ attach(dns_db_t *source, dns_db_t **targetp) {
 }
 
 static void
-destroy_ecdb(dns_ecdb_t **ecdbp) {
-       dns_ecdb_t *ecdb = *ecdbp;
-       isc_mem_t *mctx = ecdb->common.mctx;
+destroy_ecdb(dns_ecdb_t *ecdb) {
+       if (isc_refcount_decrement(&ecdb->references) == 1) {
+               isc_refcount_destroy(&ecdb->references);
 
-       if (dns_name_dynamic(&ecdb->common.origin))
-               dns_name_free(&ecdb->common.origin, mctx);
+               INSIST(ISC_LIST_EMPTY(ecdb->nodes));
 
-       isc_mutex_destroy(&ecdb->lock);
-       isc_refcount_destroy(&ecdb->references);
+               if (dns_name_dynamic(&ecdb->common.origin)) {
+                       dns_name_free(&ecdb->common.origin, ecdb->common.mctx);
+               }
 
-       ecdb->common.impmagic = 0;
-       ecdb->common.magic = 0;
+               isc_mutex_destroy(&ecdb->lock);
 
-       isc_mem_putanddetach(&mctx, ecdb, sizeof(*ecdb));
+               ecdb->common.impmagic = 0;
+               ecdb->common.magic = 0;
 
-       *ecdbp = NULL;
+               isc_mem_putanddetach(&ecdb->common.mctx, ecdb, sizeof(*ecdb));
+       }
 }
 
 static void
 detach(dns_db_t **dbp) {
        dns_ecdb_t *ecdb;
-       bool need_destroy = false;
 
        REQUIRE(dbp != NULL);
        ecdb = (dns_ecdb_t *)*dbp;
        REQUIRE(VALID_ECDB(ecdb));
 
-       LOCK(&ecdb->lock);
-       if (isc_refcount_decrement(&ecdb->references) == 1 &&
-           ISC_LIST_EMPTY(ecdb->nodes)) {
-               need_destroy = true;
-       }
-       UNLOCK(&ecdb->lock);
-
-       if (need_destroy)
-               destroy_ecdb(&ecdb);
-
        *dbp = NULL;
+
+       destroy_ecdb(ecdb);
 }
 
 static void
@@ -216,6 +208,7 @@ attachnode(dns_db_t *db, dns_dbnode_t *source, dns_dbnode_t **targetp) {
        REQUIRE(VALID_ECDBNODE(node));
        REQUIRE(targetp != NULL && *targetp == NULL);
 
+       isc_refcount_increment(&node->references);
        isc_refcount_increment(&node->references);
 
        *targetp = node;
@@ -225,17 +218,12 @@ static void
 destroynode(dns_ecdbnode_t *node) {
        isc_mem_t *mctx;
        dns_ecdb_t *ecdb = node->ecdb;
-       bool need_destroydb = false;
        rdatasetheader_t *header;
 
        mctx = ecdb->common.mctx;
 
        LOCK(&ecdb->lock);
        ISC_LIST_UNLINK(ecdb->nodes, node, link);
-       if (isc_refcount_current(&ecdb->references) == 0 &&
-           ISC_LIST_EMPTY(ecdb->nodes)) {
-               need_destroydb = true;
-       }
        UNLOCK(&ecdb->lock);
 
        dns_name_free(&node->name, mctx);
@@ -244,9 +232,8 @@ destroynode(dns_ecdbnode_t *node) {
                unsigned int headersize;
 
                ISC_LIST_UNLINK(node->rdatasets, header, link);
-               headersize =
-                       dns_rdataslab_size((unsigned char *)header,
-                                          sizeof(*header));
+               headersize = dns_rdataslab_size((unsigned char *)header,
+                                               sizeof(*header));
                isc_mem_put(mctx, header, headersize);
        }
 
@@ -256,8 +243,7 @@ destroynode(dns_ecdbnode_t *node) {
        node->magic = 0;
        isc_mem_put(mctx, node, sizeof(*node));
 
-       if (need_destroydb)
-               destroy_ecdb(&ecdb);
+       destroy_ecdb(ecdb);
 }
 
 static void
@@ -353,12 +339,15 @@ findnode(dns_db_t *db, const dns_name_t *name, bool create,
                isc_mem_put(mctx, node, sizeof(*node));
                return (result);
        }
-       node->ecdb= ecdb;
+
        isc_refcount_init(&node->references, 1);
        ISC_LIST_INIT(node->rdatasets);
 
        ISC_LINK_INIT(node, link);
 
+       isc_refcount_increment(&ecdb->references);
+       node->ecdb = ecdb;
+
        LOCK(&ecdb->lock);
        ISC_LIST_APPEND(ecdb->nodes, node, link);
        UNLOCK(&ecdb->lock);