// This file contains the fallback implementations of YTAlloc-specific stuff.
// These implementations are annotated with Y_WEAK to ensure that if the actual YTAlloc
// is available at the link time, the latter is preferred over the fallback.
#include "ytalloc.h"

#include <util/system/compiler.h>
#include <util/system/yassert.h>

#include <cstdlib>

namespace NYT::NYTAlloc {

////////////////////////////////////////////////////////////////////////////////

Y_WEAK void* Allocate(size_t size)
{
    return ::malloc(size);
}

Y_WEAK void* AllocatePageAligned(size_t size)
{
#if defined(_win_)
    return ::_aligned_malloc(size, PageSize);
#elif defined(_darwin_) || !defined(_musl_)
    return ::valloc(size);
#else
    return ::memalign(PageSize, size);
#endif
}

Y_WEAK void* AllocateSmall(size_t rank)
{
    return ::malloc(SmallRankToSize[rank]);
}

Y_WEAK void Free(void* ptr)
{
    ::free(ptr);
}

Y_WEAK void FreeNonNull(void* ptr)
{
    Y_ASSERT(ptr);
    ::free(ptr);
}

Y_WEAK size_t GetAllocationSize(const void* /*ptr*/)
{
    return 0;
}

Y_WEAK size_t GetAllocationSize(size_t size)
{
    return size;
}

////////////////////////////////////////////////////////////////////////////////

Y_WEAK void SetCurrentMemoryZone(EMemoryZone /*zone*/)
{ }

Y_WEAK EMemoryZone GetCurrentMemoryZone()
{
    return EMemoryZone::Normal;
}

Y_WEAK EMemoryZone GetAllocationMemoryZone(const void* /*ptr*/)
{
    return EMemoryZone::Normal;
}

////////////////////////////////////////////////////////////////////////////////

Y_WEAK void SetCurrentFiberId(TFiberId /*id*/)
{ }

Y_WEAK TFiberId GetCurrentFiberId()
{
    return 0;
}

////////////////////////////////////////////////////////////////////////////////

Y_WEAK void EnableLogging(TLogHandler /*logHandler*/)
{ }

////////////////////////////////////////////////////////////////////////////////

Y_WEAK void SetBacktraceProvider(TBacktraceProvider /*provider*/)
{ }

Y_WEAK void SetBacktraceFormatter(TBacktraceFormatter /*formatter*/)
{ }

////////////////////////////////////////////////////////////////////////////////

Y_WEAK void EnableStockpile()
{ }

Y_WEAK void SetStockpileInterval(TDuration /*value*/)
{ }

Y_WEAK void SetStockpileThreadCount(int /*value*/)
{ }

Y_WEAK void SetStockpileSize(size_t /*value*/)
{ }

Y_WEAK void SetLargeUnreclaimableCoeff(double /*value*/)
{ }

Y_WEAK void SetMinLargeUnreclaimableBytes(size_t /*value*/)
{ }

Y_WEAK void SetMaxLargeUnreclaimableBytes(size_t /*value*/)
{ }

Y_WEAK void SetTimingEventThreshold(TDuration /*value*/)
{ }

Y_WEAK void SetAllocationProfilingEnabled(bool /*value*/)
{ }

Y_WEAK void SetAllocationProfilingSamplingRate(double /*rate*/)
{ }

Y_WEAK void SetSmallArenaAllocationProfilingEnabled(size_t /*rank*/, bool /*value*/)
{ }

Y_WEAK void SetLargeArenaAllocationProfilingEnabled(size_t /*rank*/, bool /*value*/)
{ }

Y_WEAK void SetProfilingBacktraceDepth(int /*depth*/)
{ }

Y_WEAK void SetMinProfilingBytesUsedToReport(size_t /*size*/)
{ }

Y_WEAK void SetEnableEagerMemoryRelease(bool /*value*/)
{ }

Y_WEAK void SetEnableMadvisePopulate(bool /*value*/)
{ }

////////////////////////////////////////////////////////////////////////////////

Y_WEAK TEnumIndexedArray<ETotalCounter, ssize_t> GetTotalAllocationCounters()
{
    return {};
}

Y_WEAK TEnumIndexedArray<ESmallCounter, ssize_t> GetSmallAllocationCounters()
{
    return {};
}

Y_WEAK TEnumIndexedArray<ELargeCounter, ssize_t> GetLargeAllocationCounters()
{
    return {};
}

Y_WEAK std::array<TEnumIndexedArray<ESmallArenaCounter, ssize_t>, SmallRankCount> GetSmallArenaAllocationCounters()
{
    return {};
}

Y_WEAK std::array<TEnumIndexedArray<ELargeArenaCounter, ssize_t>, LargeRankCount> GetLargeArenaAllocationCounters()
{
    return {};
}

Y_WEAK TEnumIndexedArray<EHugeCounter, ssize_t> GetHugeAllocationCounters()
{
    return {};
}

Y_WEAK TEnumIndexedArray<ESystemCounter, ssize_t> GetSystemAllocationCounters()
{
    return {};
}

Y_WEAK TEnumIndexedArray<EUndumpableCounter, ssize_t> GetUndumpableAllocationCounters()
{
    return {};
}

Y_WEAK TEnumIndexedArray<ETimingEventType, TTimingEventCounters> GetTimingEventCounters()
{
    return {};
}

////////////////////////////////////////////////////////////////////////////////

Y_WEAK std::vector<TProfiledAllocation> GetProfiledAllocationStatistics()
{
    return {};
}

////////////////////////////////////////////////////////////////////////////////

} // namespace NYT::NYTAlloc