mirror of
https://github.com/jemalloc/jemalloc.git
synced 2026-07-23 21:23:06 +00:00
Use ticker_geom_t for arena tcache decay.
This commit is contained in:
committed by
David Goldblatt
parent
8edfc5b170
commit
c259323ab3
@@ -493,82 +493,6 @@ arena_unbind(tsd_t *tsd, unsigned ind, bool internal) {
|
||||
}
|
||||
}
|
||||
|
||||
arena_tdata_t *
|
||||
arena_tdata_get_hard(tsd_t *tsd, unsigned ind) {
|
||||
arena_tdata_t *tdata, *arenas_tdata_old;
|
||||
arena_tdata_t *arenas_tdata = tsd_arenas_tdata_get(tsd);
|
||||
unsigned narenas_tdata_old, i;
|
||||
unsigned narenas_tdata = tsd_narenas_tdata_get(tsd);
|
||||
unsigned narenas_actual = narenas_total_get();
|
||||
|
||||
/*
|
||||
* Dissociate old tdata array (and set up for deallocation upon return)
|
||||
* if it's too small.
|
||||
*/
|
||||
if (arenas_tdata != NULL && narenas_tdata < narenas_actual) {
|
||||
arenas_tdata_old = arenas_tdata;
|
||||
narenas_tdata_old = narenas_tdata;
|
||||
arenas_tdata = NULL;
|
||||
narenas_tdata = 0;
|
||||
tsd_arenas_tdata_set(tsd, arenas_tdata);
|
||||
tsd_narenas_tdata_set(tsd, narenas_tdata);
|
||||
} else {
|
||||
arenas_tdata_old = NULL;
|
||||
narenas_tdata_old = 0;
|
||||
}
|
||||
|
||||
/* Allocate tdata array if it's missing. */
|
||||
if (arenas_tdata == NULL) {
|
||||
bool *arenas_tdata_bypassp = tsd_arenas_tdata_bypassp_get(tsd);
|
||||
narenas_tdata = (ind < narenas_actual) ? narenas_actual : ind+1;
|
||||
|
||||
if (tsd_nominal(tsd) && !*arenas_tdata_bypassp) {
|
||||
*arenas_tdata_bypassp = true;
|
||||
arenas_tdata = (arena_tdata_t *)a0malloc(
|
||||
sizeof(arena_tdata_t) * narenas_tdata);
|
||||
*arenas_tdata_bypassp = false;
|
||||
}
|
||||
if (arenas_tdata == NULL) {
|
||||
tdata = NULL;
|
||||
goto label_return;
|
||||
}
|
||||
assert(tsd_nominal(tsd) && !*arenas_tdata_bypassp);
|
||||
tsd_arenas_tdata_set(tsd, arenas_tdata);
|
||||
tsd_narenas_tdata_set(tsd, narenas_tdata);
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy to tdata array. It's possible that the actual number of arenas
|
||||
* has increased since narenas_total_get() was called above, but that
|
||||
* causes no correctness issues unless two threads concurrently execute
|
||||
* the arenas.create mallctl, which we trust mallctl synchronization to
|
||||
* prevent.
|
||||
*/
|
||||
|
||||
/* Copy/initialize tickers. */
|
||||
for (i = 0; i < narenas_actual; i++) {
|
||||
if (i < narenas_tdata_old) {
|
||||
ticker_copy(&arenas_tdata[i].decay_ticker,
|
||||
&arenas_tdata_old[i].decay_ticker);
|
||||
} else {
|
||||
ticker_init(&arenas_tdata[i].decay_ticker,
|
||||
DECAY_NTICKS_PER_UPDATE);
|
||||
}
|
||||
}
|
||||
if (narenas_tdata > narenas_actual) {
|
||||
memset(&arenas_tdata[narenas_actual], 0, sizeof(arena_tdata_t)
|
||||
* (narenas_tdata - narenas_actual));
|
||||
}
|
||||
|
||||
/* Read the refreshed tdata array. */
|
||||
tdata = &arenas_tdata[ind];
|
||||
label_return:
|
||||
if (arenas_tdata_old != NULL) {
|
||||
a0dalloc(arenas_tdata_old);
|
||||
}
|
||||
return tdata;
|
||||
}
|
||||
|
||||
/* Slow path, called only by arena_choose(). */
|
||||
arena_t *
|
||||
arena_choose_hard(tsd_t *tsd, bool internal) {
|
||||
@@ -705,20 +629,6 @@ arena_cleanup(tsd_t *tsd) {
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
arenas_tdata_cleanup(tsd_t *tsd) {
|
||||
arena_tdata_t *arenas_tdata;
|
||||
|
||||
/* Prevent tsd->arenas_tdata from being (re)created. */
|
||||
*tsd_arenas_tdata_bypassp_get(tsd) = true;
|
||||
|
||||
arenas_tdata = tsd_arenas_tdata_get(tsd);
|
||||
if (arenas_tdata != NULL) {
|
||||
tsd_arenas_tdata_set(tsd, NULL);
|
||||
a0dalloc(arenas_tdata);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
stats_print_atexit(void) {
|
||||
if (config_stats) {
|
||||
|
||||
Reference in New Issue
Block a user