From 62ec64c8d54f3f8686c3bf615a326d0ff89eba32 Mon Sep 17 00:00:00 2001 From: "pliard@chromium.org" Date: Mon, 24 Mar 2014 02:44:07 +0000 Subject: Remove use of mprotect() in DiscardableMemoryAllocatorAndroid. On Samsung devices mprotect(addr, length, PROT_READ | PROT_WRITE) fails after a previous call to mprotect(addr, length, PROT_NONE) when addr is inside an ashmem mapping. It is not worth introducing some extra code detecting at runtime whether this specific pattern is supported for a feature that is only used in debug mode. BUG=348564 Review URL: https://codereview.chromium.org/207953002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@258850 0039d316-1c4b-4281-b951-d872f2087c98 --- base/memory/discardable_memory_allocator_android.cc | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) (limited to 'base') diff --git a/base/memory/discardable_memory_allocator_android.cc b/base/memory/discardable_memory_allocator_android.cc index 1588317..077a441 100644 --- a/base/memory/discardable_memory_allocator_android.cc +++ b/base/memory/discardable_memory_allocator_android.cc @@ -102,22 +102,16 @@ bool CloseAshmemRegion(int fd, size_t size, void* address) { return close(fd) == 0; } -DiscardableMemoryLockStatus LockAshmemRegion(int fd, - size_t off, - size_t size, - const void* address) { +DiscardableMemoryLockStatus LockAshmemRegion(int fd, size_t off, size_t size) { const int result = ashmem_pin_region(fd, off, size); - DCHECK_EQ(0, mprotect(address, size, PROT_READ | PROT_WRITE)); return result == ASHMEM_WAS_PURGED ? DISCARDABLE_MEMORY_LOCK_STATUS_PURGED : DISCARDABLE_MEMORY_LOCK_STATUS_SUCCESS; } -bool UnlockAshmemRegion(int fd, size_t off, size_t size, const void* address) { +bool UnlockAshmemRegion(int fd, size_t off, size_t size) { const int failed = ashmem_unpin_region(fd, off, size); if (failed) DLOG(ERROR) << "Failed to unpin memory."; - // This allows us to catch accesses to unlocked memory. - DCHECK_EQ(0, mprotect(address, size, PROT_NONE)); return !failed; } @@ -150,13 +144,13 @@ class DiscardableMemoryAllocator::DiscardableAshmemChunk virtual DiscardableMemoryLockStatus Lock() OVERRIDE { DCHECK(!locked_); locked_ = true; - return LockAshmemRegion(fd_, offset_, size_, address_); + return LockAshmemRegion(fd_, offset_, size_); } virtual void Unlock() OVERRIDE { DCHECK(locked_); locked_ = false; - UnlockAshmemRegion(fd_, offset_, size_, address_); + UnlockAshmemRegion(fd_, offset_, size_); } virtual void* Memory() const OVERRIDE { @@ -335,7 +329,7 @@ class DiscardableMemoryAllocator::AshmemRegion { const size_t offset = static_cast(reused_chunk.start) - static_cast(base_); - LockAshmemRegion(fd_, offset, reused_chunk_size, reused_chunk.start); + LockAshmemRegion(fd_, offset, reused_chunk_size); scoped_ptr memory( new DiscardableAshmemChunk(this, fd_, reused_chunk.start, offset, reused_chunk_size)); @@ -481,7 +475,7 @@ class DiscardableMemoryAllocator::AshmemRegion { DiscardableMemoryAllocator::DiscardableAshmemChunk::~DiscardableAshmemChunk() { if (locked_) - UnlockAshmemRegion(fd_, offset_, size_, address_); + UnlockAshmemRegion(fd_, offset_, size_); ashmem_region_->OnChunkDeletion(address_, size_); } -- cgit v1.1