diff options
author | daan <daanl@outlook.com> | 2020-09-05 21:58:32 -0700 |
---|---|---|
committer | daan <daanl@outlook.com> | 2020-09-05 21:58:32 -0700 |
commit | f7dc4847f26533ba6bf1a59b6955db4b497a35d7 (patch) | |
tree | d2e2dc77608f388291815ab740efc8460ae5e270 /include/mimalloc-internal.h | |
parent | 63a9f45ba64e44162fa0de41030e0d012c5bcbba (diff) |
keep commit_mask live in the cache for better reuse
Diffstat (limited to 'include/mimalloc-internal.h')
-rw-r--r-- | include/mimalloc-internal.h | 39 |
1 files changed, 29 insertions, 10 deletions
diff --git a/include/mimalloc-internal.h b/include/mimalloc-internal.h index bcced4c..8004ba8 100644 --- a/include/mimalloc-internal.h +++ b/include/mimalloc-internal.h @@ -71,9 +71,9 @@ bool _mi_os_unreset(void* p, size_t size, bool* is_zero, mi_stats_t* stats) size_t _mi_os_good_alloc_size(size_t size); // arena.c -void* _mi_arena_alloc_aligned(size_t size, size_t alignment, bool* commit, bool* large, bool* is_zero, size_t* memid, mi_os_tld_t* tld); -void* _mi_arena_alloc(size_t size, bool* commit, bool* large, bool* is_zero, size_t* memid, mi_os_tld_t* tld); -void _mi_arena_free(void* p, size_t size, size_t memid, bool is_committed, bool is_large, mi_os_tld_t* tld); +void* _mi_arena_alloc_aligned(size_t size, size_t alignment, bool commit, mi_commit_mask_t* commit_mask, bool* large, bool* is_zero, size_t* memid, mi_os_tld_t* tld); +void* _mi_arena_alloc(size_t size, bool commit, mi_commit_mask_t* commit_mask, bool* large, bool* is_zero, size_t* memid, mi_os_tld_t* tld); +void _mi_arena_free(void* p, size_t size, size_t memid, mi_commit_mask_t commit_mask, bool is_large, mi_os_tld_t* tld); // "segment.c" @@ -655,6 +655,8 @@ static inline void mi_block_set_next(const mi_page_t* page, mi_block_t* block, c // commit mask // ------------------------------------------------------------------- +#define MI_COMMIT_MASK_BITS (sizeof(mi_commit_mask_t)*8) + static inline mi_commit_mask_t mi_commit_mask_empty(void) { return 0; } @@ -664,9 +666,9 @@ static inline mi_commit_mask_t mi_commit_mask_full(void) { } static inline mi_commit_mask_t mi_commit_mask_create(uintptr_t bitidx, uintptr_t bitcount) { - mi_assert_internal(bitidx < MI_INTPTR_BITS); - mi_assert_internal((bitidx + bitcount) <= MI_INTPTR_BITS); - if (bitcount == MI_INTPTR_BITS) { + mi_assert_internal(bitidx < MI_COMMIT_MASK_BITS); + mi_assert_internal((bitidx + bitcount) <= MI_COMMIT_MASK_BITS); + if (bitcount == MI_COMMIT_MASK_BITS) { mi_assert_internal(bitidx==0); return mi_commit_mask_full(); } @@ -683,7 +685,7 @@ static inline bool mi_commit_mask_is_empty(mi_commit_mask_t mask) { } static inline bool mi_commit_mask_is_full(mi_commit_mask_t mask) { - return (~mask == 0); + return ((~mask) == 0); } static inline bool mi_commit_mask_all_set(mi_commit_mask_t commit, mi_commit_mask_t mask) { @@ -694,18 +696,35 @@ static inline bool mi_commit_mask_any_set(mi_commit_mask_t commit, mi_commit_mas return ((commit & mask) != 0); } -static mi_decl_nodiscard inline mi_commit_mask_t mi_commit_mask_intersect(mi_commit_mask_t commit, mi_commit_mask_t mask) { +mi_decl_nodiscard static inline mi_commit_mask_t mi_commit_mask_intersect(mi_commit_mask_t commit, mi_commit_mask_t mask) { return (commit & mask); } static inline void mi_commit_mask_clear(mi_commit_mask_t* commit, mi_commit_mask_t mask) { - *commit = *commit & ~mask; + *commit = (*commit) & (~mask); } static inline void mi_commit_mask_set(mi_commit_mask_t* commit, mi_commit_mask_t mask) { - *commit = *commit | mask; + *commit = (*commit) | mask; +} + +static inline size_t mi_commit_mask_committed_size(mi_commit_mask_t mask, size_t total) { + if (mi_commit_mask_is_full(mask)) { + return total; + } + else if (mi_commit_mask_is_empty(mask)) { + return 0; + } + else { + size_t count = 0; + for (; mask != 0; mask >>= 1) { // todo: use popcount + if ((mask&1)!=0) count++; + } + return (total/MI_COMMIT_MASK_BITS)*count; + } } + #define mi_commit_mask_foreach(mask,idx,count) \ idx = 0; \ while (mask != 0) { \ |