Refactor arena_cactive_update() into arena_cactive_{add,sub}().
This removes an implicit conversion from size_t to ssize_t. For cactive decreases, the size_t value was intentionally underflowed to generate "negative" values (actually positive values above the positive range of ssize_t), and the conversion to ssize_t was undefined according to C language semantics. This regression was perpetuated by1522937e9c
(Fix the cactive statistic.) and first release in 4.0.0, which in retrospect only fixed one of two problems introduced byaa5113b1fd
(Refactor overly large/complex functions) and first released in 3.5.0.
This commit is contained in:
parent
a62e94cabb
commit
3763d3b5f9
26
src/arena.c
26
src/arena.c
@ -373,15 +373,27 @@ arena_run_page_validate_zeroed(arena_chunk_t *chunk, size_t run_ind)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
arena_cactive_update(arena_t *arena, size_t add_pages, size_t sub_pages)
|
arena_cactive_add(arena_t *arena, size_t add_pages)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (config_stats) {
|
if (config_stats) {
|
||||||
ssize_t cactive_diff = CHUNK_CEILING((arena->nactive + add_pages
|
size_t cactive_add = CHUNK_CEILING((arena->nactive +
|
||||||
- sub_pages) << LG_PAGE) - CHUNK_CEILING(arena->nactive <<
|
add_pages) << LG_PAGE) - CHUNK_CEILING(arena->nactive <<
|
||||||
LG_PAGE);
|
LG_PAGE);
|
||||||
if (cactive_diff != 0)
|
if (cactive_add != 0)
|
||||||
stats_cactive_add(cactive_diff);
|
stats_cactive_add(cactive_add);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
arena_cactive_sub(arena_t *arena, size_t sub_pages)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (config_stats) {
|
||||||
|
size_t cactive_sub = CHUNK_CEILING(arena->nactive << LG_PAGE) -
|
||||||
|
CHUNK_CEILING((arena->nactive - sub_pages) << LG_PAGE);
|
||||||
|
if (cactive_sub != 0)
|
||||||
|
stats_cactive_sub(cactive_sub);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -403,7 +415,7 @@ arena_run_split_remove(arena_t *arena, arena_chunk_t *chunk, size_t run_ind,
|
|||||||
arena_avail_remove(arena, chunk, run_ind, total_pages);
|
arena_avail_remove(arena, chunk, run_ind, total_pages);
|
||||||
if (flag_dirty != 0)
|
if (flag_dirty != 0)
|
||||||
arena_run_dirty_remove(arena, chunk, run_ind, total_pages);
|
arena_run_dirty_remove(arena, chunk, run_ind, total_pages);
|
||||||
arena_cactive_update(arena, need_pages, 0);
|
arena_cactive_add(arena, need_pages);
|
||||||
arena->nactive += need_pages;
|
arena->nactive += need_pages;
|
||||||
|
|
||||||
/* Keep track of trailing unused pages for later use. */
|
/* Keep track of trailing unused pages for later use. */
|
||||||
@ -1915,7 +1927,7 @@ arena_run_dalloc(arena_t *arena, arena_run_t *run, bool dirty, bool cleaned,
|
|||||||
assert(run_ind < chunk_npages);
|
assert(run_ind < chunk_npages);
|
||||||
size = arena_run_size_get(arena, chunk, run, run_ind);
|
size = arena_run_size_get(arena, chunk, run, run_ind);
|
||||||
run_pages = (size >> LG_PAGE);
|
run_pages = (size >> LG_PAGE);
|
||||||
arena_cactive_update(arena, 0, run_pages);
|
arena_cactive_sub(arena, run_pages);
|
||||||
arena->nactive -= run_pages;
|
arena->nactive -= run_pages;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user