mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-04 22:49:32 +03:00
fix link error to _mi_bin with C++; issue #533
This commit is contained in:
parent
6401c6325a
commit
a4303c6931
3 changed files with 12 additions and 8 deletions
|
@ -484,7 +484,7 @@ void mi_free(void* p) mi_attr_noexcept
|
||||||
mi_threadid_t tid = _mi_thread_id();
|
mi_threadid_t tid = _mi_thread_id();
|
||||||
mi_page_t* const page = _mi_segment_page_of(segment, p);
|
mi_page_t* const page = _mi_segment_page_of(segment, p);
|
||||||
mi_block_t* const block = (mi_block_t*)p;
|
mi_block_t* const block = (mi_block_t*)p;
|
||||||
|
|
||||||
if (mi_likely(tid == mi_atomic_load_relaxed(&segment->thread_id) && page->flags.full_aligned == 0)) { // the thread id matches and it is not a full page, nor has aligned blocks
|
if (mi_likely(tid == mi_atomic_load_relaxed(&segment->thread_id) && page->flags.full_aligned == 0)) { // the thread id matches and it is not a full page, nor has aligned blocks
|
||||||
// local, and not full or aligned
|
// local, and not full or aligned
|
||||||
if (mi_unlikely(mi_check_is_double_free(page,block))) return;
|
if (mi_unlikely(mi_check_is_double_free(page,block))) return;
|
||||||
|
|
|
@ -53,7 +53,7 @@ static inline bool mi_page_queue_is_special(const mi_page_queue_t* pq) {
|
||||||
// Returns MI_BIN_HUGE if the size is too large.
|
// Returns MI_BIN_HUGE if the size is too large.
|
||||||
// We use `wsize` for the size in "machine word sizes",
|
// We use `wsize` for the size in "machine word sizes",
|
||||||
// i.e. byte size == `wsize*sizeof(void*)`.
|
// i.e. byte size == `wsize*sizeof(void*)`.
|
||||||
extern inline uint8_t _mi_bin(size_t size) {
|
static inline uint8_t mi_bin(size_t size) {
|
||||||
size_t wsize = _mi_wsize_from_size(size);
|
size_t wsize = _mi_wsize_from_size(size);
|
||||||
uint8_t bin;
|
uint8_t bin;
|
||||||
if (wsize <= 1) {
|
if (wsize <= 1) {
|
||||||
|
@ -98,6 +98,10 @@ extern inline uint8_t _mi_bin(size_t size) {
|
||||||
Queue of pages with free blocks
|
Queue of pages with free blocks
|
||||||
----------------------------------------------------------- */
|
----------------------------------------------------------- */
|
||||||
|
|
||||||
|
uint8_t _mi_bin(size_t size) {
|
||||||
|
return mi_bin(size);
|
||||||
|
}
|
||||||
|
|
||||||
size_t _mi_bin_size(uint8_t bin) {
|
size_t _mi_bin_size(uint8_t bin) {
|
||||||
return _mi_heap_empty.pages[bin].block_size;
|
return _mi_heap_empty.pages[bin].block_size;
|
||||||
}
|
}
|
||||||
|
@ -105,7 +109,7 @@ size_t _mi_bin_size(uint8_t bin) {
|
||||||
// Good size for allocation
|
// Good size for allocation
|
||||||
size_t mi_good_size(size_t size) mi_attr_noexcept {
|
size_t mi_good_size(size_t size) mi_attr_noexcept {
|
||||||
if (size <= MI_LARGE_OBJ_SIZE_MAX) {
|
if (size <= MI_LARGE_OBJ_SIZE_MAX) {
|
||||||
return _mi_bin_size(_mi_bin(size));
|
return _mi_bin_size(mi_bin(size));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return _mi_align_up(size,_mi_os_page_size());
|
return _mi_align_up(size,_mi_os_page_size());
|
||||||
|
@ -134,7 +138,7 @@ static bool mi_heap_contains_queue(const mi_heap_t* heap, const mi_page_queue_t*
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static mi_page_queue_t* mi_page_queue_of(const mi_page_t* page) {
|
static mi_page_queue_t* mi_page_queue_of(const mi_page_t* page) {
|
||||||
uint8_t bin = (mi_page_is_in_full(page) ? MI_BIN_FULL : _mi_bin(page->xblock_size));
|
uint8_t bin = (mi_page_is_in_full(page) ? MI_BIN_FULL : mi_bin(page->xblock_size));
|
||||||
mi_heap_t* heap = mi_page_heap(page);
|
mi_heap_t* heap = mi_page_heap(page);
|
||||||
mi_assert_internal(heap != NULL && bin <= MI_BIN_FULL);
|
mi_assert_internal(heap != NULL && bin <= MI_BIN_FULL);
|
||||||
mi_page_queue_t* pq = &heap->pages[bin];
|
mi_page_queue_t* pq = &heap->pages[bin];
|
||||||
|
@ -144,7 +148,7 @@ static mi_page_queue_t* mi_page_queue_of(const mi_page_t* page) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static mi_page_queue_t* mi_heap_page_queue_of(mi_heap_t* heap, const mi_page_t* page) {
|
static mi_page_queue_t* mi_heap_page_queue_of(mi_heap_t* heap, const mi_page_t* page) {
|
||||||
uint8_t bin = (mi_page_is_in_full(page) ? MI_BIN_FULL : _mi_bin(page->xblock_size));
|
uint8_t bin = (mi_page_is_in_full(page) ? MI_BIN_FULL : mi_bin(page->xblock_size));
|
||||||
mi_assert_internal(bin <= MI_BIN_FULL);
|
mi_assert_internal(bin <= MI_BIN_FULL);
|
||||||
mi_page_queue_t* pq = &heap->pages[bin];
|
mi_page_queue_t* pq = &heap->pages[bin];
|
||||||
mi_assert_internal(mi_page_is_in_full(page) || page->xblock_size == pq->block_size);
|
mi_assert_internal(mi_page_is_in_full(page) || page->xblock_size == pq->block_size);
|
||||||
|
@ -177,9 +181,9 @@ static inline void mi_heap_queue_first_update(mi_heap_t* heap, const mi_page_que
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// find previous size; due to minimal alignment upto 3 previous bins may need to be skipped
|
// find previous size; due to minimal alignment upto 3 previous bins may need to be skipped
|
||||||
uint8_t bin = _mi_bin(size);
|
uint8_t bin = mi_bin(size);
|
||||||
const mi_page_queue_t* prev = pq - 1;
|
const mi_page_queue_t* prev = pq - 1;
|
||||||
while( bin == _mi_bin(prev->block_size) && prev > &heap->pages[0]) {
|
while( bin == mi_bin(prev->block_size) && prev > &heap->pages[0]) {
|
||||||
prev--;
|
prev--;
|
||||||
}
|
}
|
||||||
start = 1 + _mi_wsize_from_size(prev->block_size);
|
start = 1 + _mi_wsize_from_size(prev->block_size);
|
||||||
|
|
|
@ -768,7 +768,7 @@ void mi_register_deferred_free(mi_deferred_free_fun* fn, void* arg) mi_attr_noex
|
||||||
// that frees the block can free the whole page and segment directly.
|
// that frees the block can free the whole page and segment directly.
|
||||||
static mi_page_t* mi_huge_page_alloc(mi_heap_t* heap, size_t size) {
|
static mi_page_t* mi_huge_page_alloc(mi_heap_t* heap, size_t size) {
|
||||||
size_t block_size = _mi_os_good_alloc_size(size);
|
size_t block_size = _mi_os_good_alloc_size(size);
|
||||||
mi_assert_internal(_mi_bin(block_size) == MI_BIN_HUGE);
|
mi_assert_internal(mi_bin(block_size) == MI_BIN_HUGE);
|
||||||
mi_page_t* page = mi_page_fresh_alloc(heap,NULL,block_size);
|
mi_page_t* page = mi_page_fresh_alloc(heap,NULL,block_size);
|
||||||
if (page != NULL) {
|
if (page != NULL) {
|
||||||
const size_t bsize = mi_page_block_size(page); // note: not `mi_page_usable_block_size` as `size` includes padding already
|
const size_t bsize = mi_page_block_size(page); // note: not `mi_page_usable_block_size` as `size` includes padding already
|
||||||
|
|
Loading…
Add table
Reference in a new issue