1/*
2 * CDDL HEADER START
3 *
4 * This file and its contents are supplied under the terms of the
5 * Common Development and Distribution License ("CDDL"), version 1.0.
6 * You may only use this file in accordance with the terms of version
7 * 1.0 of the CDDL.
8 *
9 * A full copy of the text of the CDDL should have accompanied this
10 * source.  A copy of the CDDL is also available via the Internet at
11 * http://www.illumos.org/license/CDDL.
12 *
13 * CDDL HEADER END
14 */
15
16/*
17 * wmsum counters are a reduced version of aggsum counters, optimized for
18 * write-mostly scenarios.  They do not provide optimized read functions,
19 * but instead allow much cheaper add function.  The primary usage is
20 * infrequently read statistic counters, not requiring exact precision.
21 *
22 * The FreeBSD implementation is directly mapped into counter(9) KPI.
23 */
24
25#ifndef	_SYS_WMSUM_H
26#define	_SYS_WMSUM_H
27
28#include <sys/types.h>
29#include <sys/systm.h>
30#include <sys/counter.h>
31#include <sys/malloc.h>
32
33#ifdef	__cplusplus
34extern "C" {
35#endif
36
37#define	wmsum_t	counter_u64_t
38
39static inline void
40wmsum_init(wmsum_t *ws, uint64_t value)
41{
42
43	*ws = counter_u64_alloc(M_WAITOK);
44	counter_u64_add(*ws, value);
45}
46
47static inline void
48wmsum_fini(wmsum_t *ws)
49{
50
51	counter_u64_free(*ws);
52}
53
54static inline uint64_t
55wmsum_value(wmsum_t *ws)
56{
57
58	return (counter_u64_fetch(*ws));
59}
60
61static inline void
62wmsum_add(wmsum_t *ws, int64_t delta)
63{
64
65	counter_u64_add(*ws, delta);
66}
67
68#ifdef	__cplusplus
69}
70#endif
71
72#endif /* _SYS_WMSUM_H */
73