#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>
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;
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);
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;
}
void
isc_timer_detach(isc_timer_t **timerp) {
isc__timer_t *timer;
- bool free_timer = false;
/*
* Detach *timerp from its timer.
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;
}