Fix arena locking in tcache_bin_flush_large().
This regression was introduced in c834912
(incorrect arena used).
This commit is contained in:
parent
0ff7ff3ec7
commit
fec1ef7c91
19
src/tcache.c
19
src/tcache.c
@ -193,8 +193,8 @@ tcache_bin_flush_large(tsd_t *tsd, cache_bin_t *tbin, szind_t binind,
|
|||||||
assert(binind < nhbins);
|
assert(binind < nhbins);
|
||||||
assert((cache_bin_sz_t)rem <= tbin->ncached);
|
assert((cache_bin_sz_t)rem <= tbin->ncached);
|
||||||
|
|
||||||
arena_t *arena = tcache->arena;
|
arena_t *tcache_arena = tcache->arena;
|
||||||
assert(arena != NULL);
|
assert(tcache_arena != NULL);
|
||||||
unsigned nflush = tbin->ncached - rem;
|
unsigned nflush = tbin->ncached - rem;
|
||||||
VARIABLE_ARRAY(extent_t *, item_extent, nflush);
|
VARIABLE_ARRAY(extent_t *, item_extent, nflush);
|
||||||
/* Look up extent once per item. */
|
/* Look up extent once per item. */
|
||||||
@ -212,7 +212,7 @@ tcache_bin_flush_large(tsd_t *tsd, cache_bin_t *tbin, szind_t binind,
|
|||||||
idump = false;
|
idump = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool lock_large = !arena_is_auto(arena);
|
bool lock_large = !arena_is_auto(locked_arena);
|
||||||
if (lock_large) {
|
if (lock_large) {
|
||||||
malloc_mutex_lock(tsd_tsdn(tsd), &locked_arena->large_mtx);
|
malloc_mutex_lock(tsd_tsdn(tsd), &locked_arena->large_mtx);
|
||||||
}
|
}
|
||||||
@ -225,16 +225,17 @@ tcache_bin_flush_large(tsd_t *tsd, cache_bin_t *tbin, szind_t binind,
|
|||||||
extent);
|
extent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((config_prof || config_stats) && locked_arena == arena) {
|
if ((config_prof || config_stats) &&
|
||||||
|
(locked_arena == tcache_arena)) {
|
||||||
if (config_prof) {
|
if (config_prof) {
|
||||||
idump = arena_prof_accum(tsd_tsdn(tsd), arena,
|
idump = arena_prof_accum(tsd_tsdn(tsd),
|
||||||
tcache->prof_accumbytes);
|
tcache_arena, tcache->prof_accumbytes);
|
||||||
tcache->prof_accumbytes = 0;
|
tcache->prof_accumbytes = 0;
|
||||||
}
|
}
|
||||||
if (config_stats) {
|
if (config_stats) {
|
||||||
merged_stats = true;
|
merged_stats = true;
|
||||||
arena_stats_large_nrequests_add(tsd_tsdn(tsd),
|
arena_stats_large_nrequests_add(tsd_tsdn(tsd),
|
||||||
&arena->stats, binind,
|
&tcache_arena->stats, binind,
|
||||||
tbin->tstats.nrequests);
|
tbin->tstats.nrequests);
|
||||||
tbin->tstats.nrequests = 0;
|
tbin->tstats.nrequests = 0;
|
||||||
}
|
}
|
||||||
@ -275,8 +276,8 @@ tcache_bin_flush_large(tsd_t *tsd, cache_bin_t *tbin, szind_t binind,
|
|||||||
* The flush loop didn't happen to flush to this thread's
|
* The flush loop didn't happen to flush to this thread's
|
||||||
* arena, so the stats didn't get merged. Manually do so now.
|
* arena, so the stats didn't get merged. Manually do so now.
|
||||||
*/
|
*/
|
||||||
arena_stats_large_nrequests_add(tsd_tsdn(tsd), &arena->stats,
|
arena_stats_large_nrequests_add(tsd_tsdn(tsd),
|
||||||
binind, tbin->tstats.nrequests);
|
&tcache_arena->stats, binind, tbin->tstats.nrequests);
|
||||||
tbin->tstats.nrequests = 0;
|
tbin->tstats.nrequests = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user