1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "base/process/memory.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include "partition_alloc/partition_alloc_buildflags.h" 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_ALLOCATOR_SHIM) 10*6777b538SAndroid Build Coastguard Worker #include "partition_alloc/shim/allocator_shim.h" 11*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(USE_ALLOCATOR_SHIM) 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker #include <windows.h> // Must be in front of other Windows header files. 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker #include <new.h> 16*6777b538SAndroid Build Coastguard Worker #include <psapi.h> 17*6777b538SAndroid Build Coastguard Worker #include <stddef.h> 18*6777b538SAndroid Build Coastguard Worker #include <stdlib.h> 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker namespace base { 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker namespace { 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker // Return a non-0 value to retry the allocation. ReleaseReservationOrTerminate(size_t size)25*6777b538SAndroid Build Coastguard Workerint ReleaseReservationOrTerminate(size_t size) { 26*6777b538SAndroid Build Coastguard Worker constexpr int kRetryAllocation = 1; 27*6777b538SAndroid Build Coastguard Worker if (internal::ReleaseAddressSpaceReservation()) 28*6777b538SAndroid Build Coastguard Worker return kRetryAllocation; 29*6777b538SAndroid Build Coastguard Worker TerminateBecauseOutOfMemory(size); 30*6777b538SAndroid Build Coastguard Worker return 0; 31*6777b538SAndroid Build Coastguard Worker } 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker } // namespace 34*6777b538SAndroid Build Coastguard Worker EnableTerminationOnHeapCorruption()35*6777b538SAndroid Build Coastguard Workervoid EnableTerminationOnHeapCorruption() { 36*6777b538SAndroid Build Coastguard Worker // Ignore the result code. Supported on XP SP3 and Vista. 37*6777b538SAndroid Build Coastguard Worker HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0); 38*6777b538SAndroid Build Coastguard Worker } 39*6777b538SAndroid Build Coastguard Worker EnableTerminationOnOutOfMemory()40*6777b538SAndroid Build Coastguard Workervoid EnableTerminationOnOutOfMemory() { 41*6777b538SAndroid Build Coastguard Worker constexpr int kCallNewHandlerOnAllocationFailure = 1; 42*6777b538SAndroid Build Coastguard Worker _set_new_handler(&ReleaseReservationOrTerminate); 43*6777b538SAndroid Build Coastguard Worker _set_new_mode(kCallNewHandlerOnAllocationFailure); 44*6777b538SAndroid Build Coastguard Worker } 45*6777b538SAndroid Build Coastguard Worker UncheckedMalloc(size_t size,void ** result)46*6777b538SAndroid Build Coastguard Workerbool UncheckedMalloc(size_t size, void** result) { 47*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_ALLOCATOR_SHIM) 48*6777b538SAndroid Build Coastguard Worker *result = allocator_shim::UncheckedAlloc(size); 49*6777b538SAndroid Build Coastguard Worker #else 50*6777b538SAndroid Build Coastguard Worker // malloc_unchecked is required to implement UncheckedMalloc properly. 51*6777b538SAndroid Build Coastguard Worker // It's provided by allocator_shim_win.cc but since that's not always present, 52*6777b538SAndroid Build Coastguard Worker // In the case, use regular malloc instead. 53*6777b538SAndroid Build Coastguard Worker *result = malloc(size); 54*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(USE_ALLOCATOR_SHIM) 55*6777b538SAndroid Build Coastguard Worker return *result != NULL; 56*6777b538SAndroid Build Coastguard Worker } 57*6777b538SAndroid Build Coastguard Worker UncheckedFree(void * ptr)58*6777b538SAndroid Build Coastguard Workervoid UncheckedFree(void* ptr) { 59*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_ALLOCATOR_SHIM) 60*6777b538SAndroid Build Coastguard Worker allocator_shim::UncheckedFree(ptr); 61*6777b538SAndroid Build Coastguard Worker #else 62*6777b538SAndroid Build Coastguard Worker free(ptr); 63*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(USE_ALLOCATOR_SHIM) 64*6777b538SAndroid Build Coastguard Worker } 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker } // namespace base 67