counter.h revision 1.1 1 1.1 christos #ifndef JEMALLOC_INTERNAL_COUNTER_H
2 1.1 christos #define JEMALLOC_INTERNAL_COUNTER_H
3 1.1 christos
4 1.1 christos #include "jemalloc/internal/mutex.h"
5 1.1 christos
6 1.1 christos typedef struct counter_accum_s {
7 1.1 christos LOCKEDINT_MTX_DECLARE(mtx)
8 1.1 christos locked_u64_t accumbytes;
9 1.1 christos uint64_t interval;
10 1.1 christos } counter_accum_t;
11 1.1 christos
12 1.1 christos JEMALLOC_ALWAYS_INLINE bool
13 1.1 christos counter_accum(tsdn_t *tsdn, counter_accum_t *counter, uint64_t bytes) {
14 1.1 christos uint64_t interval = counter->interval;
15 1.1 christos assert(interval > 0);
16 1.1 christos LOCKEDINT_MTX_LOCK(tsdn, counter->mtx);
17 1.1 christos /*
18 1.1 christos * If the event moves fast enough (and/or if the event handling is slow
19 1.1 christos * enough), extreme overflow can cause counter trigger coalescing.
20 1.1 christos * This is an intentional mechanism that avoids rate-limiting
21 1.1 christos * allocation.
22 1.1 christos */
23 1.1 christos bool overflow = locked_inc_mod_u64(tsdn, LOCKEDINT_MTX(counter->mtx),
24 1.1 christos &counter->accumbytes, bytes, interval);
25 1.1 christos LOCKEDINT_MTX_UNLOCK(tsdn, counter->mtx);
26 1.1 christos return overflow;
27 1.1 christos }
28 1.1 christos
29 1.1 christos bool counter_accum_init(counter_accum_t *counter, uint64_t interval);
30 1.1 christos void counter_prefork(tsdn_t *tsdn, counter_accum_t *counter);
31 1.1 christos void counter_postfork_parent(tsdn_t *tsdn, counter_accum_t *counter);
32 1.1 christos void counter_postfork_child(tsdn_t *tsdn, counter_accum_t *counter);
33 1.1 christos
34 1.1 christos #endif /* JEMALLOC_INTERNAL_COUNTER_H */
35