Home | History | Annotate | Download | only in memory
      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