summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Evans <jasone@canonware.com>2015-03-24 19:33:12 (GMT)
committerJason Evans <jasone@canonware.com>2015-03-24 19:33:12 (GMT)
commitd324ca8933d4f9c3bca7e552be9805525726d1be (patch)
treeca26893d4b955e3259df09f0a2e3df76efabde3a /src
parentef0a0cc3283ea561a40b33f4325d54bbc351de21 (diff)
downloadjemalloc-d324ca8933d4f9c3bca7e552be9805525726d1be.zip
jemalloc-d324ca8933d4f9c3bca7e552be9805525726d1be.tar.gz
jemalloc-d324ca8933d4f9c3bca7e552be9805525726d1be.tar.bz2
Fix arena_get() usage.
Fix arena_get() calls that specify refresh_if_missing=false. In ctl_refresh() and ctl.c's arena_purge(), these calls attempted to only refresh once, but did so in an unreliable way. arena_i_lg_dirty_mult_ctl() was simply wrong to pass refresh_if_missing=false.
Diffstat (limited to 'src')
-rw-r--r--src/ctl.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/ctl.c b/src/ctl.c
index 0ed8ddd..4493546 100644
--- a/src/ctl.c
+++ b/src/ctl.c
@@ -684,6 +684,7 @@ ctl_refresh(void)
{
tsd_t *tsd;
unsigned i;
+ bool refreshed;
VARIABLE_ARRAY(arena_t *, tarenas, ctl_stats.narenas);
/*
@@ -694,8 +695,13 @@ ctl_refresh(void)
ctl_arena_clear(&ctl_stats.arenas[ctl_stats.narenas]);
tsd = tsd_fetch();
- for (i = 0; i < ctl_stats.narenas; i++)
- tarenas[i] = arena_get(tsd, i, false, (i == 0));
+ for (i = 0, refreshed = false; i < ctl_stats.narenas; i++) {
+ tarenas[i] = arena_get(tsd, i, false, false);
+ if (tarenas[i] == NULL && !refreshed) {
+ tarenas[i] = arena_get(tsd, i, false, true);
+ refreshed = true;
+ }
+ }
for (i = 0; i < ctl_stats.narenas; i++) {
if (tarenas[i] != NULL)
@@ -1538,11 +1544,17 @@ arena_purge(unsigned arena_ind)
{
tsd_t *tsd;
unsigned i;
+ bool refreshed;
VARIABLE_ARRAY(arena_t *, tarenas, ctl_stats.narenas);
tsd = tsd_fetch();
- for (i = 0; i < ctl_stats.narenas; i++)
- tarenas[i] = arena_get(tsd, i, false, (i == 0));
+ for (i = 0, refreshed = false; i < ctl_stats.narenas; i++) {
+ tarenas[i] = arena_get(tsd, i, false, false);
+ if (tarenas[i] == NULL && !refreshed) {
+ tarenas[i] = arena_get(tsd, i, false, true);
+ refreshed = true;
+ }
+ }
if (arena_ind == ctl_stats.narenas) {
unsigned i;
@@ -1638,7 +1650,7 @@ arena_i_lg_dirty_mult_ctl(const size_t *mib, size_t miblen, void *oldp,
unsigned arena_ind = mib[1];
arena_t *arena;
- arena = arena_get(tsd_fetch(), arena_ind, false, (arena_ind == 0));
+ arena = arena_get(tsd_fetch(), arena_ind, false, true);
if (arena == NULL) {
ret = EFAULT;
goto label_return;