struct isc_histomulti {
uint magic;
uint size;
+ isc_refcount_t references;
isc_histo_t *hg[];
};
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));
}
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 */
+
/**********************************************************************/
/*
*\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);
/*%<
*\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
}
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;