|
|
|
@@ -519,6 +519,7 @@ arena_chunk_map_misc_t *arena_run_to_miscelm(arena_run_t *run);
|
|
|
|
|
size_t *arena_mapbitsp_get(arena_chunk_t *chunk, size_t pageind);
|
|
|
|
|
size_t arena_mapbitsp_read(size_t *mapbitsp);
|
|
|
|
|
size_t arena_mapbits_get(arena_chunk_t *chunk, size_t pageind);
|
|
|
|
|
size_t arena_mapbits_size_decode(size_t mapbits);
|
|
|
|
|
size_t arena_mapbits_unallocated_size_get(arena_chunk_t *chunk,
|
|
|
|
|
size_t pageind);
|
|
|
|
|
size_t arena_mapbits_large_size_get(arena_chunk_t *chunk, size_t pageind);
|
|
|
|
@@ -530,6 +531,7 @@ size_t arena_mapbits_decommitted_get(arena_chunk_t *chunk, size_t pageind);
|
|
|
|
|
size_t arena_mapbits_large_get(arena_chunk_t *chunk, size_t pageind);
|
|
|
|
|
size_t arena_mapbits_allocated_get(arena_chunk_t *chunk, size_t pageind);
|
|
|
|
|
void arena_mapbitsp_write(size_t *mapbitsp, size_t mapbits);
|
|
|
|
|
size_t arena_mapbits_size_encode(size_t size);
|
|
|
|
|
void arena_mapbits_unallocated_set(arena_chunk_t *chunk, size_t pageind,
|
|
|
|
|
size_t size, size_t flags);
|
|
|
|
|
void arena_mapbits_unallocated_size_set(arena_chunk_t *chunk, size_t pageind,
|
|
|
|
@@ -652,6 +654,21 @@ arena_mapbits_get(arena_chunk_t *chunk, size_t pageind)
|
|
|
|
|
return (arena_mapbitsp_read(arena_mapbitsp_get(chunk, pageind)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JEMALLOC_ALWAYS_INLINE size_t
|
|
|
|
|
arena_mapbits_size_decode(size_t mapbits)
|
|
|
|
|
{
|
|
|
|
|
size_t size;
|
|
|
|
|
|
|
|
|
|
if (CHUNK_MAP_SIZE_SHIFT > 0)
|
|
|
|
|
size = (mapbits & CHUNK_MAP_SIZE_MASK) >> CHUNK_MAP_SIZE_SHIFT;
|
|
|
|
|
else if (CHUNK_MAP_SIZE_SHIFT == 0)
|
|
|
|
|
size = mapbits & CHUNK_MAP_SIZE_MASK;
|
|
|
|
|
else
|
|
|
|
|
size = (mapbits & CHUNK_MAP_SIZE_MASK) << -CHUNK_MAP_SIZE_SHIFT;
|
|
|
|
|
|
|
|
|
|
return (size);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JEMALLOC_ALWAYS_INLINE size_t
|
|
|
|
|
arena_mapbits_unallocated_size_get(arena_chunk_t *chunk, size_t pageind)
|
|
|
|
|
{
|
|
|
|
@@ -659,7 +676,7 @@ arena_mapbits_unallocated_size_get(arena_chunk_t *chunk, size_t pageind)
|
|
|
|
|
|
|
|
|
|
mapbits = arena_mapbits_get(chunk, pageind);
|
|
|
|
|
assert((mapbits & (CHUNK_MAP_LARGE|CHUNK_MAP_ALLOCATED)) == 0);
|
|
|
|
|
return ((mapbits & CHUNK_MAP_SIZE_MASK) >> CHUNK_MAP_SIZE_SHIFT);
|
|
|
|
|
return (arena_mapbits_size_decode(mapbits));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JEMALLOC_ALWAYS_INLINE size_t
|
|
|
|
@@ -670,7 +687,7 @@ arena_mapbits_large_size_get(arena_chunk_t *chunk, size_t pageind)
|
|
|
|
|
mapbits = arena_mapbits_get(chunk, pageind);
|
|
|
|
|
assert((mapbits & (CHUNK_MAP_LARGE|CHUNK_MAP_ALLOCATED)) ==
|
|
|
|
|
(CHUNK_MAP_LARGE|CHUNK_MAP_ALLOCATED));
|
|
|
|
|
return ((mapbits & CHUNK_MAP_SIZE_MASK) >> CHUNK_MAP_SIZE_SHIFT);
|
|
|
|
|
return (arena_mapbits_size_decode(mapbits));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JEMALLOC_ALWAYS_INLINE size_t
|
|
|
|
@@ -754,6 +771,22 @@ arena_mapbitsp_write(size_t *mapbitsp, size_t mapbits)
|
|
|
|
|
*mapbitsp = mapbits;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JEMALLOC_ALWAYS_INLINE size_t
|
|
|
|
|
arena_mapbits_size_encode(size_t size)
|
|
|
|
|
{
|
|
|
|
|
size_t mapbits;
|
|
|
|
|
|
|
|
|
|
if (CHUNK_MAP_SIZE_SHIFT > 0)
|
|
|
|
|
mapbits = size << CHUNK_MAP_SIZE_SHIFT;
|
|
|
|
|
else if (CHUNK_MAP_SIZE_SHIFT == 0)
|
|
|
|
|
mapbits = size;
|
|
|
|
|
else
|
|
|
|
|
mapbits = size >> -CHUNK_MAP_SIZE_SHIFT;
|
|
|
|
|
|
|
|
|
|
assert((mapbits & ~CHUNK_MAP_SIZE_MASK) == 0);
|
|
|
|
|
return (mapbits);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JEMALLOC_ALWAYS_INLINE void
|
|
|
|
|
arena_mapbits_unallocated_set(arena_chunk_t *chunk, size_t pageind, size_t size,
|
|
|
|
|
size_t flags)
|
|
|
|
@@ -761,11 +794,10 @@ arena_mapbits_unallocated_set(arena_chunk_t *chunk, size_t pageind, size_t size,
|
|
|
|
|
size_t *mapbitsp = arena_mapbitsp_get(chunk, pageind);
|
|
|
|
|
|
|
|
|
|
assert((size & PAGE_MASK) == 0);
|
|
|
|
|
assert(((size << CHUNK_MAP_SIZE_SHIFT) & ~CHUNK_MAP_SIZE_MASK) == 0);
|
|
|
|
|
assert((flags & CHUNK_MAP_FLAGS_MASK) == flags);
|
|
|
|
|
assert((flags & CHUNK_MAP_DECOMMITTED) == 0 || (flags &
|
|
|
|
|
(CHUNK_MAP_DIRTY|CHUNK_MAP_UNZEROED)) == 0);
|
|
|
|
|
arena_mapbitsp_write(mapbitsp, (size << CHUNK_MAP_SIZE_SHIFT) |
|
|
|
|
|
arena_mapbitsp_write(mapbitsp, arena_mapbits_size_encode(size) |
|
|
|
|
|
CHUNK_MAP_BININD_INVALID | flags);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -777,10 +809,9 @@ arena_mapbits_unallocated_size_set(arena_chunk_t *chunk, size_t pageind,
|
|
|
|
|
size_t mapbits = arena_mapbitsp_read(mapbitsp);
|
|
|
|
|
|
|
|
|
|
assert((size & PAGE_MASK) == 0);
|
|
|
|
|
assert(((size << CHUNK_MAP_SIZE_SHIFT) & ~CHUNK_MAP_SIZE_MASK) == 0);
|
|
|
|
|
assert((mapbits & (CHUNK_MAP_LARGE|CHUNK_MAP_ALLOCATED)) == 0);
|
|
|
|
|
arena_mapbitsp_write(mapbitsp, (size << CHUNK_MAP_SIZE_SHIFT) | (mapbits
|
|
|
|
|
& ~CHUNK_MAP_SIZE_MASK));
|
|
|
|
|
arena_mapbitsp_write(mapbitsp, arena_mapbits_size_encode(size) |
|
|
|
|
|
(mapbits & ~CHUNK_MAP_SIZE_MASK));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JEMALLOC_ALWAYS_INLINE void
|
|
|
|
@@ -799,11 +830,10 @@ arena_mapbits_large_set(arena_chunk_t *chunk, size_t pageind, size_t size,
|
|
|
|
|
size_t *mapbitsp = arena_mapbitsp_get(chunk, pageind);
|
|
|
|
|
|
|
|
|
|
assert((size & PAGE_MASK) == 0);
|
|
|
|
|
assert(((size << CHUNK_MAP_SIZE_SHIFT) & ~CHUNK_MAP_SIZE_MASK) == 0);
|
|
|
|
|
assert((flags & CHUNK_MAP_FLAGS_MASK) == flags);
|
|
|
|
|
assert((flags & CHUNK_MAP_DECOMMITTED) == 0 || (flags &
|
|
|
|
|
(CHUNK_MAP_DIRTY|CHUNK_MAP_UNZEROED)) == 0);
|
|
|
|
|
arena_mapbitsp_write(mapbitsp, (size << CHUNK_MAP_SIZE_SHIFT) |
|
|
|
|
|
arena_mapbitsp_write(mapbitsp, arena_mapbits_size_encode(size) |
|
|
|
|
|
CHUNK_MAP_BININD_INVALID | flags | CHUNK_MAP_LARGE |
|
|
|
|
|
CHUNK_MAP_ALLOCATED);
|
|
|
|
|
}
|
|
|
|
|