| 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 {
|
|
|