#include "base/process/memory.h"
#include <windows.h>
#include <new.h>
#include <psapi.h>
#include <stddef.h>
#include <stdlib.h>
#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wglobal-constructors"
#endif
typedef void* (*MallocFn)(size_t);
extern "C" void* (*const malloc_unchecked)(size_t);
extern "C" void* (*const malloc_default)(size_t) = &malloc;
#if defined(__clang__)
#pragma clang diagnostic pop
#endif
#if defined(_M_IX86)
#pragma comment(linker, "/alternatename:_malloc_unchecked=_malloc_default")
#elif defined(_M_X64) || defined(_M_ARM) || defined(_M_ARM64)
#pragma comment(linker, "/alternatename:malloc_unchecked=malloc_default")
#else
#error Unsupported platform
#endif
namespace base {
namespace {
int ReleaseReservationOrTerminate(size_t size) {
constexpr int kRetryAllocation = 1;
if (internal::ReleaseAddressSpaceReservation())
return kRetryAllocation;
TerminateBecauseOutOfMemory(size);
return 0;
}
}
void EnableTerminationOnHeapCorruption() {
HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
}
void EnableTerminationOnOutOfMemory() {
constexpr int kCallNewHandlerOnAllocationFailure = 1;
_set_new_handler(&ReleaseReservationOrTerminate);
_set_new_mode(kCallNewHandlerOnAllocationFailure);
}
bool UncheckedMalloc(size_t size, void** result) {
*result = malloc_unchecked(size);
return *result != NULL;
}
void UncheckedFree(void* ptr) {
free(ptr);
}
}