Index: base/memory/discardable_memory.h |
diff --git a/base/memory/discardable_memory.h b/base/memory/discardable_memory.h |
index d6e91b979d5a46fdd50e6ef07ab4f52a904bc042..f50caf8947b5d8fffc7e18bec7c71bc235420616 100644 |
--- a/base/memory/discardable_memory.h |
+++ b/base/memory/discardable_memory.h |
@@ -8,6 +8,7 @@ |
#include "base/base_export.h" |
#include "base/basictypes.h" |
#include "base/compiler_specific.h" |
+#include "base/threading/non_thread_safe.h" |
namespace base { |
@@ -17,6 +18,12 @@ enum LockDiscardableMemoryStatus { |
DISCARDABLE_MEMORY_SUCCESS = 1 |
}; |
+#if defined(OS_MACOSX) || defined(OS_ANDROID) |
+#define DISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY |
+#else |
+#define DISCARDABLE_MEMORY_NEVER_SUPPORTED_NATIVELY |
+#endif |
+ |
// 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 |
@@ -37,13 +44,17 @@ enum LockDiscardableMemoryStatus { |
// - 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. If the need to pass |
+// ownership of a discardable memory instance from one thread to another, |
+// NonThreadSafe::DetachFromThread could be used, but this is unnecessary |
+// at the moment. |
// |
// References: |
// - Linux: http://lwn.net/Articles/452035/ |
// - Mac: http://trac.webkit.org/browser/trunk/Source/WebCore/platform/mac/PurgeableBufferMac.cpp |
// the comment starting with "vm_object_purgable_control" at |
// http://www.opensource.apple.com/source/xnu/xnu-792.13.8/osfmk/vm/vm_object.c |
-class BASE_EXPORT DiscardableMemory { |
+class BASE_EXPORT DiscardableMemory : public NonThreadSafe { |
public: |
DiscardableMemory(); |
@@ -51,8 +62,9 @@ class BASE_EXPORT DiscardableMemory { |
// The opened file will also be closed after this. |
~DiscardableMemory(); |
- // Check whether the system supports discardable memory. |
- static bool Supported(); |
+ // Check whether the system supports discardable memory natively. Returns |
+ // false if the support is emulated. |
+ static bool SupportedNatively(); |
// Initialize the DiscardableMemory object. On success, this function returns |
// true and the memory is locked. This should only be called once. |
@@ -72,6 +84,8 @@ class BASE_EXPORT DiscardableMemory { |
// after every successful lock call. |
void Unlock(); |
+ bool is_locked() const { return is_locked_; } |
+ |
// 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; |
@@ -87,6 +101,15 @@ class BASE_EXPORT DiscardableMemory { |
static void PurgeForTesting(); |
private: |
+#if !defined(DISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY) |
+ friend class DiscardableMemoryProvider; |
+ friend class DiscardableMemoryProviderTest; |
+ |
+ // Used by the DiscardableMemoryProvider to allocate and free memory. |
+ bool Allocate(); |
+ void Deallocate(); |
+#endif |
+ |
#if defined(OS_ANDROID) |
// Maps the discardable memory into the caller's address space. |
// Returns true on success, false otherwise. |