209f2926b8
This removes the tsd macros (which are used only for tsd_t in real builds). We break up the circular dependencies involving tsd. We also move all tsd access through getters and setters. This allows us to assert that we only touch data when tsd is in a valid state. We simplify the usages of the x macro trick, removing all the customizability (get/set, init, cleanup), moving the lifetime logic to tsd_init and tsd_cleanup. This lets us make initialization order independent of order within tsd_t.
51 lines
1.1 KiB
C
51 lines
1.1 KiB
C
#ifndef JEMALLOC_INTERNAL_TICKER_H
|
|
#define JEMALLOC_INTERNAL_TICKER_H
|
|
|
|
#include "jemalloc/internal/util.h"
|
|
|
|
/**
|
|
* A ticker makes it easy to count-down events until some limit. You
|
|
* ticker_init the ticker to trigger every nticks events. You then notify it
|
|
* that an event has occurred with calls to ticker_tick (or that nticks events
|
|
* have occurred with a call to ticker_ticks), which will return true (and reset
|
|
* the counter) if the countdown hit zero.
|
|
*/
|
|
|
|
typedef struct {
|
|
int32_t tick;
|
|
int32_t nticks;
|
|
} ticker_t;
|
|
|
|
static inline void
|
|
ticker_init(ticker_t *ticker, int32_t nticks) {
|
|
ticker->tick = nticks;
|
|
ticker->nticks = nticks;
|
|
}
|
|
|
|
static inline void
|
|
ticker_copy(ticker_t *ticker, const ticker_t *other) {
|
|
*ticker = *other;
|
|
}
|
|
|
|
static inline int32_t
|
|
ticker_read(const ticker_t *ticker) {
|
|
return ticker->tick;
|
|
}
|
|
|
|
static inline bool
|
|
ticker_ticks(ticker_t *ticker, int32_t nticks) {
|
|
if (unlikely(ticker->tick < nticks)) {
|
|
ticker->tick = ticker->nticks;
|
|
return true;
|
|
}
|
|
ticker->tick -= nticks;
|
|
return(false);
|
|
}
|
|
|
|
static inline bool
|
|
ticker_tick(ticker_t *ticker) {
|
|
return ticker_ticks(ticker, 1);
|
|
}
|
|
|
|
#endif /* JEMALLOC_INTERNAL_TICKER_H */
|