Index: base/memory/discardable_shared_memory.cc |
diff --git a/base/memory/discardable_shared_memory.cc b/base/memory/discardable_shared_memory.cc |
index 49e93cdaf6f22a20e0a76fd0128b5aa8cdd743dd..2f952bd847ff2cb0b11e4eb93eb95363d7a15caf 100644 |
--- a/base/memory/discardable_shared_memory.cc |
+++ b/base/memory/discardable_shared_memory.cc |
@@ -116,6 +116,16 @@ DiscardableSharedMemory::DiscardableSharedMemory( |
DiscardableSharedMemory::~DiscardableSharedMemory() { |
} |
+// static |
+bool DiscardableSharedMemory::IsShrinkingSupported() { |
+#if defined(OS_POSIX) && !defined(OS_ANDROID) |
+ // ftruncate() can be used on to shrink memory segments. |
+ return true; |
+#else |
+ return false; |
+#endif |
+} |
+ |
bool DiscardableSharedMemory::CreateAndMap(size_t size) { |
CheckedNumeric<size_t> checked_size = size; |
checked_size += AlignToPageSize(sizeof(SharedState)); |
@@ -325,20 +335,21 @@ bool DiscardableSharedMemory::Purge(Time current_time) { |
return true; |
} |
-bool DiscardableSharedMemory::PurgeAndTruncate(Time current_time) { |
- if (!Purge(current_time)) |
- return false; |
- |
-#if defined(OS_POSIX) |
- // Truncate shared memory to size of SharedState. |
+void DiscardableSharedMemory::Shrink() { |
+ DCHECK(IsShrinkingSupported()); |
+#if defined(OS_POSIX) && !defined(OS_ANDROID) |
SharedMemoryHandle handle = shared_memory_.handle(); |
if (SharedMemory::IsHandleValid(handle)) { |
- if (HANDLE_EINTR(ftruncate(handle.fd, sizeof(SharedState))) != 0) |
+ // Truncate shared memory to size of SharedState. |
+ if (HANDLE_EINTR( |
+ ftruncate(handle.fd, AlignToPageSize(sizeof(SharedState)))) != 0) { |
DPLOG(ERROR) << "ftruncate() failed"; |
+ return; |
+ } |
+ |
+ mapped_size_ = 0; |
} |
#endif |
- |
- return true; |
} |
bool DiscardableSharedMemory::IsMemoryResident() const { |