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