| Index: base/memory/discardable_memory_mac.cc
|
| diff --git a/base/memory/discardable_memory_mac.cc b/base/memory/discardable_memory_mac.cc
|
| index d8c0ada7e2405c4c5adb7ce2f9bdcde2c6c2ce87..b2982fc5d236a8b0aadb91b909d8e2c54160cb64 100644
|
| --- a/base/memory/discardable_memory_mac.cc
|
| +++ b/base/memory/discardable_memory_mac.cc
|
| @@ -47,7 +47,7 @@ class DiscardableMemoryMac
|
| g_shared_state.Pointer()->manager.Register(this, bytes);
|
| }
|
|
|
| - bool Initialize() { return Lock() == DISCARDABLE_MEMORY_LOCK_STATUS_PURGED; }
|
| + bool Initialize() { return Lock() != DISCARDABLE_MEMORY_LOCK_STATUS_FAILED; }
|
|
|
| virtual ~DiscardableMemoryMac() {
|
| if (is_locked_)
|
| @@ -81,8 +81,8 @@ class DiscardableMemoryMac
|
|
|
| // Overridden from internal::DiscardableMemoryManagerAllocation:
|
| virtual bool AllocateAndAcquireLock() OVERRIDE {
|
| - bool persistent = true;
|
| kern_return_t ret;
|
| + bool persistent;
|
| if (!memory_.size()) {
|
| vm_address_t address = 0;
|
| ret = vm_allocate(
|
| @@ -92,17 +92,24 @@ class DiscardableMemoryMac
|
| 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";
|
| + 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(),
|
| @@ -112,6 +119,7 @@ class DiscardableMemoryMac
|
| MACH_CHECK(ret == KERN_SUCCESS, ret) << "vm_purgable_control";
|
| if (state & VM_PURGABLE_EMPTY)
|
| persistent = false;
|
| +
|
| return persistent;
|
| }
|
|
|
|
|