Chromium Code Reviews| 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..600bda7b4910c1a0bcd13407e97257749ae519d1 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; } |
|
reveman
2014/05/12 20:57:44
Can this ever return _SUCCESS? If you're intereste
Mark Mentovai
2014/05/12 21:35:49
reveman wrote:
|
| virtual ~DiscardableMemoryMac() { |
| if (is_locked_) |
| @@ -81,8 +81,10 @@ class DiscardableMemoryMac |
| // Overridden from internal::DiscardableMemoryManagerAllocation: |
| virtual bool AllocateAndAcquireLock() OVERRIDE { |
| - bool persistent = true; |
| + DCHECK(!is_locked_); |
| + |
| kern_return_t ret; |
| + bool persistent; |
| if (!memory_.size()) { |
| vm_address_t address = 0; |
| ret = vm_allocate( |
| @@ -92,17 +94,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,10 +121,13 @@ class DiscardableMemoryMac |
| MACH_CHECK(ret == KERN_SUCCESS, ret) << "vm_purgable_control"; |
| if (state & VM_PURGABLE_EMPTY) |
| persistent = false; |
| + |
| return persistent; |
| } |
| virtual void ReleaseLock() OVERRIDE { |
| + DCHECK(is_locked_); |
| + |
| int state = VM_PURGABLE_VOLATILE | VM_VOLATILE_GROUP_DEFAULT; |
| kern_return_t ret = vm_purgable_control(mach_task_self(), |
| memory_.address(), |
| @@ -134,6 +146,7 @@ class DiscardableMemoryMac |
| } |
| virtual void Purge() OVERRIDE { |
| + DCHECK(!is_locked_); |
|
reveman
2014/05/12 20:57:44
There's a race here as this can be called on any t
Mark Mentovai
2014/05/12 21:35:49
reveman wrote:
|
| memory_.reset(); |
| } |