]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
isc/timer: use isc_refcount_t
authorWitold Kręcicki <wpk@isc.org>
Thu, 16 May 2019 16:53:33 +0000 (18:53 +0200)
committerWitold Kręcicki <wpk@isc.org>
Tue, 9 Jul 2019 14:09:36 +0000 (16:09 +0200)
lib/isc/timer.c

index 729fcb56086696cb19b438f9d2e88f821402666b..b5455688f28e4c7fe7ba1cbb05bfa5264a69c739 100644 (file)
@@ -23,6 +23,7 @@
 #include <isc/once.h>
 #include <isc/platform.h>
 #include <isc/print.h>
+#include <isc/refcount.h>
 #include <isc/task.h>
 #include <isc/thread.h>
 #include <isc/time.h>
@@ -61,8 +62,8 @@ struct isc__timer {
        isc_timer_t                     common;
        isc__timermgr_t *               manager;
        isc_mutex_t                     lock;
+       isc_refcount_t                  references;
        /*! Locked by timer lock. */
-       unsigned int                    references;
        isc_time_t                      idle;
        /*! Locked by manager lock. */
        isc_timertype_t                 type;
@@ -284,7 +285,7 @@ isc_timer_create(isc_timermgr_t *manager0, isc_timertype_t type,
                return (ISC_R_NOMEMORY);
 
        timer->manager = manager;
-       timer->references = 1;
+       isc_refcount_init(&timer->references, 1);
 
        if (type == isc_timertype_once && !isc_interval_iszero(interval)) {
                result = isc_time_add(&now, interval, &timer->idle);
@@ -479,10 +480,7 @@ isc_timer_attach(isc_timer_t *timer0, isc_timer_t **timerp) {
 
        REQUIRE(VALID_TIMER(timer));
        REQUIRE(timerp != NULL && *timerp == NULL);
-
-       LOCK(&timer->lock);
-       timer->references++;
-       UNLOCK(&timer->lock);
+       isc_refcount_increment(&timer->references);
 
        *timerp = (isc_timer_t *)timer;
 }
@@ -490,7 +488,6 @@ isc_timer_attach(isc_timer_t *timer0, isc_timer_t **timerp) {
 void
 isc_timer_detach(isc_timer_t **timerp) {
        isc__timer_t *timer;
-       bool free_timer = false;
 
        /*
         * Detach *timerp from its timer.
@@ -500,15 +497,9 @@ isc_timer_detach(isc_timer_t **timerp) {
        timer = (isc__timer_t *)*timerp;
        REQUIRE(VALID_TIMER(timer));
 
-       LOCK(&timer->lock);
-       REQUIRE(timer->references > 0);
-       timer->references--;
-       if (timer->references == 0)
-               free_timer = true;
-       UNLOCK(&timer->lock);
-
-       if (free_timer)
+       if (isc_refcount_decrement(&timer->references) == 1) {
                destroy(timer);
+       }
 
        *timerp = NULL;
 }