#include <isc/magic.h>
#include <isc/mem.h>
+#include <isc/refcount.h>
#include <isc/stats.h>
#include <isc/util.h>
#define NS_STATS_VALID(x) ISC_MAGIC_VALID(x, NS_STATS_MAGIC)
struct ns_stats {
- /*% Unlocked */
unsigned int magic;
isc_mem_t *mctx;
- isc_mutex_t lock;
isc_stats_t *counters;
-
- /*% Locked by lock */
- unsigned int references;
+ isc_refcount_t references;
};
void
REQUIRE(NS_STATS_VALID(stats));
REQUIRE(statsp != NULL && *statsp == NULL);
- LOCK(&stats->lock);
- stats->references++;
- UNLOCK(&stats->lock);
+ isc_refcount_increment(&stats->references);
*statsp = stats;
}
stats = *statsp;
*statsp = NULL;
- LOCK(&stats->lock);
- stats->references--;
- UNLOCK(&stats->lock);
-
- if (stats->references == 0) {
+ if (isc_refcount_decrement(&stats->references) == 1) {
isc_stats_detach(&stats->counters);
- isc_mutex_destroy(&stats->lock);
isc_mem_putanddetach(&stats->mctx, stats, sizeof(*stats));
}
}
return (ISC_R_NOMEMORY);
stats->counters = NULL;
- stats->references = 1;
-
- isc_mutex_init(&stats->lock);
+ atomic_init(&stats->references, 1);
result = isc_stats_create(mctx, &stats->counters, ncounters);
if (result != ISC_R_SUCCESS)
return (ISC_R_SUCCESS);
clean_mutex:
- isc_mutex_destroy(&stats->lock);
isc_mem_put(mctx, stats, sizeof(*stats));
return (result);