1 /* $NetBSD: stats.c,v 1.7 2022/09/23 12:15:36 christos Exp $ */ 2 3 /* 4 * Copyright (C) Internet Systems Consortium, Inc. ("ISC") 5 * 6 * SPDX-License-Identifier: MPL-2.0 7 * 8 * This Source Code Form is subject to the terms of the Mozilla Public 9 * License, v. 2.0. If a copy of the MPL was not distributed with this 10 * file, you can obtain one at https://mozilla.org/MPL/2.0/. 11 * 12 * See the COPYRIGHT file distributed with this work for additional 13 * information regarding copyright ownership. 14 */ 15 16 /*! \file */ 17 18 #include <isc/magic.h> 19 #include <isc/mem.h> 20 #include <isc/refcount.h> 21 #include <isc/stats.h> 22 #include <isc/util.h> 23 24 #include <ns/stats.h> 25 26 #define NS_STATS_MAGIC ISC_MAGIC('N', 's', 't', 't') 27 #define NS_STATS_VALID(x) ISC_MAGIC_VALID(x, NS_STATS_MAGIC) 28 29 struct ns_stats { 30 /*% Unlocked */ 31 unsigned int magic; 32 isc_mem_t *mctx; 33 isc_stats_t *counters; 34 isc_refcount_t references; 35 }; 36 37 void 38 ns_stats_attach(ns_stats_t *stats, ns_stats_t **statsp) { 39 REQUIRE(NS_STATS_VALID(stats)); 40 REQUIRE(statsp != NULL && *statsp == NULL); 41 42 isc_refcount_increment(&stats->references); 43 44 *statsp = stats; 45 } 46 47 void 48 ns_stats_detach(ns_stats_t **statsp) { 49 ns_stats_t *stats; 50 51 REQUIRE(statsp != NULL && NS_STATS_VALID(*statsp)); 52 53 stats = *statsp; 54 *statsp = NULL; 55 56 if (isc_refcount_decrement(&stats->references) == 1) { 57 isc_stats_detach(&stats->counters); 58 isc_refcount_destroy(&stats->references); 59 isc_mem_putanddetach(&stats->mctx, stats, sizeof(*stats)); 60 } 61 } 62 63 isc_result_t 64 ns_stats_create(isc_mem_t *mctx, int ncounters, ns_stats_t **statsp) { 65 ns_stats_t *stats; 66 isc_result_t result; 67 68 REQUIRE(statsp != NULL && *statsp == NULL); 69 70 stats = isc_mem_get(mctx, sizeof(*stats)); 71 stats->counters = NULL; 72 73 isc_refcount_init(&stats->references, 1); 74 75 result = isc_stats_create(mctx, &stats->counters, ncounters); 76 if (result != ISC_R_SUCCESS) { 77 goto clean_mem; 78 } 79 80 stats->magic = NS_STATS_MAGIC; 81 stats->mctx = NULL; 82 isc_mem_attach(mctx, &stats->mctx); 83 *statsp = stats; 84 85 return (ISC_R_SUCCESS); 86 87 clean_mem: 88 isc_mem_put(mctx, stats, sizeof(*stats)); 89 90 return (result); 91 } 92 93 /*% 94 * Increment/Decrement methods 95 */ 96 void 97 ns_stats_increment(ns_stats_t *stats, isc_statscounter_t counter) { 98 REQUIRE(NS_STATS_VALID(stats)); 99 100 isc_stats_increment(stats->counters, counter); 101 } 102 103 void 104 ns_stats_decrement(ns_stats_t *stats, isc_statscounter_t counter) { 105 REQUIRE(NS_STATS_VALID(stats)); 106 107 isc_stats_decrement(stats->counters, counter); 108 } 109 110 isc_stats_t * 111 ns_stats_get(ns_stats_t *stats) { 112 REQUIRE(NS_STATS_VALID(stats)); 113 114 return (stats->counters); 115 } 116 117 void 118 ns_stats_update_if_greater(ns_stats_t *stats, isc_statscounter_t counter, 119 isc_statscounter_t value) { 120 REQUIRE(NS_STATS_VALID(stats)); 121 122 isc_stats_update_if_greater(stats->counters, counter, value); 123 } 124 125 isc_statscounter_t 126 ns_stats_get_counter(ns_stats_t *stats, isc_statscounter_t counter) { 127 REQUIRE(NS_STATS_VALID(stats)); 128 129 return (isc_stats_get_counter(stats->counters, counter)); 130 } 131