|  | // Copyright (c) 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_H_ | 
|  | #define BASE_MEMORY_DISCARDABLE_MEMORY_H_ | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "base/compiler_specific.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | namespace trace_event { | 
|  | class MemoryAllocatorDump; | 
|  | class ProcessMemoryDump; | 
|  | } | 
|  |  | 
|  | // Discardable memory is used to cache large objects without worrying about | 
|  | // blowing out memory, both on mobile devices where there is no swap, and | 
|  | // desktop devices where unused free memory should be used to help the user | 
|  | // experience. This is preferable to releasing memory in response to an OOM | 
|  | // signal because it is simpler and provides system-wide management of | 
|  | // purgable memory, though it has less flexibility as to which objects get | 
|  | // discarded. | 
|  | // | 
|  | // Discardable memory has two states: locked and unlocked. While the memory is | 
|  | // locked, it will not be discarded. Unlocking the memory allows the | 
|  | // discardable memory system and the OS to reclaim it if needed. Locks do not | 
|  | // nest. | 
|  | // | 
|  | // Notes: | 
|  | //   - The paging behavior of memory while it is locked is not specified. While | 
|  | //     mobile platforms will not swap it out, it may qualify for swapping | 
|  | //     on desktop platforms. It is not expected that this will matter, as the | 
|  | //     preferred pattern of usage for DiscardableMemory is to lock down the | 
|  | //     memory, use it as quickly as possible, and then unlock it. | 
|  | //   - Because of memory alignment, the amount of memory allocated can be | 
|  | //     larger than the requested memory size. It is not very efficient for | 
|  | //     small allocations. | 
|  | //   - A discardable memory instance is not thread safe. It is the | 
|  | //     responsibility of users of discardable memory to ensure there are no | 
|  | //     races. | 
|  | // | 
|  | class BASE_EXPORT DiscardableMemory { | 
|  | public: | 
|  | DiscardableMemory(); | 
|  | virtual ~DiscardableMemory(); | 
|  |  | 
|  | // Locks the memory so that it will not be purged by the system. Returns | 
|  | // true on success. If the return value is false then this object should be | 
|  | // discarded and a new one should be created. | 
|  | virtual bool Lock() WARN_UNUSED_RESULT = 0; | 
|  |  | 
|  | // Unlocks the memory so that it can be purged by the system. Must be called | 
|  | // after every successful lock call. | 
|  | virtual void Unlock() = 0; | 
|  |  | 
|  | // Returns the memory address held by this object. The object must be locked | 
|  | // before calling this. | 
|  | virtual void* data() const = 0; | 
|  |  | 
|  | // Handy method to simplify calling data() with a reinterpret_cast. | 
|  | template<typename T> T* data_as() const { | 
|  | return reinterpret_cast<T*>(data()); | 
|  | } | 
|  |  | 
|  | // Used for dumping the statistics of discardable memory allocated in tracing. | 
|  | // Returns a new MemoryAllocatorDump in the |pmd| with the size of the | 
|  | // discardable memory. The MemoryAllocatorDump created is owned by |pmd|. See | 
|  | // ProcessMemoryDump::CreateAllocatorDump. | 
|  | virtual trace_event::MemoryAllocatorDump* CreateMemoryAllocatorDump( | 
|  | const char* name, | 
|  | trace_event::ProcessMemoryDump* pmd) const = 0; | 
|  | }; | 
|  |  | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_MEMORY_DISCARDABLE_MEMORY_H_ |