discardable_memory_ashmem.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved.
25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be
35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file.
45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/memory/discardable_memory_ashmem.h"
65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/memory/discardable_memory_ashmem_allocator.h"
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace base {
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace internal {
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuDiscardableMemoryAshmem::DiscardableMemoryAshmem(
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    size_t bytes,
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    DiscardableMemoryAshmemAllocator* allocator,
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    DiscardableMemoryManager* manager)
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    : bytes_(bytes),
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      allocator_(allocator),
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      manager_(manager),
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      is_locked_(false) {
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  manager_->Register(this, bytes_);
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuDiscardableMemoryAshmem::~DiscardableMemoryAshmem() {
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (is_locked_)
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    manager_->ReleaseLock(this);
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  manager_->Unregister(this);
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool DiscardableMemoryAshmem::Initialize() {
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Lock() == DISCARDABLE_MEMORY_LOCK_STATUS_PURGED;
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuDiscardableMemoryLockStatus DiscardableMemoryAshmem::Lock() {
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool purged = false;
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!manager_->AcquireLock(this, &purged))
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return DISCARDABLE_MEMORY_LOCK_STATUS_FAILED;
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return purged ? DISCARDABLE_MEMORY_LOCK_STATUS_PURGED
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                : DISCARDABLE_MEMORY_LOCK_STATUS_SUCCESS;
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DiscardableMemoryAshmem::Unlock() {
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  manager_->ReleaseLock(this);
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid* DiscardableMemoryAshmem::Memory() const {
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK(ashmem_chunk_);
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return ashmem_chunk_->Memory();
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool DiscardableMemoryAshmem::AllocateAndAcquireLock() {
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK(!is_locked_);
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  is_locked_ = true;
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (ashmem_chunk_)
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return ashmem_chunk_->Lock();
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ashmem_chunk_ = allocator_->Allocate(bytes_);
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return false;
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DiscardableMemoryAshmem::ReleaseLock() {
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK(is_locked_);
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ashmem_chunk_->Unlock();
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  is_locked_ = false;
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DiscardableMemoryAshmem::Purge() {
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK(!is_locked_);
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ashmem_chunk_.reset();
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace internal
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace base
76