merge from dev

This commit is contained in:
daan 2020-04-20 13:03:55 -07:00
commit ae608cda2f
31 changed files with 184 additions and 139 deletions

View file

@ -163,19 +163,30 @@ extern "C" {
// Posix & Unix functions definitions
// ------------------------------------------------------
void* reallocf(void* p, size_t newsize) MI_FORWARD2(mi_reallocf,p,newsize);
void cfree(void* p) MI_FORWARD0(mi_free, p);
size_t malloc_size(void* p) { return mi_usable_size(p); }
size_t malloc_usable_size(void* p) { return mi_usable_size(p); }
void* reallocf(void* p, size_t newsize) MI_FORWARD2(mi_reallocf,p,newsize);
size_t malloc_size(void* p) MI_FORWARD1(mi_usable_size, p);
#if !defined(__ANDROID__)
size_t malloc_usable_size(void* p) MI_FORWARD1(mi_usable_size, p);
#else
size_t malloc_usable_size(const void* p) MI_FORWARD1(mi_usable_size, p);
#endif
// no forwarding here due to aliasing/name mangling issues
void* valloc(size_t size) { return MI_SOURCE_RET(mi_valloc, size); }
void* pvalloc(size_t size) { return MI_SOURCE_RET(mi_pvalloc, size); }
void* reallocarray(void* p, size_t count, size_t size) { return MI_SOURCE_RET(mi_reallocarray, p, count, size); }
void* memalign(size_t alignment, size_t size) { return MI_SOURCE_RET(mi_memalign, alignment, size); }
void* aligned_alloc(size_t alignment, size_t size) { return MI_SOURCE_RET(mi_aligned_alloc, alignment, size); }
int posix_memalign(void** p, size_t alignment, size_t size) { return MI_SOURCE_RET(mi_posix_memalign, p, alignment, size); }
void* _aligned_malloc(size_t alignment, size_t size) { return MI_SOURCE_RET(mi_aligned_alloc, alignment, size); }
// on some glibc `aligned_alloc` is declared `static inline` so we cannot override it (e.g. Conda). This happens
// when _GLIBCXX_HAVE_ALIGNED_ALLOC is not defined. However, in those cases it will use `memalign`, `posix_memalign`,
// or `_aligned_malloc` and we can avoid overriding it ourselves.
#if _GLIBCXX_HAVE_ALIGNED_ALLOC
void* aligned_alloc(size_t alignment, size_t size) { return MI_SOURCE_RET(mi_aligned_alloc, alignment, size); }
#endif
// Override to improve debug source locations
char* strdup(const char* s) { return MI_SOURCE_RET(mi_strdup, s); }
wchar_t* wcsdup(const wchar_t* s) { return MI_SOURCE_RET(mi_wcsdup, s); }
@ -183,6 +194,7 @@ wchar_t* wcsdup(const wchar_t* s) { return MI_SOURCE_RET(mi_wcsdup, s); }
// char* get_current_dir_name(void) { return MI_SOURCE_RET(mi_getcwd, NULL, 0); }
// char* getcwd(char* buf, size_t buf_len) { return MI_SOURCE_RET(mi_getcwd, buf, buf_len); }
#if defined(__GLIBC__) && defined(__linux__)
// forward __libc interface (needed for glibc-based Linux distributions)
void* __libc_malloc(size_t size) MI_FORWARD1(mi_malloc,size);
@ -191,8 +203,8 @@ wchar_t* wcsdup(const wchar_t* s) { return MI_SOURCE_RET(mi_wcsdup, s); }
void __libc_free(void* p) MI_FORWARD0(mi_free,p);
void __libc_cfree(void* p) MI_FORWARD0(mi_free,p);
void* __libc_valloc(size_t size) { return MI_SOURCE_RET(mi_valloc, size); }
void* __libc_pvalloc(size_t size) { return MI_SOURCE_RET(mi_pvalloc, size); }
void* __libc_valloc(size_t size) { return MI_SOURCE_RET(mi_valloc, size); }
void* __libc_pvalloc(size_t size) { return MI_SOURCE_RET(mi_pvalloc, size); }
void* __libc_memalign(size_t alignment, size_t size) { return MI_SOURCE_RET(mi_memalign, alignment, size); }
int __posix_memalign(void** p, size_t alignment, size_t size) { return MI_SOURCE_RET(mi_posix_memalign, p, alignment, size); }
#endif

View file

@ -212,10 +212,12 @@ static void* mi_win_virtual_allocx(void* addr, size_t size, size_t try_alignment
void* p = VirtualAlloc(hint, size, flags, PAGE_READWRITE);
if (p != NULL) return p;
DWORD err = GetLastError();
if (err != ERROR_INVALID_ADDRESS) { // if linked with multiple instances, we may have tried to allocate at an already allocated area
if (err != ERROR_INVALID_ADDRESS && // If linked with multiple instances, we may have tried to allocate at an already allocated area (#210)
err != ERROR_INVALID_PARAMETER) { // Windows7 instability (#230)
return NULL;
}
}
// fall through
}
#endif
#if defined(MEM_EXTENDED_PARAMETER_TYPE_BITS)
// on modern Windows try use VirtualAlloc2 for aligned allocation
@ -228,6 +230,7 @@ static void* mi_win_virtual_allocx(void* addr, size_t size, size_t try_alignment
return (*pVirtualAlloc2)(GetCurrentProcess(), addr, size, flags, PAGE_READWRITE, &param, 1);
}
#endif
// last resort
return VirtualAlloc(addr, size, flags, PAGE_READWRITE);
}