| // Copyright (c) 2018 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/allocator/partition_allocator/partition_root_base.h" |
| |
| #include "base/allocator/partition_allocator/oom.h" |
| #include "base/allocator/partition_allocator/partition_oom.h" |
| #include "base/allocator/partition_allocator/partition_page.h" |
| #include "build/build_config.h" |
| |
| namespace base { |
| namespace internal { |
| |
| NOINLINE void PartitionRootBase::OutOfMemory() { |
| #if !defined(ARCH_CPU_64_BITS) |
| // Check whether this OOM is due to a lot of super pages that are allocated |
| // but not committed, probably due to http://crbug.com/421387. |
| if (total_size_of_super_pages + total_size_of_direct_mapped_pages - |
| total_size_of_committed_pages > |
| kReasonableSizeOfUnusedPages) { |
| PartitionOutOfMemoryWithLotsOfUncommitedPages(); |
| } |
| #endif |
| if (PartitionRootBase::gOomHandlingFunction) |
| (*PartitionRootBase::gOomHandlingFunction)(); |
| OOM_CRASH(); |
| } |
| |
| void PartitionRootBase::DecommitEmptyPages() { |
| for (size_t i = 0; i < kMaxFreeableSpans; ++i) { |
| internal::PartitionPage* page = global_empty_page_ring[i]; |
| if (page) |
| page->DecommitIfPossible(this); |
| global_empty_page_ring[i] = nullptr; |
| } |
| } |
| |
| } // namespace internal |
| } // namespace base |