#include "lf_allocX64.h" //__arm__ id defined in clang for 32-bit ARM architectures only #if defined(__arm__) && !defined(__aarch64__) #error This allocator does not support 32-bit architectures. Please use another allocator instead! #endif ////////////////////////////////////////////////////////////////////////// // hooks #if defined(USE_INTELCC) || defined(_darwin_) || defined(_freebsd_) || defined(_STLPORT_VERSION) #define OP_THROWNOTHING noexcept #else #define OP_THROWNOTHING #endif #ifndef _darwin_ #if !defined(YMAKE) void* operator new(size_t size) { return LFAlloc(size); } void* operator new(size_t size, const std::nothrow_t&) OP_THROWNOTHING { return LFAlloc(size); } void operator delete(void* p)OP_THROWNOTHING { LFFree(p); } void operator delete(void* p, const std::nothrow_t&)OP_THROWNOTHING { LFFree(p); } void* operator new[](size_t size) { return LFAlloc(size); } void* operator new[](size_t size, const std::nothrow_t&) OP_THROWNOTHING { return LFAlloc(size); } void operator delete[](void* p) OP_THROWNOTHING { LFFree(p); } void operator delete[](void* p, const std::nothrow_t&) OP_THROWNOTHING { LFFree(p); } #endif //#ifndef _MSC_VER extern "C" void* malloc(size_t size) { return LFAlloc(size); } extern "C" void* valloc(size_t size) { return LFVAlloc(size); } extern "C" int posix_memalign(void** memptr, size_t alignment, size_t size) { return LFPosixMemalign(memptr, alignment, size); } extern "C" void* memalign(size_t alignment, size_t size) { void* ptr; int res = LFPosixMemalign(&ptr, alignment, size); return res ? nullptr : ptr; } extern "C" void* aligned_alloc(size_t alignment, size_t size) { return memalign(alignment, size); } #if !defined(_MSC_VER) && !defined(_freebsd_) // Workaround for pthread_create bug in linux. extern "C" void* __libc_memalign(size_t alignment, size_t size) { return memalign(alignment, size); } #endif extern "C" void free(void* ptr) { LFFree(ptr); } extern "C" void* calloc(size_t n, size_t elem_size) { // Overflow check const size_t size = n * elem_size; if (elem_size != 0 && size / elem_size != n) return nullptr; void* result = LFAlloc(size); if (result != nullptr) { memset(result, 0, size); } return result; } extern "C" void cfree(void* ptr) { LFFree(ptr); } extern "C" void* realloc(void* old_ptr, size_t new_size) { if (old_ptr == nullptr) { void* result = LFAlloc(new_size); return result; } if (new_size == 0) { LFFree(old_ptr); return nullptr; } void* new_ptr = LFAlloc(new_size); if (new_ptr == nullptr) { return nullptr; } size_t old_size = LFGetSize(old_ptr); memcpy(new_ptr, old_ptr, ((old_size < new_size) ? old_size : new_size)); LFFree(old_ptr); return new_ptr; } extern "C" size_t malloc_usable_size(void* ptr) { if (ptr == nullptr) { return 0; } return LFGetSize(ptr); } NMalloc::TMallocInfo NMalloc::MallocInfo() { NMalloc::TMallocInfo r; #if defined(LFALLOC_DBG) r.Name = "lfalloc_dbg"; #elif defined(LFALLOC_YT) r.Name = "lfalloc_yt"; #else r.Name = "lfalloc"; #endif r.SetParam = &LFAlloc_SetParam; r.GetParam = &LFAlloc_GetParam; return r; } #else NMalloc::TMallocInfo NMalloc::MallocInfo() { NMalloc::TMallocInfo r; r.Name = "system-darwin"; return r; } #endif