diff options
author | avi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-18 16:39:45 +0000 |
---|---|---|
committer | avi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-18 16:39:45 +0000 |
commit | 21fcf83c508704a5bd11ed0467fc20b5e03f3acc (patch) | |
tree | a6935efc80b36322388f50d530f5e3b2e4d2e3e1 /base | |
parent | b5c4a9f98c001b01ab41c01c80871247255a2655 (diff) | |
download | chromium_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.mm | 57 |
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"); |