summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
authoravi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-18 16:39:45 +0000
committeravi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-18 16:39:45 +0000
commit21fcf83c508704a5bd11ed0467fc20b5e03f3acc (patch)
treea6935efc80b36322388f50d530f5e3b2e4d2e3e1 /base
parentb5c4a9f98c001b01ab41c01c80871247255a2655 (diff)
downloadchromium_src-21fcf83c508704a5bd11ed0467fc20b5e03f3acc.zip
chromium_src-21fcf83c508704a5bd11ed0467fc20b5e03f3acc.tar.gz
chromium_src-21fcf83c508704a5bd11ed0467fc20b5e03f3acc.tar.bz2
Update OOM killer.
BUG=74589 TEST=unit tested Review URL: http://codereview.chromium.org/6711017 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@78702 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base')
-rw-r--r--base/process_util_mac.mm57
1 files changed, 42 insertions, 15 deletions
diff --git a/base/process_util_mac.mm b/base/process_util_mac.mm
index 39eabac..e2df2ca 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");