jcs's openbsd hax
openbsd
1/* Public domain. */
2
3#ifndef _LINUX_AVERAGE_H
4#define _LINUX_AVERAGE_H
5
6#include <sys/types.h>
7#include <lib/libkern/libkern.h>
8
9#define DECLARE_EWMA(name, precision, recip) \
10struct ewma_##name { \
11 u_long value; \
12}; \
13 \
14static inline void \
15ewma_##name##_init(struct ewma_##name *p) \
16{ \
17 p->value = 0; \
18} \
19 \
20static inline void \
21ewma_##name##_add(struct ewma_##name *p, u_long value) \
22{ \
23 u_long shift = fls(recip) - 1; \
24 \
25 if (p->value == 0) \
26 p->value = (value << (precision)); \
27 else \
28 p->value = ((((p->value << shift) - p->value) + \
29 (value << (precision))) >> shift); \
30} \
31 \
32static inline u_long \
33ewma_##name##_read(struct ewma_##name *p) \
34{ \
35 return (p->value >> (precision)); \
36}
37
38#endif