Index: base/memory/discardable_memory_mach.cc |
diff --git a/base/memory/discardable_memory_mach.cc b/base/memory/discardable_memory_mach.cc |
deleted file mode 100644 |
index d96de79121b79433cf0a0590008f46c2848d2298..0000000000000000000000000000000000000000 |
--- a/base/memory/discardable_memory_mach.cc |
+++ /dev/null |
@@ -1,152 +0,0 @@ |
-// Copyright 2014 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/memory/discardable_memory_mach.h" |
- |
-#include <mach/mach.h> |
- |
-#include "base/basictypes.h" |
-#include "base/compiler_specific.h" |
-#include "base/lazy_instance.h" |
-#include "base/logging.h" |
-#include "base/mac/mach_logging.h" |
- |
-namespace base { |
-namespace { |
- |
-// For Mach, have the DiscardableMemoryManager trigger userspace eviction when |
-// address space usage gets too high (e.g. 512 MBytes). |
-const size_t kMachMemoryLimit = 512 * 1024 * 1024; |
- |
-// internal::DiscardableMemoryManager has an explicit constructor that takes |
-// a number of memory limit parameters. The LeakyLazyInstanceTraits doesn't |
-// handle the case. Thus, we need our own class here. |
-struct DiscardableMemoryManagerLazyInstanceTraits { |
- // Leaky as discardable memory clients can use this after the exit handler |
- // has been called. |
- static const bool kRegisterOnExit = false; |
-#ifndef NDEBUG |
- static const bool kAllowedToAccessOnNonjoinableThread = true; |
-#endif |
- |
- static internal::DiscardableMemoryManager* New(void* instance) { |
- return new (instance) internal::DiscardableMemoryManager( |
- kMachMemoryLimit, kMachMemoryLimit, TimeDelta::Max()); |
- } |
- static void Delete(internal::DiscardableMemoryManager* instance) { |
- instance->~DiscardableMemoryManager(); |
- } |
-}; |
- |
-LazyInstance<internal::DiscardableMemoryManager, |
- DiscardableMemoryManagerLazyInstanceTraits> |
- g_manager = LAZY_INSTANCE_INITIALIZER; |
- |
-// The VM subsystem allows tagging of memory and 240-255 is reserved for |
-// application use (see mach/vm_statistics.h). Pick 252 (after chromium's atomic |
-// weight of ~52). |
-const int kDiscardableMemoryTag = VM_MAKE_TAG(252); |
- |
-} // namespace |
- |
-namespace internal { |
- |
-DiscardableMemoryMach::DiscardableMemoryMach(size_t bytes) |
- : memory_(0, 0), bytes_(mach_vm_round_page(bytes)), is_locked_(false) { |
- g_manager.Pointer()->Register(this, bytes); |
-} |
- |
-DiscardableMemoryMach::~DiscardableMemoryMach() { |
- if (is_locked_) |
- Unlock(); |
- g_manager.Pointer()->Unregister(this); |
-} |
- |
-bool DiscardableMemoryMach::Initialize() { |
- return Lock() != DISCARDABLE_MEMORY_LOCK_STATUS_FAILED; |
-} |
- |
-DiscardableMemoryLockStatus DiscardableMemoryMach::Lock() { |
- DCHECK(!is_locked_); |
- |
- bool purged = false; |
- if (!g_manager.Pointer()->AcquireLock(this, &purged)) |
- return DISCARDABLE_MEMORY_LOCK_STATUS_FAILED; |
- |
- is_locked_ = true; |
- return purged ? DISCARDABLE_MEMORY_LOCK_STATUS_PURGED |
- : DISCARDABLE_MEMORY_LOCK_STATUS_SUCCESS; |
-} |
- |
-void DiscardableMemoryMach::Unlock() { |
- DCHECK(is_locked_); |
- g_manager.Pointer()->ReleaseLock(this); |
- is_locked_ = false; |
-} |
- |
-void* DiscardableMemoryMach::Memory() const { |
- DCHECK(is_locked_); |
- return reinterpret_cast<void*>(memory_.address()); |
-} |
- |
-bool DiscardableMemoryMach::AllocateAndAcquireLock() { |
- kern_return_t ret; |
- bool persistent; |
- if (!memory_.size()) { |
- vm_address_t address = 0; |
- ret = vm_allocate( |
- mach_task_self(), |
- &address, |
- bytes_, |
- VM_FLAGS_ANYWHERE | VM_FLAGS_PURGABLE | kDiscardableMemoryTag); |
- MACH_CHECK(ret == KERN_SUCCESS, ret) << "vm_allocate"; |
- memory_.reset(address, bytes_); |
- |
- // When making a fresh allocation, it's impossible for |persistent| to |
- // be true. |
- persistent = false; |
- } else { |
- // |persistent| will be reset to false below if appropriate, but when |
- // reusing an existing allocation, it's possible for it to be true. |
- persistent = true; |
- |
-#if !defined(NDEBUG) |
- ret = vm_protect(mach_task_self(), |
- memory_.address(), |
- memory_.size(), |
- FALSE, |
- VM_PROT_DEFAULT); |
- MACH_DCHECK(ret == KERN_SUCCESS, ret) << "vm_protect"; |
-#endif |
- } |
- |
- int state = VM_PURGABLE_NONVOLATILE; |
- ret = vm_purgable_control( |
- mach_task_self(), memory_.address(), VM_PURGABLE_SET_STATE, &state); |
- MACH_CHECK(ret == KERN_SUCCESS, ret) << "vm_purgable_control"; |
- if (state & VM_PURGABLE_EMPTY) |
- persistent = false; |
- |
- return persistent; |
-} |
- |
-void DiscardableMemoryMach::ReleaseLock() { |
- int state = VM_PURGABLE_VOLATILE | VM_VOLATILE_GROUP_DEFAULT; |
- kern_return_t ret = vm_purgable_control( |
- mach_task_self(), memory_.address(), VM_PURGABLE_SET_STATE, &state); |
- MACH_CHECK(ret == KERN_SUCCESS, ret) << "vm_purgable_control"; |
- |
-#if !defined(NDEBUG) |
- ret = vm_protect( |
- mach_task_self(), memory_.address(), memory_.size(), FALSE, VM_PROT_NONE); |
- MACH_DCHECK(ret == KERN_SUCCESS, ret) << "vm_protect"; |
-#endif |
-} |
- |
-void DiscardableMemoryMach::Purge() { |
- memory_.reset(); |
-} |
- |
-} // namespace internal |
-} // namespace base |