mirror of
https://github.com/jemalloc/jemalloc.git
synced 2026-06-01 17:54:16 +03:00
Move te_prof_sample_event_lookahead into src/jemalloc.c
The function only had production callers in src/jemalloc.c. It was parked in prof_inlines.h because its body uses tsd accessors that aren't visible from prof.h. Moving it to file scope in jemalloc.c gets it out of the shared header without losing inlining, and the name drops the misleading te_ prefix -- it isn't a thread_event facility, just a one-off prof helper. Renamed prof_sample_lookahead for clarity.
This commit is contained in:
parent
2502195964
commit
5b834df66c
2 changed files with 22 additions and 30 deletions
|
|
@ -9,32 +9,6 @@
|
|||
#include "jemalloc/internal/sz.h"
|
||||
#include "jemalloc/internal/thread_event.h"
|
||||
|
||||
/*
|
||||
* The lookahead functionality facilitates events to be able to lookahead, i.e.
|
||||
* without touching the event counters, to determine whether an event would be
|
||||
* triggered. The event counters are not advanced until the end of the
|
||||
* allocation / deallocation calls, so the lookahead can be useful if some
|
||||
* preparation work for some event must be done early in the allocation /
|
||||
* deallocation calls.
|
||||
*
|
||||
* Currently only the profiling sampling event needs the lookahead
|
||||
* functionality, so we don't yet define general purpose lookahead functions.
|
||||
*
|
||||
* Defined here rather than prof.h because the inline body depends on tsd
|
||||
* accessors that aren't visible until tsd inlines are loaded.
|
||||
*/
|
||||
|
||||
JEMALLOC_ALWAYS_INLINE bool
|
||||
te_prof_sample_event_lookahead(tsd_t *tsd, size_t usize) {
|
||||
if (unlikely(!tsd_nominal(tsd) || tsd_reentrancy_level_get(tsd) > 0)) {
|
||||
return false;
|
||||
}
|
||||
/* The subtraction is intentionally susceptible to underflow. */
|
||||
uint64_t accumbytes = tsd_thread_allocated_get(tsd) + usize
|
||||
- tsd_thread_allocated_last_event_get(tsd);
|
||||
return accumbytes >= tsd_prof_sample_event_wait_get(tsd);
|
||||
}
|
||||
|
||||
JEMALLOC_ALWAYS_INLINE void
|
||||
prof_active_assert(void) {
|
||||
cassert(config_prof);
|
||||
|
|
|
|||
|
|
@ -149,6 +149,24 @@ const char *const zero_realloc_mode_names[] = {
|
|||
"abort",
|
||||
};
|
||||
|
||||
/*
|
||||
* Check whether the next allocation would trip the profiling sampler without
|
||||
* advancing the event counter (the counter only advances at the end of the
|
||||
* alloc/dalloc call). Lets the allocation path pre-compute the prof context
|
||||
* before committing. Lives here -- not in prof_inlines.h -- because jemalloc.c
|
||||
* is the only production caller.
|
||||
*/
|
||||
JEMALLOC_ALWAYS_INLINE bool
|
||||
prof_sample_lookahead(tsd_t *tsd, size_t usize) {
|
||||
if (unlikely(!tsd_nominal(tsd) || tsd_reentrancy_level_get(tsd) > 0)) {
|
||||
return false;
|
||||
}
|
||||
/* The subtraction is intentionally susceptible to underflow. */
|
||||
uint64_t accumbytes = tsd_thread_allocated_get(tsd) + usize
|
||||
- tsd_thread_allocated_last_event_get(tsd);
|
||||
return accumbytes >= tsd_prof_sample_event_wait_get(tsd);
|
||||
}
|
||||
|
||||
/*
|
||||
* These are the documented values for junk fill debugging facilities -- see the
|
||||
* man page.
|
||||
|
|
@ -610,7 +628,7 @@ imalloc_body(static_opts_t *sopts, dynamic_opts_t *dopts, tsd_t *tsd) {
|
|||
/* If profiling is on, get our profiling context. */
|
||||
if (config_prof && opt_prof) {
|
||||
bool prof_active = prof_active_get_unlocked();
|
||||
bool sample_event = te_prof_sample_event_lookahead(tsd, usize);
|
||||
bool sample_event = prof_sample_lookahead(tsd, usize);
|
||||
prof_tctx_t *tctx = prof_alloc_prep(
|
||||
tsd, prof_active, sample_event);
|
||||
|
||||
|
|
@ -1412,7 +1430,7 @@ irallocx_prof(tsd_t *tsd, void *old_ptr, size_t old_usize, size_t size,
|
|||
prof_info_t old_prof_info;
|
||||
prof_info_get_and_reset_recent(tsd, old_ptr, alloc_ctx, &old_prof_info);
|
||||
bool prof_active = prof_active_get_unlocked();
|
||||
bool sample_event = te_prof_sample_event_lookahead(tsd, usize);
|
||||
bool sample_event = prof_sample_lookahead(tsd, usize);
|
||||
prof_tctx_t *tctx = prof_alloc_prep(tsd, prof_active, sample_event);
|
||||
void *p;
|
||||
if (unlikely(tctx != PROF_TCTX_SENTINEL)) {
|
||||
|
|
@ -1650,7 +1668,7 @@ ixallocx_prof(tsd_t *tsd, void *ptr, size_t old_usize, size_t size,
|
|||
usize_max = SC_LARGE_MAXCLASS;
|
||||
}
|
||||
bool prof_active = prof_active_get_unlocked();
|
||||
bool sample_event = te_prof_sample_event_lookahead(tsd, usize_max);
|
||||
bool sample_event = prof_sample_lookahead(tsd, usize_max);
|
||||
prof_tctx_t *tctx = prof_alloc_prep(tsd, prof_active, sample_event);
|
||||
|
||||
size_t usize;
|
||||
|
|
@ -1685,7 +1703,7 @@ ixallocx_prof(tsd_t *tsd, void *ptr, size_t old_usize, size_t size,
|
|||
prof_info_get_and_reset_recent(
|
||||
tsd, ptr, &new_alloc_ctx, &prof_info);
|
||||
assert(usize <= usize_max);
|
||||
sample_event = te_prof_sample_event_lookahead(tsd, usize);
|
||||
sample_event = prof_sample_lookahead(tsd, usize);
|
||||
prof_realloc(tsd, ptr, size, usize, tctx, prof_active, ptr,
|
||||
old_usize, &prof_info, sample_event);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue