Chromium Code Reviews| Index: base/memory/discardable_shared_memory.cc |
| diff --git a/base/memory/discardable_shared_memory.cc b/base/memory/discardable_shared_memory.cc |
| index d0eaca1a66219eafee72db30d3e91170e4055e98..dc7a4659e057f249167c455fd22912c1c8e8e853 100644 |
| --- a/base/memory/discardable_shared_memory.cc |
| +++ b/base/memory/discardable_shared_memory.cc |
| @@ -4,8 +4,8 @@ |
| #include "base/memory/discardable_shared_memory.h" |
| -#if defined(OS_POSIX) |
| -#include <unistd.h> |
| +#if defined(OS_POSIX) && !defined(OS_NACL) |
| +#include <sys/mman.h> |
| #endif |
| #include <algorithm> |
| @@ -301,11 +301,7 @@ void* DiscardableSharedMemory::memory() const { |
| bool DiscardableSharedMemory::Purge(Time current_time) { |
| // Calls to this function must be synchronized properly. |
| DFAKE_SCOPED_LOCK(thread_collision_warner_); |
| - |
| - // Early out if not mapped. This can happen if the segment was previously |
| - // unmapped using a call to Close(). |
| - if (!shared_memory_.memory()) |
| - return true; |
| + DCHECK(shared_memory_.memory()); |
| SharedState old_state(SharedState::UNLOCKED, last_known_usage_); |
| SharedState new_state(SharedState::UNLOCKED, Time()); |
| @@ -326,6 +322,17 @@ bool DiscardableSharedMemory::Purge(Time current_time) { |
| return false; |
| } |
| +#if defined(OS_POSIX) && !defined(OS_NACL) |
| + // Advise the kernel to free resources associated with purged pages. |
| + // Subsequent accesses of memory pages will succeed, but will result in |
| + // zero-fill-on-demand pages. |
| + if (HANDLE_EINTR(madvise(reinterpret_cast<char*>(shared_memory_.memory()) + |
|
Primiano Tucci (use gerrit)
2015/10/16 09:31:43
madvise shouldn't be interruptible (manpage doesn'
reveman
2015/10/16 14:24:42
Good catch. I removed HANDLE_EINTR.
|
| + AlignToPageSize(sizeof(SharedState)), |
| + AlignToPageSize(mapped_size_), MADV_DONTNEED))) { |
|
Primiano Tucci (use gerrit)
2015/10/16 09:31:43
Just doublechecking: isn't mapped_size_ including
reveman
2015/10/16 14:24:42
|mapped_size_| is the size exposed to the user of
|
| + DPLOG(ERROR) << "madvise(MADV_DONTNEED) failed"; |
| + } |
| +#endif |
| + |
| last_known_usage_ = Time(); |
| return true; |
| } |
| @@ -353,26 +360,6 @@ void DiscardableSharedMemory::Close() { |
| shared_memory_.Close(); |
| } |
| -#if defined(DISCARDABLE_SHARED_MEMORY_SHRINKING) |
| -void DiscardableSharedMemory::Shrink() { |
| -#if defined(OS_POSIX) |
| - SharedMemoryHandle handle = shared_memory_.handle(); |
| - if (!SharedMemory::IsHandleValid(handle)) |
| - return; |
| - |
| - // Truncate shared memory to size of SharedState. |
| - if (HANDLE_EINTR(ftruncate(SharedMemory::GetFdFromSharedMemoryHandle(handle), |
| - AlignToPageSize(sizeof(SharedState)))) != 0) { |
| - DPLOG(ERROR) << "ftruncate() failed"; |
| - return; |
| - } |
| - mapped_size_ = 0; |
| -#else |
| - NOTIMPLEMENTED(); |
| -#endif |
| -} |
| -#endif |
| - |
| Time DiscardableSharedMemory::Now() const { |
| return Time::Now(); |
| } |