diff options
author | monster <monster@ydb.tech> | 2022-07-07 14:41:37 +0300 |
---|---|---|
committer | monster <monster@ydb.tech> | 2022-07-07 14:41:37 +0300 |
commit | 06e5c21a835c0e923506c4ff27929f34e00761c2 (patch) | |
tree | 75efcbc6854ef9bd476eb8bf00cc5c900da436a2 /library/cpp/ytalloc/impl/bridge.cpp | |
parent | 03f024c4412e3aa613bb543cf1660176320ba8f4 (diff) | |
download | ydb-06e5c21a835c0e923506c4ff27929f34e00761c2.tar.gz |
fix ya.make
Diffstat (limited to 'library/cpp/ytalloc/impl/bridge.cpp')
-rw-r--r-- | library/cpp/ytalloc/impl/bridge.cpp | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/library/cpp/ytalloc/impl/bridge.cpp b/library/cpp/ytalloc/impl/bridge.cpp new file mode 100644 index 00000000000..c8287d80de5 --- /dev/null +++ b/library/cpp/ytalloc/impl/bridge.cpp @@ -0,0 +1,241 @@ +#include "core-inl.h" + +#include <util/system/compiler.h> + +#include <library/cpp/malloc/api/malloc.h> + +namespace NYT::NYTAlloc { + +//////////////////////////////////////////////////////////////////////////////// +// YTAlloc public API + +#ifdef YT_ALLOC_ENABLED + +void* Allocate(size_t size) +{ + return AllocateInline(size); +} + +void* AllocateSmall(size_t rank) +{ + return AllocateSmallInline(rank); +} + +void* AllocatePageAligned(size_t size) +{ + return AllocatePageAlignedInline(size); +} + +void Free(void* ptr) +{ + FreeInline(ptr); +} + +void FreeNonNull(void* ptr) +{ + FreeNonNullInline(ptr); +} + +size_t GetAllocationSize(const void* ptr) +{ + return GetAllocationSizeInline(ptr); +} + +size_t GetAllocationSize(size_t size) +{ + return GetAllocationSizeInline(size); +} + +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Memory tags API bridge + +TMemoryTag GetCurrentMemoryTag() +{ + return TThreadManager::GetCurrentMemoryTag(); +} + +void SetCurrentMemoryTag(TMemoryTag tag) +{ + TThreadManager::SetCurrentMemoryTag(tag); +} + +void GetMemoryUsageForTags(const TMemoryTag* tags, size_t count, size_t* results) +{ + InitializeGlobals(); + StatisticsManager->GetTaggedMemoryUsage(tags, count, results); +} + +size_t GetMemoryUsageForTag(TMemoryTag tag) +{ + size_t result; + GetMemoryUsageForTags(&tag, 1, &result); + return result; +} + +//////////////////////////////////////////////////////////////////////////////// +// Memory zone API bridge + +void SetCurrentMemoryZone(EMemoryZone zone) +{ + TThreadManager::SetCurrentMemoryZone(zone); +} + +EMemoryZone GetCurrentMemoryZone() +{ + return TThreadManager::GetCurrentMemoryZone(); +} + +EMemoryZone GetAllocationMemoryZone(const void* ptr) +{ + auto uintptr = reinterpret_cast<uintptr_t>(ptr); + if (uintptr >= MinUntaggedSmallPtr && uintptr < MaxUntaggedSmallPtr || + uintptr >= MinTaggedSmallPtr && uintptr < MaxTaggedSmallPtr || + uintptr >= DumpableLargeZoneStart && uintptr < DumpableLargeZoneEnd) + { + return EMemoryZone::Normal; + } else if (uintptr >= UndumpableLargeZoneStart && uintptr < UndumpableLargeZoneEnd) { + return EMemoryZone::Undumpable; + } else { + return EMemoryZone::Unknown; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Fiber id API + +void SetCurrentFiberId(TFiberId id) +{ + TThreadManager::SetCurrentFiberId(id); +} + +TFiberId GetCurrentFiberId() +{ + return TThreadManager::GetCurrentFiberId(); +} + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace NYT::NYTAlloc + +//////////////////////////////////////////////////////////////////////////////// +// Libc malloc bridge + +#ifdef YT_ALLOC_ENABLED + +using namespace NYT::NYTAlloc; + +extern "C" void* malloc(size_t size) +{ + return AllocateInline(size); +} + +extern "C" void* valloc(size_t size) +{ + return AllocatePageAlignedInline(size); +} + +extern "C" void* aligned_alloc(size_t alignment, size_t size) +{ + // Alignment must be a power of two. + Y_VERIFY((alignment & (alignment - 1)) == 0); + // Alignment must not exceed the page size. + Y_VERIFY(alignment <= PageSize); + if (alignment <= 16) { + // Proper alignment here is automatic. + return Allocate(size); + } else { + return AllocatePageAligned(size); + } +} + +extern "C" void* pvalloc(size_t size) +{ + return valloc(AlignUp(size, PageSize)); +} + +extern "C" int posix_memalign(void** ptrPtr, size_t alignment, size_t size) +{ + *ptrPtr = aligned_alloc(alignment, size); + return 0; +} + +extern "C" void* memalign(size_t alignment, size_t size) +{ + return aligned_alloc(alignment, size); +} + +extern "C" void* __libc_memalign(size_t alignment, size_t size) +{ + return aligned_alloc(alignment, size); +} + +extern "C" void free(void* ptr) +{ + FreeInline(ptr); +} + +extern "C" void* calloc(size_t n, size_t elemSize) +{ + // Overflow check. + auto size = n * elemSize; + if (elemSize != 0 && size / elemSize != n) { + return nullptr; + } + + void* result = Allocate(size); + ::memset(result, 0, size); + return result; +} + +extern "C" void cfree(void* ptr) +{ + Free(ptr); +} + +extern "C" void* realloc(void* oldPtr, size_t newSize) +{ + if (!oldPtr) { + return Allocate(newSize); + } + + if (newSize == 0) { + Free(oldPtr); + return nullptr; + } + + void* newPtr = Allocate(newSize); + size_t oldSize = GetAllocationSize(oldPtr); + ::memcpy(newPtr, oldPtr, std::min(oldSize, newSize)); + Free(oldPtr); + return newPtr; +} + +extern "C" size_t malloc_usable_size(void* ptr) noexcept +{ + return GetAllocationSize(ptr); +} + +extern "C" size_t nallocx(size_t size, int /* flags */) noexcept +{ + return GetAllocationSize(size); +} + +#endif + +namespace NMalloc { + +//////////////////////////////////////////////////////////////////////////////// +// Arcadia malloc API bridge + +TMallocInfo MallocInfo() +{ + TMallocInfo info; + info.Name = "ytalloc"; + return info; +} + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace NMalloc |