1*c43cad87SWarner Losh #include "jemalloc/internal/jemalloc_preamble.h" 2*c43cad87SWarner Losh #include "jemalloc/internal/jemalloc_internal_includes.h" 3*c43cad87SWarner Losh 4*c43cad87SWarner Losh #include "jemalloc/internal/peak_event.h" 5*c43cad87SWarner Losh 6*c43cad87SWarner Losh #include "jemalloc/internal/activity_callback.h" 7*c43cad87SWarner Losh #include "jemalloc/internal/peak.h" 8*c43cad87SWarner Losh 9*c43cad87SWarner Losh /* 10*c43cad87SWarner Losh * Update every 64K by default. We're not exposing this as a configuration 11*c43cad87SWarner Losh * option for now; we don't want to bind ourselves too tightly to any particular 12*c43cad87SWarner Losh * performance requirements for small values, or guarantee that we'll even be 13*c43cad87SWarner Losh * able to provide fine-grained accuracy. 14*c43cad87SWarner Losh */ 15*c43cad87SWarner Losh #define PEAK_EVENT_WAIT (64 * 1024) 16*c43cad87SWarner Losh 17*c43cad87SWarner Losh /* Update the peak with current tsd state. */ 18*c43cad87SWarner Losh void 19*c43cad87SWarner Losh peak_event_update(tsd_t *tsd) { 20*c43cad87SWarner Losh uint64_t alloc = tsd_thread_allocated_get(tsd); 21*c43cad87SWarner Losh uint64_t dalloc = tsd_thread_deallocated_get(tsd); 22*c43cad87SWarner Losh peak_t *peak = tsd_peakp_get(tsd); 23*c43cad87SWarner Losh peak_update(peak, alloc, dalloc); 24*c43cad87SWarner Losh } 25*c43cad87SWarner Losh 26*c43cad87SWarner Losh static void 27*c43cad87SWarner Losh peak_event_activity_callback(tsd_t *tsd) { 28*c43cad87SWarner Losh activity_callback_thunk_t *thunk = tsd_activity_callback_thunkp_get( 29*c43cad87SWarner Losh tsd); 30*c43cad87SWarner Losh uint64_t alloc = tsd_thread_allocated_get(tsd); 31*c43cad87SWarner Losh uint64_t dalloc = tsd_thread_deallocated_get(tsd); 32*c43cad87SWarner Losh if (thunk->callback != NULL) { 33*c43cad87SWarner Losh thunk->callback(thunk->uctx, alloc, dalloc); 34*c43cad87SWarner Losh } 35*c43cad87SWarner Losh } 36*c43cad87SWarner Losh 37*c43cad87SWarner Losh /* Set current state to zero. */ 38*c43cad87SWarner Losh void 39*c43cad87SWarner Losh peak_event_zero(tsd_t *tsd) { 40*c43cad87SWarner Losh uint64_t alloc = tsd_thread_allocated_get(tsd); 41*c43cad87SWarner Losh uint64_t dalloc = tsd_thread_deallocated_get(tsd); 42*c43cad87SWarner Losh peak_t *peak = tsd_peakp_get(tsd); 43*c43cad87SWarner Losh peak_set_zero(peak, alloc, dalloc); 44*c43cad87SWarner Losh } 45*c43cad87SWarner Losh 46*c43cad87SWarner Losh uint64_t 47*c43cad87SWarner Losh peak_event_max(tsd_t *tsd) { 48*c43cad87SWarner Losh peak_t *peak = tsd_peakp_get(tsd); 49*c43cad87SWarner Losh return peak_max(peak); 50*c43cad87SWarner Losh } 51*c43cad87SWarner Losh 52*c43cad87SWarner Losh uint64_t 53*c43cad87SWarner Losh peak_alloc_new_event_wait(tsd_t *tsd) { 54*c43cad87SWarner Losh return PEAK_EVENT_WAIT; 55*c43cad87SWarner Losh } 56*c43cad87SWarner Losh 57*c43cad87SWarner Losh uint64_t 58*c43cad87SWarner Losh peak_alloc_postponed_event_wait(tsd_t *tsd) { 59*c43cad87SWarner Losh return TE_MIN_START_WAIT; 60*c43cad87SWarner Losh } 61*c43cad87SWarner Losh 62*c43cad87SWarner Losh void 63*c43cad87SWarner Losh peak_alloc_event_handler(tsd_t *tsd, uint64_t elapsed) { 64*c43cad87SWarner Losh peak_event_update(tsd); 65*c43cad87SWarner Losh peak_event_activity_callback(tsd); 66*c43cad87SWarner Losh } 67*c43cad87SWarner Losh 68*c43cad87SWarner Losh uint64_t 69*c43cad87SWarner Losh peak_dalloc_new_event_wait(tsd_t *tsd) { 70*c43cad87SWarner Losh return PEAK_EVENT_WAIT; 71*c43cad87SWarner Losh } 72*c43cad87SWarner Losh 73*c43cad87SWarner Losh uint64_t 74*c43cad87SWarner Losh peak_dalloc_postponed_event_wait(tsd_t *tsd) { 75*c43cad87SWarner Losh return TE_MIN_START_WAIT; 76*c43cad87SWarner Losh } 77*c43cad87SWarner Losh 78*c43cad87SWarner Losh void 79*c43cad87SWarner Losh peak_dalloc_event_handler(tsd_t *tsd, uint64_t elapsed) { 80*c43cad87SWarner Losh peak_event_update(tsd); 81*c43cad87SWarner Losh peak_event_activity_callback(tsd); 82*c43cad87SWarner Losh } 83