mirror of
https://github.com/jemalloc/jemalloc.git
synced 2026-05-10 15:06:24 +03:00
Track extent is_head state in rtree leaf.
This commit is contained in:
parent
862219e461
commit
70d1541c5b
6 changed files with 53 additions and 20 deletions
|
|
@ -227,10 +227,14 @@ bool
|
|||
ehooks_default_merge(extent_hooks_t *extent_hooks, void *addr_a, size_t size_a,
|
||||
void *addr_b, size_t size_b, bool committed, unsigned arena_ind) {
|
||||
tsdn_t *tsdn = tsdn_fetch();
|
||||
|
||||
edata_t *a = emap_edata_lookup(tsdn, &arena_emap_global, addr_a);
|
||||
bool head_a = edata_is_head_get(a);
|
||||
edata_t *b = emap_edata_lookup(tsdn, &arena_emap_global, addr_b);
|
||||
bool head_b = edata_is_head_get(b);
|
||||
emap_assert_mapped(tsdn, &arena_emap_global, a);
|
||||
emap_assert_mapped(tsdn, &arena_emap_global, b);
|
||||
|
||||
return ehooks_default_merge_impl(tsdn, addr_a, head_a, addr_b, head_b);
|
||||
}
|
||||
|
||||
|
|
|
|||
21
src/emap.c
21
src/emap.c
|
|
@ -141,6 +141,8 @@ emap_rtree_write_acquired(tsdn_t *tsdn, emap_t *emap, rtree_leaf_elm_t *elm_a,
|
|||
contents.edata = edata;
|
||||
contents.metadata.szind = szind;
|
||||
contents.metadata.slab = slab;
|
||||
contents.metadata.is_head = (edata == NULL) ? false :
|
||||
edata_is_head_get(edata);
|
||||
rtree_leaf_elm_write(tsdn, &emap->rtree, elm_a, contents);
|
||||
if (elm_b != NULL) {
|
||||
rtree_leaf_elm_write(tsdn, &emap->rtree, elm_b, contents);
|
||||
|
|
@ -169,12 +171,14 @@ emap_register_interior(tsdn_t *tsdn, emap_t *emap, edata_t *edata,
|
|||
|
||||
assert(edata_slab_get(edata));
|
||||
|
||||
rtree_contents_t contents;
|
||||
contents.edata = edata;
|
||||
contents.metadata.szind = szind;
|
||||
contents.metadata.slab = true;
|
||||
contents.metadata.is_head = false; /* Not allowed to access. */
|
||||
|
||||
/* Register interior. */
|
||||
for (size_t i = 1; i < (edata_size_get(edata) >> LG_PAGE) - 1; i++) {
|
||||
rtree_contents_t contents;
|
||||
contents.edata = edata;
|
||||
contents.metadata.szind = szind;
|
||||
contents.metadata.slab = true;
|
||||
rtree_write(tsdn, &emap->rtree, rtree_ctx,
|
||||
(uintptr_t)edata_base_get(edata) + (uintptr_t)(i <<
|
||||
LG_PAGE), contents);
|
||||
|
|
@ -214,6 +218,8 @@ emap_remap(tsdn_t *tsdn, emap_t *emap, edata_t *edata, szind_t szind,
|
|||
contents.edata = edata;
|
||||
contents.metadata.szind = szind;
|
||||
contents.metadata.slab = slab;
|
||||
contents.metadata.is_head = edata_is_head_get(edata);
|
||||
|
||||
rtree_write(tsdn, &emap->rtree, rtree_ctx,
|
||||
(uintptr_t)edata_addr_get(edata), contents);
|
||||
/*
|
||||
|
|
@ -297,6 +303,7 @@ emap_merge_commit(tsdn_t *tsdn, emap_t *emap, emap_prepare_t *prepare,
|
|||
clear_contents.edata = NULL;
|
||||
clear_contents.metadata.szind = SC_NSIZES;
|
||||
clear_contents.metadata.slab = false;
|
||||
clear_contents.metadata.is_head = false;
|
||||
|
||||
if (prepare->lead_elm_b != NULL) {
|
||||
rtree_leaf_elm_write(tsdn, &emap->rtree,
|
||||
|
|
@ -320,8 +327,10 @@ void
|
|||
emap_do_assert_mapped(tsdn_t *tsdn, emap_t *emap, edata_t *edata) {
|
||||
EMAP_DECLARE_RTREE_CTX;
|
||||
|
||||
assert(rtree_read(tsdn, &emap->rtree, rtree_ctx,
|
||||
(uintptr_t)edata_base_get(edata)).edata == edata);
|
||||
rtree_contents_t contents = rtree_read(tsdn, &emap->rtree, rtree_ctx,
|
||||
(uintptr_t)edata_base_get(edata));
|
||||
assert(contents.edata == edata);
|
||||
assert(contents.metadata.is_head == edata_is_head_get(edata));
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -1254,6 +1254,8 @@ extent_merge_impl(tsdn_t *tsdn, pac_t *pac, ehooks_t *ehooks, edata_t *a,
|
|||
|
||||
assert(edata_arena_ind_get(a) == edata_arena_ind_get(b));
|
||||
assert(edata_arena_ind_get(a) == ehooks_ind_get(ehooks));
|
||||
emap_assert_mapped(tsdn, pac->emap, a);
|
||||
emap_assert_mapped(tsdn, pac->emap, b);
|
||||
|
||||
bool err = ehooks_merge(tsdn, ehooks, edata_base_get(a),
|
||||
edata_size_get(a), edata_is_head_get(a), edata_base_get(b),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue