Chromium Code Reviews| Index: base/memory/discardable_memory.h |
| diff --git a/base/memory/discardable_memory.h b/base/memory/discardable_memory.h |
| index d6e91b979d5a46fdd50e6ef07ab4f52a904bc042..95abb22511a9057db71d45be422d96249be901fb 100644 |
| --- a/base/memory/discardable_memory.h |
| +++ b/base/memory/discardable_memory.h |
| @@ -17,6 +17,35 @@ enum LockDiscardableMemoryStatus { |
| DISCARDABLE_MEMORY_SUCCESS = 1 |
| }; |
| +#if defined(OS_MACOSX) || defined(OS_ANDROID) |
| +#define DISCARDABLE_MEMORY_SUPPORTED_NATIVELY |
| +#endif |
| + |
| +class DiscardableMemory; |
| + |
| +class BASE_EXPORT DiscardableMemoryProvider { |
| + public: |
| + // Returns the instance set via SetInstance, if one exists. Otherwise, it |
| + // will attempt to create an instance via CreateInstance(). It is possible |
|
Avi (use Gerrit)
2013/06/07 14:46:53
What is CreateInstance()?
|
| + // that this can return NULL. |
|
Avi (use Gerrit)
2013/06/07 14:46:53
"Can" return NULL is not helpful. In what scenario
|
| + static DiscardableMemoryProvider* GetInstance(); |
| + |
| +#if !defined(DISCARDABLE_MEMORY_SUPPORTED_NATIVELY) |
| + // The caller retains ownership of the factory. |
| + static void SetInstance(DiscardableMemoryProvider* provider); |
| +#endif |
| + |
| + virtual DiscardableMemory* CreateDiscardableMemory() = 0; |
| + |
| + // Check whether a purge of all discardable memory in the system is supported. |
| + // Use only for testing! |
| + virtual bool PurgeForTestingSupported() const = 0; |
| + |
| + // Purge all discardable memory in the system. This call has global effects |
| + // across all running processes, so it should only be used for testing! |
| + virtual void PurgeForTesting() = 0; |
| +}; |
| + |
| // Platform abstraction for discardable memory. DiscardableMemory 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 |
| @@ -45,20 +74,15 @@ enum LockDiscardableMemoryStatus { |
| // http://www.opensource.apple.com/source/xnu/xnu-792.13.8/osfmk/vm/vm_object.c |
| class BASE_EXPORT DiscardableMemory { |
| public: |
| - DiscardableMemory(); |
| - |
| // If the discardable memory is locked, the destructor will unlock it. |
| // The opened file will also be closed after this. |
| - ~DiscardableMemory(); |
| - |
| - // Check whether the system supports discardable memory. |
| - static bool Supported(); |
| + virtual ~DiscardableMemory(); |
| // Initialize the DiscardableMemory object. On success, this function returns |
| // true and the memory is locked. This should only be called once. |
| // This call could fail because of platform-specific limitations and the user |
| // should stop using the DiscardableMemory afterwards. |
| - bool InitializeAndLock(size_t size); |
| + virtual bool InitializeAndLock(size_t size) = 0; |
| // Lock the memory so that it will not be purged by the system. Returns |
| // DISCARDABLE_MEMORY_SUCCESS on success. If the return value is |
| @@ -66,51 +90,15 @@ class BASE_EXPORT DiscardableMemory { |
| // a new one should be created. If the return value is |
| // DISCARDABLE_MEMORY_PURGED then the memory is present but any data that |
| // was in it is gone. |
| - LockDiscardableMemoryStatus Lock() WARN_UNUSED_RESULT; |
| + virtual LockDiscardableMemoryStatus Lock() WARN_UNUSED_RESULT = 0; |
| // Unlock the memory so that it can be purged by the system. Must be called |
| // after every successful lock call. |
| - void Unlock(); |
| + virtual void Unlock() = 0; |
| // Return the memory address held by this object. The object must be locked |
| // before calling this. Otherwise, this will cause a DCHECK error. |
| - void* Memory() const; |
| - |
| - // Testing utility calls. |
| - |
| - // Check whether a purge of all discardable memory in the system is supported. |
| - // Use only for testing! |
| - static bool PurgeForTestingSupported(); |
| - |
| - // Purge all discardable memory in the system. This call has global effects |
| - // across all running processes, so it should only be used for testing! |
| - static void PurgeForTesting(); |
| - |
| - private: |
| -#if defined(OS_ANDROID) |
| - // Maps the discardable memory into the caller's address space. |
| - // Returns true on success, false otherwise. |
| - bool Map(); |
| - |
| - // Unmaps the discardable memory from the caller's address space. |
| - void Unmap(); |
| - |
| - // Reserve a file descriptor. When reaching the fd limit, this call returns |
| - // false and initialization should fail. |
| - bool ReserveFileDescriptor(); |
| - |
| - // Release a file descriptor so that others can reserve it. |
| - void ReleaseFileDescriptor(); |
| -#endif // OS_ANDROID |
| - |
| - void* memory_; |
| - size_t size_; |
| - bool is_locked_; |
| -#if defined(OS_ANDROID) |
| - int fd_; |
| -#endif // OS_ANDROID |
| - |
| - DISALLOW_COPY_AND_ASSIGN(DiscardableMemory); |
| + virtual void* Memory() const = 0; |
| }; |
| } // namespace base |