| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/child/child_discardable_shared_memory_manager.h" | 5 #include "content/child/child_discardable_shared_memory_manager.h" |
| 6 | 6 |
| 7 #include "base/memory/discardable_shared_memory.h" | 7 #include "base/memory/discardable_shared_memory.h" |
| 8 #include "base/process/process_metrics.h" | 8 #include "base/process/process_metrics.h" |
| 9 #include "content/child/child_thread.h" | 9 #include "content/child/child_thread.h" |
| 10 #include "content/common/child_process_messages.h" | 10 #include "content/common/child_process_messages.h" |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 | 65 |
| 66 for (;;) { | 66 for (;;) { |
| 67 // Search free list for available space. | 67 // Search free list for available space. |
| 68 scoped_ptr<DiscardableSharedMemoryHeap::Span> free_span = | 68 scoped_ptr<DiscardableSharedMemoryHeap::Span> free_span = |
| 69 heap_.SearchFreeList(pages); | 69 heap_.SearchFreeList(pages); |
| 70 if (!free_span.get()) | 70 if (!free_span.get()) |
| 71 break; | 71 break; |
| 72 | 72 |
| 73 // Attempt to lock |free_span|. Delete span and search free list again | 73 // Attempt to lock |free_span|. Delete span and search free list again |
| 74 // if locking failed. | 74 // if locking failed. |
| 75 if (!free_span->shared_memory()->Lock( | 75 if (free_span->shared_memory()->Lock( |
| 76 free_span->start() * base::GetPageSize() - | 76 free_span->start() * base::GetPageSize() - |
| 77 reinterpret_cast<size_t>(free_span->shared_memory()->memory()), | 77 reinterpret_cast<size_t>(free_span->shared_memory()->memory()), |
| 78 free_span->length() * base::GetPageSize())) { | 78 free_span->length() * base::GetPageSize()) != |
| 79 base::DiscardableSharedMemory::SUCCESS) { |
| 79 heap_.DeleteSpan(free_span.Pass()); | 80 heap_.DeleteSpan(free_span.Pass()); |
| 80 continue; | 81 continue; |
| 81 } | 82 } |
| 82 | 83 |
| 83 return make_scoped_ptr( | 84 return make_scoped_ptr( |
| 84 new DiscardableMemoryShmemChunkImpl(this, free_span.Pass())); | 85 new DiscardableMemoryShmemChunkImpl(this, free_span.Pass())); |
| 85 } | 86 } |
| 86 | 87 |
| 87 size_t pages_to_allocate = | 88 size_t pages_to_allocate = |
| 88 std::max(kAllocationSize / base::GetPageSize(), pages); | 89 std::max(kAllocationSize / base::GetPageSize(), pages); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 107 heap_.MergeIntoFreeList(leftover.Pass()); | 108 heap_.MergeIntoFreeList(leftover.Pass()); |
| 108 } | 109 } |
| 109 | 110 |
| 110 return make_scoped_ptr( | 111 return make_scoped_ptr( |
| 111 new DiscardableMemoryShmemChunkImpl(this, new_span.Pass())); | 112 new DiscardableMemoryShmemChunkImpl(this, new_span.Pass())); |
| 112 } | 113 } |
| 113 | 114 |
| 114 bool ChildDiscardableSharedMemoryManager::LockSpan( | 115 bool ChildDiscardableSharedMemoryManager::LockSpan( |
| 115 DiscardableSharedMemoryHeap::Span* span) { | 116 DiscardableSharedMemoryHeap::Span* span) { |
| 116 base::AutoLock lock(lock_); | 117 base::AutoLock lock(lock_); |
| 117 return span->shared_memory()->Lock( | 118 |
| 118 span->start() * base::GetPageSize() - | 119 size_t offset = span->start() * base::GetPageSize() - |
| 119 reinterpret_cast<size_t>(span->shared_memory()->memory()), | 120 reinterpret_cast<size_t>(span->shared_memory()->memory()); |
| 120 span->length() * base::GetPageSize()); | 121 size_t length = span->length() * base::GetPageSize(); |
| 122 |
| 123 switch (span->shared_memory()->Lock(offset, length)) { |
| 124 case base::DiscardableSharedMemory::SUCCESS: |
| 125 return true; |
| 126 case base::DiscardableSharedMemory::PURGED: |
| 127 span->shared_memory()->Unlock(offset, length); |
| 128 return false; |
| 129 case base::DiscardableSharedMemory::FAILED: |
| 130 return false; |
| 131 } |
| 132 |
| 133 NOTREACHED(); |
| 134 return false; |
| 121 } | 135 } |
| 122 | 136 |
| 123 void ChildDiscardableSharedMemoryManager::UnlockSpan( | 137 void ChildDiscardableSharedMemoryManager::UnlockSpan( |
| 124 DiscardableSharedMemoryHeap::Span* span) { | 138 DiscardableSharedMemoryHeap::Span* span) { |
| 125 base::AutoLock lock(lock_); | 139 base::AutoLock lock(lock_); |
| 126 return span->shared_memory()->Unlock( | 140 |
| 127 span->start() * base::GetPageSize() - | 141 size_t offset = span->start() * base::GetPageSize() - |
| 128 reinterpret_cast<size_t>(span->shared_memory()->memory()), | 142 reinterpret_cast<size_t>(span->shared_memory()->memory()); |
| 129 span->length() * base::GetPageSize()); | 143 size_t length = span->length() * base::GetPageSize(); |
| 144 |
| 145 return span->shared_memory()->Unlock(offset, length); |
| 130 } | 146 } |
| 131 | 147 |
| 132 bool ChildDiscardableSharedMemoryManager::IsSpanResident( | 148 bool ChildDiscardableSharedMemoryManager::IsSpanResident( |
| 133 DiscardableSharedMemoryHeap::Span* span) const { | 149 DiscardableSharedMemoryHeap::Span* span) const { |
| 134 base::AutoLock lock(lock_); | 150 base::AutoLock lock(lock_); |
| 135 return span->shared_memory()->IsMemoryResident(); | 151 return span->shared_memory()->IsMemoryResident(); |
| 136 } | 152 } |
| 137 | 153 |
| 138 void ChildDiscardableSharedMemoryManager::ReleaseSpan( | 154 void ChildDiscardableSharedMemoryManager::ReleaseSpan( |
| 139 scoped_ptr<DiscardableSharedMemoryHeap::Span> span) { | 155 scoped_ptr<DiscardableSharedMemoryHeap::Span> span) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 161 sender_->Send( | 177 sender_->Send( |
| 162 new ChildProcessHostMsg_SyncAllocateLockedDiscardableSharedMemory( | 178 new ChildProcessHostMsg_SyncAllocateLockedDiscardableSharedMemory( |
| 163 size, &handle)); | 179 size, &handle)); |
| 164 scoped_ptr<base::DiscardableSharedMemory> memory( | 180 scoped_ptr<base::DiscardableSharedMemory> memory( |
| 165 new base::DiscardableSharedMemory(handle)); | 181 new base::DiscardableSharedMemory(handle)); |
| 166 CHECK(memory->Map(size)); | 182 CHECK(memory->Map(size)); |
| 167 return memory.Pass(); | 183 return memory.Pass(); |
| 168 } | 184 } |
| 169 | 185 |
| 170 } // namespace content | 186 } // namespace content |
| OLD | NEW |