diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/lfalloc/lf_allocX64.cpp | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/lfalloc/lf_allocX64.cpp')
-rw-r--r-- | library/cpp/lfalloc/lf_allocX64.cpp | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/library/cpp/lfalloc/lf_allocX64.cpp b/library/cpp/lfalloc/lf_allocX64.cpp new file mode 100644 index 0000000000..2eb90761fe --- /dev/null +++ b/library/cpp/lfalloc/lf_allocX64.cpp @@ -0,0 +1,144 @@ +#include "lf_allocX64.h" + +////////////////////////////////////////////////////////////////////////// +// 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 |