Index: base/process_util_mac.mm |
diff --git a/base/process_util_mac.mm b/base/process_util_mac.mm |
index 39eabac079097a0ca2434f05d57846a7fdee41dc..e2df2ca43e52f8f2046b1311bed34e7e6713fbbf 100644 |
--- a/base/process_util_mac.mm |
+++ b/base/process_util_mac.mm |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2008 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2011 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. |
@@ -622,7 +622,33 @@ void oom_killer_new() { |
// === Core Foundation CFAllocators === |
-typedef ChromeCFAllocator* ChromeCFAllocatorRef; |
+bool CanGetContextForCFAllocator(long darwin_version) { |
+ // TODO(avi): remove at final release; http://crbug.com/74589 |
+ if (darwin_version == 11) { |
+ NSLog(@"Unsure about the internals of CFAllocator but going to patch them " |
+ "anyway. Watch out for crashes inside of CFAllocatorAllocate."); |
+ } |
+ return darwin_version == 9 || |
+ darwin_version == 10 || |
+ darwin_version == 11; |
+} |
+ |
+CFAllocatorContext* ContextForCFAllocator(CFAllocatorRef allocator, |
+ long darwin_version) { |
+ if (darwin_version == 9 || darwin_version == 10) { |
+ ChromeCFAllocator9and10* our_allocator = |
+ const_cast<ChromeCFAllocator9and10*>( |
+ reinterpret_cast<const ChromeCFAllocator9and10*>(allocator)); |
+ return &our_allocator->_context; |
+ } else if (darwin_version == 11) { |
+ ChromeCFAllocator11* our_allocator = |
+ const_cast<ChromeCFAllocator11*>( |
+ reinterpret_cast<const ChromeCFAllocator11*>(allocator)); |
+ return &our_allocator->_context; |
+ } else { |
+ return NULL; |
+ } |
+} |
CFAllocatorAllocateCallBack g_old_cfallocator_system_default; |
CFAllocatorAllocateCallBack g_old_cfallocator_malloc; |
@@ -833,29 +859,30 @@ void EnableTerminationOnOutOfMemory() { |
<< "Old allocators unexpectedly non-null"; |
bool cf_allocator_internals_known = |
- darwin_version == 9 || darwin_version == 10; |
+ CanGetContextForCFAllocator(darwin_version); |
if (cf_allocator_internals_known) { |
- ChromeCFAllocatorRef allocator = const_cast<ChromeCFAllocatorRef>( |
- reinterpret_cast<const ChromeCFAllocator*>(kCFAllocatorSystemDefault)); |
- g_old_cfallocator_system_default = allocator->_context.allocate; |
+ CFAllocatorContext* context = |
+ ContextForCFAllocator(kCFAllocatorSystemDefault, darwin_version); |
+ CHECK(context) << "Failed to get context for kCFAllocatorSystemDefault."; |
+ g_old_cfallocator_system_default = context->allocate; |
CHECK(g_old_cfallocator_system_default) |
<< "Failed to get kCFAllocatorSystemDefault allocation function."; |
- allocator->_context.allocate = oom_killer_cfallocator_system_default; |
+ context->allocate = oom_killer_cfallocator_system_default; |
- allocator = const_cast<ChromeCFAllocatorRef>( |
- reinterpret_cast<const ChromeCFAllocator*>(kCFAllocatorMalloc)); |
- g_old_cfallocator_malloc = allocator->_context.allocate; |
+ context = ContextForCFAllocator(kCFAllocatorMalloc, darwin_version); |
+ CHECK(context) << "Failed to get context for kCFAllocatorMalloc."; |
+ g_old_cfallocator_malloc = context->allocate; |
CHECK(g_old_cfallocator_malloc) |
<< "Failed to get kCFAllocatorMalloc allocation function."; |
- allocator->_context.allocate = oom_killer_cfallocator_malloc; |
+ context->allocate = oom_killer_cfallocator_malloc; |
- allocator = const_cast<ChromeCFAllocatorRef>( |
- reinterpret_cast<const ChromeCFAllocator*>(kCFAllocatorMallocZone)); |
- g_old_cfallocator_malloc_zone = allocator->_context.allocate; |
+ context = ContextForCFAllocator(kCFAllocatorMallocZone, darwin_version); |
+ CHECK(context) << "Failed to get context for kCFAllocatorMallocZone."; |
+ g_old_cfallocator_malloc_zone = context->allocate; |
CHECK(g_old_cfallocator_malloc_zone) |
<< "Failed to get kCFAllocatorMallocZone allocation function."; |
- allocator->_context.allocate = oom_killer_cfallocator_malloc_zone; |
+ context->allocate = oom_killer_cfallocator_malloc_zone; |
} else { |
NSLog(@"Internals of CFAllocator not known; out-of-memory failures via " |
"CFAllocator will not result in termination. http://crbug.com/45650"); |