discardable_memory.h 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright (c) 2013 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef BASE_MEMORY_DISCARDABLE_MEMORY_H_
  5. #define BASE_MEMORY_DISCARDABLE_MEMORY_H_
  6. #include "base/base_export.h"
  7. #include "base/compiler_specific.h"
  8. #include "build/build_config.h"
  9. namespace base {
  10. namespace trace_event {
  11. class MemoryAllocatorDump;
  12. class ProcessMemoryDump;
  13. } // namespace trace_event
  14. // Discardable memory is used to cache large objects without worrying about
  15. // blowing out memory, both on mobile devices where there is no swap, and
  16. // desktop devices where unused free memory should be used to help the user
  17. // experience. This is preferable to releasing memory in response to an OOM
  18. // signal because it is simpler and provides system-wide management of
  19. // purgable memory, though it has less flexibility as to which objects get
  20. // discarded.
  21. //
  22. // Discardable memory has two states: locked and unlocked. While the memory is
  23. // locked, it will not be discarded. Unlocking the memory allows the
  24. // discardable memory system and the OS to reclaim it if needed. Locks do not
  25. // nest.
  26. //
  27. // Notes:
  28. // - The paging behavior of memory while it is locked is not specified. While
  29. // mobile platforms will not swap it out, it may qualify for swapping
  30. // on desktop platforms. It is not expected that this will matter, as the
  31. // preferred pattern of usage for DiscardableMemory is to lock down the
  32. // memory, use it as quickly as possible, and then unlock it.
  33. // - Because of memory alignment, the amount of memory allocated can be
  34. // larger than the requested memory size. It is not very efficient for
  35. // small allocations.
  36. // - A discardable memory instance is not thread safe. It is the
  37. // responsibility of users of discardable memory to ensure there are no
  38. // races.
  39. //
  40. class BASE_EXPORT DiscardableMemory {
  41. public:
  42. DiscardableMemory();
  43. virtual ~DiscardableMemory();
  44. // Locks the memory so that it will not be purged by the system. Returns
  45. // true on success. If the return value is false then this object should be
  46. // destroyed and a new one should be created.
  47. virtual bool Lock() WARN_UNUSED_RESULT = 0;
  48. // Unlocks the memory so that it can be purged by the system. Must be called
  49. // after every successful lock call.
  50. virtual void Unlock() = 0;
  51. // Returns the memory address held by this object. The object must be locked
  52. // before calling this.
  53. virtual void* data() const = 0;
  54. // Forces the memory to be purged, such that any following Lock() will fail.
  55. // The object must be unlocked before calling this.
  56. virtual void DiscardForTesting() = 0;
  57. // Handy method to simplify calling data() with a reinterpret_cast.
  58. template<typename T> T* data_as() const {
  59. return reinterpret_cast<T*>(data());
  60. }
  61. // Used for dumping the statistics of discardable memory allocated in tracing.
  62. // Returns a new MemoryAllocatorDump in the |pmd| with the size of the
  63. // discardable memory. The MemoryAllocatorDump created is owned by |pmd|. See
  64. // ProcessMemoryDump::CreateAllocatorDump.
  65. virtual trace_event::MemoryAllocatorDump* CreateMemoryAllocatorDump(
  66. const char* name,
  67. trace_event::ProcessMemoryDump* pmd) const = 0;
  68. };
  69. enum class DiscardableMemoryBacking { kSharedMemory, kMadvFree };
  70. BASE_EXPORT DiscardableMemoryBacking GetDiscardableMemoryBacking();
  71. } // namespace base
  72. #endif // BASE_MEMORY_DISCARDABLE_MEMORY_H_