]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Use standard reference counting for isc_histomulti
authorAram Sargsyan <aram@isc.org>
Thu, 15 Jan 2026 14:38:44 +0000 (14:38 +0000)
committerArаm Sаrgsyаn <aram@isc.org>
Thu, 26 Feb 2026 14:00:10 +0000 (14:00 +0000)
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.

lib/isc/histo.c
lib/isc/include/isc/histo.h
lib/ns/server.c

index aac7081db6979848d7f7dad642545360405d9ae2..acfd3256c46c6f6b52239ff9e561e254ef42ef12 100644 (file)
@@ -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 */
+
 /**********************************************************************/
 
 /*
index 4c9123fbbc669dfc7d0968af1ed4a21e6d4e5cba..80c2b15faf9e29b9e01e6b1d0b51dfd12994a0d9 100644 (file)
@@ -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
index e0843905d9f3c14cc3bd846838d17d133d683f0a..857c6d0b6a0f9509b3d8c9d83adc117e91097140 100644 (file)
@@ -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;