jcs's openbsd hax
openbsd
at jcs 38 lines 850 B view raw
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