mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-05 06:59:32 +03:00
add mi_heap_new_ and mi_heap_new_n
This commit is contained in:
parent
fe300ca141
commit
34910664f1
2 changed files with 34 additions and 16 deletions
|
@ -394,6 +394,9 @@ mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_new_n(size_t count, s
|
||||||
mi_decl_nodiscard mi_decl_export void* mi_new_realloc(void* p, size_t newsize) mi_attr_alloc_size(2);
|
mi_decl_nodiscard mi_decl_export void* mi_new_realloc(void* p, size_t newsize) mi_attr_alloc_size(2);
|
||||||
mi_decl_nodiscard mi_decl_export void* mi_new_reallocn(void* p, size_t newcount, size_t size) mi_attr_alloc_size2(2, 3);
|
mi_decl_nodiscard mi_decl_export void* mi_new_reallocn(void* p, size_t newcount, size_t size) mi_attr_alloc_size2(2, 3);
|
||||||
|
|
||||||
|
mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_heap_new_(mi_heap_t* heap, size_t size) mi_attr_malloc mi_attr_alloc_size(2);
|
||||||
|
mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_heap_new_n(mi_heap_t* heap, size_t count, size_t size) mi_attr_malloc mi_attr_alloc_size2(2, 3);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
47
src/alloc.c
47
src/alloc.c
|
@ -904,20 +904,46 @@ static bool mi_try_new_handler(bool nothrow) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static mi_decl_noinline void* mi_try_new(size_t size, bool nothrow ) {
|
static mi_decl_noinline void* mi_heap_try_new(mi_heap_t* heap, size_t size, bool nothrow ) {
|
||||||
void* p = NULL;
|
void* p = NULL;
|
||||||
while(p == NULL && mi_try_new_handler(nothrow)) {
|
while(p == NULL && mi_try_new_handler(nothrow)) {
|
||||||
p = mi_malloc(size);
|
p = mi_heap_malloc(heap,size);
|
||||||
}
|
}
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
mi_decl_nodiscard mi_decl_restrict void* mi_new(size_t size) {
|
static mi_decl_noinline void* mi_try_new(size_t size, bool nothrow) {
|
||||||
void* p = mi_malloc(size);
|
return mi_heap_try_new(mi_get_default_heap(), size, nothrow);
|
||||||
if mi_unlikely(p == NULL) return mi_try_new(size,false);
|
}
|
||||||
|
|
||||||
|
|
||||||
|
mi_decl_nodiscard mi_decl_restrict inline void* mi_heap_new_(mi_heap_t* heap, size_t size) {
|
||||||
|
void* p = mi_heap_malloc(heap,size);
|
||||||
|
if mi_unlikely(p == NULL) return mi_heap_try_new(heap, size, false);
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mi_decl_nodiscard mi_decl_restrict void* mi_new(size_t size) {
|
||||||
|
return mi_heap_new_(mi_get_default_heap(), size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
mi_decl_nodiscard mi_decl_restrict inline void* mi_heap_new_n(mi_heap_t* heap, size_t count, size_t size) {
|
||||||
|
size_t total;
|
||||||
|
if mi_unlikely(mi_count_size_overflow(count, size, &total)) {
|
||||||
|
mi_try_new_handler(false); // on overflow we invoke the try_new_handler once to potentially throw std::bad_alloc
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return mi_heap_new_(heap,total);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mi_decl_nodiscard mi_decl_restrict void* mi_new_n(size_t count, size_t size) {
|
||||||
|
return mi_heap_new_n(mi_get_default_heap(), size, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
mi_decl_nodiscard mi_decl_restrict void* mi_new_nothrow(size_t size) mi_attr_noexcept {
|
mi_decl_nodiscard mi_decl_restrict void* mi_new_nothrow(size_t size) mi_attr_noexcept {
|
||||||
void* p = mi_malloc(size);
|
void* p = mi_malloc(size);
|
||||||
if mi_unlikely(p == NULL) return mi_try_new(size, true);
|
if mi_unlikely(p == NULL) return mi_try_new(size, true);
|
||||||
|
@ -942,17 +968,6 @@ mi_decl_nodiscard mi_decl_restrict void* mi_new_aligned_nothrow(size_t size, siz
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
mi_decl_nodiscard mi_decl_restrict void* mi_new_n(size_t count, size_t size) {
|
|
||||||
size_t total;
|
|
||||||
if mi_unlikely(mi_count_size_overflow(count, size, &total)) {
|
|
||||||
mi_try_new_handler(false); // on overflow we invoke the try_new_handler once to potentially throw std::bad_alloc
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return mi_new(total);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mi_decl_nodiscard void* mi_new_realloc(void* p, size_t newsize) {
|
mi_decl_nodiscard void* mi_new_realloc(void* p, size_t newsize) {
|
||||||
void* q;
|
void* q;
|
||||||
do {
|
do {
|
||||||
|
|
Loading…
Add table
Reference in a new issue