diff options
author | pliard@chromium.org <pliard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-24 02:44:07 +0000 |
---|---|---|
committer | pliard@chromium.org <pliard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-24 02:44:07 +0000 |
commit | 62ec64c8d54f3f8686c3bf615a326d0ff89eba32 (patch) | |
tree | d35033f45616d660c5921916fbf491e6208219f6 /base | |
parent | d36772c507db538c01896de52ba296a30b5b088c (diff) | |
download | chromium_src-62ec64c8d54f3f8686c3bf615a326d0ff89eba32.zip chromium_src-62ec64c8d54f3f8686c3bf615a326d0ff89eba32.tar.gz chromium_src-62ec64c8d54f3f8686c3bf615a326d0ff89eba32.tar.bz2 |
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
Diffstat (limited to 'base')
-rw-r--r-- | base/memory/discardable_memory_allocator_android.cc | 18 |
1 files changed, 6 insertions, 12 deletions
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<char*>(reused_chunk.start) - static_cast<char*>(base_); - LockAshmemRegion(fd_, offset, reused_chunk_size, reused_chunk.start); + LockAshmemRegion(fd_, offset, reused_chunk_size); scoped_ptr<DiscardableMemory> 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_); } |