From: Aram Sargsyan Date: Thu, 15 Jan 2026 14:38:44 +0000 (+0000) Subject: Use standard reference counting for isc_histomulti X-Git-Tag: v9.21.20~24^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7f5608206e921c668cc83460fc1e53ef515107e1;p=thirdparty%2Fbind9.git Use standard reference counting for isc_histomulti Use reference counting for isc_histomulti module so that it's possible to attach/detach to/from the objects when used in the statistics channel in the coming commits. --- diff --git a/lib/isc/histo.c b/lib/isc/histo.c index aac7081db69..acfd3256c46 100644 --- a/lib/isc/histo.c +++ b/lib/isc/histo.c @@ -74,6 +74,7 @@ struct isc_histo { struct isc_histomulti { uint magic; uint size; + isc_refcount_t references; isc_histo_t *hg[]; }; @@ -386,22 +387,23 @@ isc_histomulti_create(isc_mem_t *mctx, uint sigbits, isc_histomulti_t **hmp) { isc_histo_create(mctx, sigbits, &hm->hg[i]); } + isc_refcount_init(&hm->references, 1); + *hmp = hm; } -void -isc_histomulti_destroy(isc_histomulti_t **hmp) { - REQUIRE(hmp != NULL); - REQUIRE(HISTOMULTI_VALID(*hmp)); +static void +isc__histomulti_destroy(isc_histomulti_t *hm) { + REQUIRE(HISTOMULTI_VALID(hm)); - isc_histomulti_t *hm = *hmp; isc_mem_t *mctx = hm->hg[0]->mctx; - *hmp = NULL; for (uint i = 0; i < hm->size; i++) { isc_histo_destroy(&hm->hg[i]); } + isc_refcount_destroy(&hm->references); + isc_mem_put(mctx, hm, STRUCT_FLEX_SIZE(hm, hg, hm->size)); } @@ -426,6 +428,12 @@ isc_histomulti_inc(isc_histomulti_t *hm, uint64_t value) { isc_histomulti_add(hm, value, 1); } +#ifdef ISC_HISTO_TRACE +ISC_REFCOUNT_TRACE_IMPL(isc_histomulti, isc__histomulti_destroy); +#else +ISC_REFCOUNT_IMPL(isc_histomulti, isc__histomulti_destroy); +#endif /* ISC_HISTO_TRACE */ + /**********************************************************************/ /* diff --git a/lib/isc/include/isc/histo.h b/lib/isc/include/isc/histo.h index 4c9123fbbc6..80c2b15faf9 100644 --- a/lib/isc/include/isc/histo.h +++ b/lib/isc/include/isc/histo.h @@ -278,20 +278,6 @@ isc_histomulti_create(isc_mem_t *mctx, uint sigbits, isc_histomulti_t **hmp); *\li `*hmp` is a pointer to a multithreaded sharded histogram. */ -void -isc_histomulti_destroy(isc_histomulti_t **hmp); -/*%< - * Destroy a multithreaded sharded histogram - * - * Requires: - *\li `hmp != NULL` - *\li `*hmp` is a pointer to a valid multithreaded sharded histogram - * - * Ensures: - *\li all memory allocated by the histogram has been released - *\li `*hmp == NULL` - */ - void isc_histomulti_merge(isc_histo_t **targetp, const isc_histomulti_t *source); /*%< @@ -326,6 +312,21 @@ isc_histomulti_add(isc_histomulti_t *hm, uint64_t value, uint64_t inc); *\li `hm` is a pointer to a valid histomulti */ +#ifdef ISC_HISTO_TRACE +#define isc_histomulti_ref(ptr) \ + dns_histomulti__ref(ptr, __func__, __FILE__, __LINE__) +#define isc_histomulti_unref(ptr) \ + isc_histomulti__unref(ptr, __func__, __FILE__, __LINE__) +#define isc_histomulti_attach(ptr, ptrp) \ + isc_histomulti__attach(ptr, ptrp, __func__, __FILE__, __LINE__) +#define isc_histomulti_detach(ptrp) \ + isc_histomulti__detach(ptrp, __func__, __FILE__, __LINE__) + +ISC_REFCOUNT_TRACE_DECL(isc_histomulti); +#else +ISC_REFCOUNT_DECL(isc_histomulti); +#endif /* ISC_HISTO_TRACE */ + /**********************************************************************/ void diff --git a/lib/ns/server.c b/lib/ns/server.c index e0843905d9f..857c6d0b6a0 100644 --- a/lib/ns/server.c +++ b/lib/ns/server.c @@ -176,29 +176,29 @@ ns_server_detach(ns_server_t **sctxp) { } if (sctx->udpinstats4 != NULL) { - isc_histomulti_destroy(&sctx->udpinstats4); + isc_histomulti_detach(&sctx->udpinstats4); } if (sctx->tcpinstats4 != NULL) { - isc_histomulti_destroy(&sctx->tcpinstats4); + isc_histomulti_detach(&sctx->tcpinstats4); } if (sctx->udpoutstats4 != NULL) { - isc_histomulti_destroy(&sctx->udpoutstats4); + isc_histomulti_detach(&sctx->udpoutstats4); } if (sctx->tcpoutstats4 != NULL) { - isc_histomulti_destroy(&sctx->tcpoutstats4); + isc_histomulti_detach(&sctx->tcpoutstats4); } if (sctx->udpinstats6 != NULL) { - isc_histomulti_destroy(&sctx->udpinstats6); + isc_histomulti_detach(&sctx->udpinstats6); } if (sctx->tcpinstats6 != NULL) { - isc_histomulti_destroy(&sctx->tcpinstats6); + isc_histomulti_detach(&sctx->tcpinstats6); } if (sctx->udpoutstats6 != NULL) { - isc_histomulti_destroy(&sctx->udpoutstats6); + isc_histomulti_detach(&sctx->udpoutstats6); } if (sctx->tcpoutstats6 != NULL) { - isc_histomulti_destroy(&sctx->tcpoutstats6); + isc_histomulti_detach(&sctx->tcpoutstats6); } sctx->magic = 0;