#include "DebugHeap.h"
#include "Algorithm.h"
#include "BAssert.h"
#include "BPlatform.h"
#include "VMAllocate.h"
#include <cstdlib>
#include <thread>
namespace bmalloc {
#if BOS(DARWIN)
DebugHeap::DebugHeap(std::lock_guard<Mutex>&)
: m_zone(malloc_create_zone(0, 0))
, m_pageSize(vmPageSize())
{
malloc_set_zone_name(m_zone, "WebKit Using System Malloc");
}
void* DebugHeap::malloc(size_t size)
{
void* result = malloc_zone_malloc(m_zone, size);
if (!result)
BCRASH();
return result;
}
void* DebugHeap::memalign(size_t alignment, size_t size, bool crashOnFailure)
{
void* result = malloc_zone_memalign(m_zone, alignment, size);
if (!result && crashOnFailure)
BCRASH();
return result;
}
void* DebugHeap::realloc(void* object, size_t size)
{
void* result = malloc_zone_realloc(m_zone, object, size);
if (!result)
BCRASH();
return result;
}
void DebugHeap::free(void* object)
{
malloc_zone_free(m_zone, object);
}
#else
DebugHeap::DebugHeap(std::lock_guard<Mutex>&)
{
}
void* DebugHeap::malloc(size_t size)
{
void* result = ::malloc(size);
if (!result)
BCRASH();
return result;
}
void* DebugHeap::memalign(size_t alignment, size_t size, bool crashOnFailure)
{
void* result;
if (posix_memalign(&result, alignment, size)) {
if (crashOnFailure)
BCRASH();
return nullptr;
}
return result;
}
void* DebugHeap::realloc(void* object, size_t size)
{
void* result = ::realloc(object, size);
if (!result)
BCRASH();
return result;
}
void DebugHeap::free(void* object)
{
::free(object);
}
#endif
void* DebugHeap::memalignLarge(size_t alignment, size_t size)
{
alignment = roundUpToMultipleOf(m_pageSize, alignment);
size = roundUpToMultipleOf(m_pageSize, size);
void* result = tryVMAllocate(alignment, size);
if (!result)
return nullptr;
{
std::lock_guard<std::mutex> locker(m_lock);
m_sizeMap[result] = size;
}
return result;
}
void DebugHeap::freeLarge(void* base)
{
if (!base)
return;
size_t size;
{
std::lock_guard<std::mutex> locker(m_lock);
size = m_sizeMap[base];
size_t numErased = m_sizeMap.erase(base);
RELEASE_BASSERT(numErased == 1);
}
vmDeallocate(base, size);
}
}