1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/memory/discardable_memory_ashmem.h" 6 7 #include "base/memory/discardable_memory_ashmem_allocator.h" 8 9 namespace base { 10 namespace internal { 11 12 DiscardableMemoryAshmem::DiscardableMemoryAshmem( 13 size_t bytes, 14 DiscardableMemoryAshmemAllocator* allocator, 15 DiscardableMemoryManager* manager) 16 : bytes_(bytes), 17 allocator_(allocator), 18 manager_(manager), 19 is_locked_(false) { 20 manager_->Register(this, bytes_); 21 } 22 23 DiscardableMemoryAshmem::~DiscardableMemoryAshmem() { 24 if (is_locked_) 25 Unlock(); 26 27 manager_->Unregister(this); 28 } 29 30 bool DiscardableMemoryAshmem::Initialize() { 31 return Lock() != DISCARDABLE_MEMORY_LOCK_STATUS_FAILED; 32 } 33 34 DiscardableMemoryLockStatus DiscardableMemoryAshmem::Lock() { 35 DCHECK(!is_locked_); 36 37 bool purged = false; 38 if (!manager_->AcquireLock(this, &purged)) 39 return DISCARDABLE_MEMORY_LOCK_STATUS_FAILED; 40 41 is_locked_ = true; 42 return purged ? DISCARDABLE_MEMORY_LOCK_STATUS_PURGED 43 : DISCARDABLE_MEMORY_LOCK_STATUS_SUCCESS; 44 } 45 46 void DiscardableMemoryAshmem::Unlock() { 47 DCHECK(is_locked_); 48 manager_->ReleaseLock(this); 49 is_locked_ = false; 50 } 51 52 void* DiscardableMemoryAshmem::Memory() const { 53 DCHECK(is_locked_); 54 DCHECK(ashmem_chunk_); 55 return ashmem_chunk_->Memory(); 56 } 57 58 bool DiscardableMemoryAshmem::AllocateAndAcquireLock() { 59 if (ashmem_chunk_) 60 return ashmem_chunk_->Lock(); 61 62 ashmem_chunk_ = allocator_->Allocate(bytes_); 63 return false; 64 } 65 66 void DiscardableMemoryAshmem::ReleaseLock() { 67 ashmem_chunk_->Unlock(); 68 } 69 70 void DiscardableMemoryAshmem::Purge() { 71 ashmem_chunk_.reset(); 72 } 73 74 } // namespace internal 75 } // namespace base 76