|  | // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "base/process/memory.h" | 
|  |  | 
|  | #include "base/allocator/allocator_interception_mac.h" | 
|  | #include "base/allocator/allocator_shim.h" | 
|  | #include "base/allocator/buildflags.h" | 
|  | #include "build/build_config.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | namespace { | 
|  | void oom_killer_new() { | 
|  | TerminateBecauseOutOfMemory(0); | 
|  | } | 
|  | }  // namespace | 
|  |  | 
|  | void EnableTerminationOnHeapCorruption() { | 
|  | #if !ARCH_CPU_64_BITS | 
|  | DLOG(WARNING) << "EnableTerminationOnHeapCorruption only works on 64-bit"; | 
|  | #endif | 
|  | } | 
|  |  | 
|  | bool UncheckedMalloc(size_t size, void** result) { | 
|  | return allocator::UncheckedMallocMac(size, result); | 
|  | } | 
|  |  | 
|  | bool UncheckedCalloc(size_t num_items, size_t size, void** result) { | 
|  | return allocator::UncheckedCallocMac(num_items, size, result); | 
|  | } | 
|  |  | 
|  | void EnableTerminationOnOutOfMemory() { | 
|  | // Step 1: Enable OOM killer on C++ failures. | 
|  | std::set_new_handler(oom_killer_new); | 
|  |  | 
|  | // Step 2: Enable OOM killer on C-malloc failures for the default zone (if we | 
|  | // have a shim). | 
|  | #if BUILDFLAG(USE_ALLOCATOR_SHIM) | 
|  | allocator::SetCallNewHandlerOnMallocFailure(true); | 
|  | #endif | 
|  |  | 
|  | // Step 3: Enable OOM killer on all other malloc zones (or just "all" without | 
|  | // "other" if shim is disabled). | 
|  | allocator::InterceptAllocationsMac(); | 
|  | } | 
|  |  | 
|  | }  // namespace base |