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