]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
interfacemgr: use isc_refcount_t for reference counting
authorWitold Kręcicki <wpk@isc.org>
Thu, 16 May 2019 16:43:06 +0000 (18:43 +0200)
committerWitold Kręcicki <wpk@isc.org>
Tue, 9 Jul 2019 14:09:36 +0000 (16:09 +0200)
lib/ns/include/ns/interfacemgr.h
lib/ns/interfacemgr.c

index 6bbb0e67f3455eb8cdfce151d23535ca2ce877f1..82d76f9e41d4939c90394073772fb0d86488311c 100644 (file)
@@ -68,7 +68,7 @@ struct ns_interface {
        unsigned int            magic;          /*%< Magic number. */
        ns_interfacemgr_t *     mgr;            /*%< Interface manager. */
        isc_mutex_t             lock;
-       int                     references;     /*%< Locked */
+       isc_refcount_t          references;
        unsigned int            generation;     /*%< Generation number. */
        isc_sockaddr_t          addr;           /*%< Address and port. */
        unsigned int            flags;          /*%< Interface characteristics */
index 2601fb800a00cc2273a49e37815c30060f25cbb5..abb6be279559af215d5c0c4b3d8aa62d273e20a5 100644 (file)
@@ -64,7 +64,7 @@
 /*% nameserver interface manager structure */
 struct ns_interfacemgr {
        unsigned int            magic;          /*%< Magic number. */
-       int                     references;
+       isc_refcount_t          references;
        isc_mutex_t             lock;
        isc_mem_t *             mctx;           /*%< Memory context. */
        ns_server_t *           sctx;           /*%< Server context. */
@@ -253,9 +253,9 @@ ns_interfacemgr_create(isc_mem_t *mctx,
        mgr->task = NULL;
        if (mgr->route != NULL)
                isc_task_attach(task, &mgr->task);
-       mgr->references = (mgr->route != NULL) ? 2 : 1;
+       isc_refcount_init(&mgr->references, (mgr->route != NULL) ? 2 : 1);
 #else
-       mgr->references = 1;
+       isc_refcount_init(&mgr->references, 1);
 #endif
        mgr->magic = IFMGR_MAGIC;
        *mgrp = mgr;
@@ -332,27 +332,18 @@ ns_interfacemgr_getaclenv(ns_interfacemgr_t *mgr) {
 void
 ns_interfacemgr_attach(ns_interfacemgr_t *source, ns_interfacemgr_t **target) {
        REQUIRE(NS_INTERFACEMGR_VALID(source));
-       LOCK(&source->lock);
-       INSIST(source->references > 0);
-       source->references++;
-       UNLOCK(&source->lock);
+       INSIST(isc_refcount_increment(&source->references) > 0);
        *target = source;
 }
 
 void
 ns_interfacemgr_detach(ns_interfacemgr_t **targetp) {
-       isc_result_t need_destroy = false;
        ns_interfacemgr_t *target = *targetp;
        REQUIRE(target != NULL);
        REQUIRE(NS_INTERFACEMGR_VALID(target));
-       LOCK(&target->lock);
-       REQUIRE(target->references > 0);
-       target->references--;
-       if (target->references == 0)
-               need_destroy = true;
-       UNLOCK(&target->lock);
-       if (need_destroy)
+       if (isc_refcount_decrement(&target->references) == 1) {
                ns_interfacemgr_destroy(target);
+       }
        *targetp = NULL;
 }
 
@@ -435,7 +426,7 @@ ns_interface_create(ns_interfacemgr_t *mgr, isc_sockaddr_t *addr,
        ns_interfacemgr_attach(mgr, &ifp->mgr);
        ISC_LIST_APPEND(mgr->interfaces, ifp, link);
 
-       ifp->references = 1;
+       isc_refcount_init(&ifp->references, 1);
        ifp->magic = IFACE_MAGIC;
        *ifpret = ifp;
 
@@ -667,27 +658,18 @@ ns_interface_destroy(ns_interface_t *ifp) {
 void
 ns_interface_attach(ns_interface_t *source, ns_interface_t **target) {
        REQUIRE(NS_INTERFACE_VALID(source));
-       LOCK(&source->lock);
-       INSIST(source->references > 0);
-       source->references++;
-       UNLOCK(&source->lock);
+       isc_refcount_increment(&source->references);
        *target = source;
 }
 
 void
 ns_interface_detach(ns_interface_t **targetp) {
-       isc_result_t need_destroy = false;
        ns_interface_t *target = *targetp;
        REQUIRE(target != NULL);
        REQUIRE(NS_INTERFACE_VALID(target));
-       LOCK(&target->lock);
-       REQUIRE(target->references > 0);
-       target->references--;
-       if (target->references == 0)
-               need_destroy = true;
-       UNLOCK(&target->lock);
-       if (need_destroy)
+       if (isc_refcount_decrement(&target->references) == 1) {
                ns_interface_destroy(target);
+       }
        *targetp = NULL;
 }