Index: base/process/memory_mac.mm |
diff --git a/base/process/memory_mac.mm b/base/process/memory_mac.mm |
index 155004dc0a43e257a4918d79b9e9b7aca4a96182..4b5a3ce9c8cb60834b8ab52ab594fa4585481585 100644 |
--- a/base/process/memory_mac.mm |
+++ b/base/process/memory_mac.mm |
@@ -5,10 +5,18 @@ |
#include "base/process/memory.h" |
#include "base/allocator/allocator_interception_mac.h" |
+#include "base/allocator/allocator_shim.h" |
+#include "base/allocator/features.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"; |
@@ -24,6 +32,17 @@ bool UncheckedCalloc(size_t num_items, size_t size, void** 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_EXPERIMENTAL_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(); |
} |