// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_MEMORY_DISCARDABLE_MEMORY_ALLOCATOR_H_ #define BASE_MEMORY_DISCARDABLE_MEMORY_ALLOCATOR_H_ #include <string> #include "base/base_export.h" #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" #include "base/synchronization/lock.h" #include "base/threading/thread_checker.h" namespace base { class DiscardableMemory; namespace internal { // On Android ashmem is used to implement discardable memory. It is backed by a // file (descriptor) thus is a limited resource. This allocator minimizes the // problem by allocating large ashmem regions internally and returning smaller // chunks to the client. // Allocated chunks are systematically aligned on a page boundary therefore this // allocator should not be used for small allocations. // // Threading: The allocator must be deleted on the thread it was constructed on // although its Allocate() method can be invoked on any thread. See // discardable_memory.h for DiscardableMemory's threading guarantees. class BASE_EXPORT_PRIVATE DiscardableMemoryAllocator { public: // Note that |name| is only used for debugging/measurement purposes. // |ashmem_region_size| is the size that will be used to create the underlying // ashmem regions and is expected to be greater or equal than 32 MBytes. DiscardableMemoryAllocator(const std::string& name, size_t ashmem_region_size); ~DiscardableMemoryAllocator(); // Note that the allocator must outlive the returned DiscardableMemory // instance. scoped_ptr<DiscardableMemory> Allocate(size_t size); // Returns the size of the last ashmem region which was created. This is used // for testing only. size_t last_ashmem_region_size() const; private: class AshmemRegion; class DiscardableAshmemChunk; void DeleteAshmemRegion_Locked(AshmemRegion* region); ThreadChecker thread_checker_; const std::string name_; const size_t ashmem_region_size_; mutable Lock lock_; size_t last_ashmem_region_size_; ScopedVector<AshmemRegion> ashmem_regions_; DISALLOW_COPY_AND_ASSIGN(DiscardableMemoryAllocator); }; } // namespace internal } // namespace base #endif // BASE_MEMORY_DISCARDABLE_MEMORY_ALLOCATOR_H_