summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
authorpliard@chromium.org <pliard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-24 02:44:07 +0000
committerpliard@chromium.org <pliard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-24 02:44:07 +0000
commit62ec64c8d54f3f8686c3bf615a326d0ff89eba32 (patch)
treed35033f45616d660c5921916fbf491e6208219f6 /base
parentd36772c507db538c01896de52ba296a30b5b088c (diff)
downloadchromium_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.cc18
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_);
}