Skip to content

Commit a4e83e8

Browse files
committed
Fix run leak.
Fix arena_run_first_best_fit() to search all potentially non-empty runs_avail heaps, rather than ignoring the heap that contains runs larger than large_maxclass, but less than chunksize. This fixes a regression caused by f193fd8 (Refactor runs_avail.). This resolves jemalloc#493.
1 parent 9bef119 commit a4e83e8

File tree

2 files changed

+8
-6
lines changed

2 files changed

+8
-6
lines changed

src/arena.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ arena_avail_insert(arena_t *arena, arena_chunk_t *chunk, size_t pageind,
150150
arena_miscelm_get_const(chunk, pageind))));
151151
assert(npages == (arena_mapbits_unallocated_size_get(chunk, pageind) >>
152152
LG_PAGE));
153+
assert((npages << LG_PAGE) < chunksize);
154+
assert(pind2sz(pind) <= chunksize);
153155
arena_run_heap_insert(&arena->runs_avail[pind],
154156
arena_miscelm_get_mutable(chunk, pageind));
155157
}
@@ -162,6 +164,8 @@ arena_avail_remove(arena_t *arena, arena_chunk_t *chunk, size_t pageind,
162164
arena_miscelm_get_const(chunk, pageind))));
163165
assert(npages == (arena_mapbits_unallocated_size_get(chunk, pageind) >>
164166
LG_PAGE));
167+
assert((npages << LG_PAGE) < chunksize);
168+
assert(pind2sz(pind) <= chunksize);
165169
arena_run_heap_remove(&arena->runs_avail[pind],
166170
arena_miscelm_get_mutable(chunk, pageind));
167171
}
@@ -1046,7 +1050,7 @@ arena_run_first_best_fit(arena_t *arena, size_t size)
10461050

10471051
pind = psz2ind(run_quantize_ceil(size));
10481052

1049-
for (i = pind; pind2sz(i) <= large_maxclass; i++) {
1053+
for (i = pind; pind2sz(i) <= chunksize; i++) {
10501054
arena_chunk_map_misc_t *miscelm = arena_run_heap_first(
10511055
&arena->runs_avail[i]);
10521056
if (miscelm != NULL)
@@ -1922,8 +1926,7 @@ arena_reset(tsd_t *tsd, arena_t *arena)
19221926
assert(!arena->purging);
19231927
arena->nactive = 0;
19241928

1925-
for (i = 0; i < sizeof(arena->runs_avail) / sizeof(arena_run_heap_t);
1926-
i++)
1929+
for (i = 0; i < NPSIZES; i++)
19271930
arena_run_heap_new(&arena->runs_avail[i]);
19281931

19291932
malloc_mutex_unlock(tsd_tsdn(tsd), &arena->lock);
@@ -3514,8 +3517,7 @@ arena_new(tsdn_t *tsdn, unsigned ind)
35143517
arena->nactive = 0;
35153518
arena->ndirty = 0;
35163519

3517-
for (i = 0; i < sizeof(arena->runs_avail) / sizeof(arena_run_heap_t);
3518-
i++)
3520+
for (i = 0; i < NPSIZES; i++)
35193521
arena_run_heap_new(&arena->runs_avail[i]);
35203522

35213523
qr_new(&arena->runs_dirty, rd_link);

test/unit/run_quantize.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ TEST_BEGIN(test_monotonic)
111111

112112
floor_prev = 0;
113113
ceil_prev = 0;
114-
for (i = 1; i <= large_maxclass >> LG_PAGE; i++) {
114+
for (i = 1; i <= chunksize >> LG_PAGE; i++) {
115115
size_t run_size, floor, ceil;
116116

117117
run_size = i << LG_PAGE;

0 commit comments

Comments
 (0)