Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(222)

Side by Side Diff: content/child/child_discardable_shared_memory_manager.cc

Issue 1374213002: [tracing] Display the locked size of discardable memory segment. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Storing locked state in spans. Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/atomic_sequence_num.h" 7 #include "base/atomic_sequence_num.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/debug/crash_logging.h" 9 #include "base/debug/crash_logging.h"
10 #include "base/memory/discardable_memory.h" 10 #include "base/memory/discardable_memory.h"
(...skipping 13 matching lines...) Expand all
24 // Default allocation size. 24 // Default allocation size.
25 const size_t kAllocationSize = 4 * 1024 * 1024; 25 const size_t kAllocationSize = 4 * 1024 * 1024;
26 26
27 // Global atomic to generate unique discardable shared memory IDs. 27 // Global atomic to generate unique discardable shared memory IDs.
28 base::StaticAtomicSequenceNumber g_next_discardable_shared_memory_id; 28 base::StaticAtomicSequenceNumber g_next_discardable_shared_memory_id;
29 29
30 class DiscardableMemoryImpl : public base::DiscardableMemory { 30 class DiscardableMemoryImpl : public base::DiscardableMemory {
31 public: 31 public:
32 DiscardableMemoryImpl(ChildDiscardableSharedMemoryManager* manager, 32 DiscardableMemoryImpl(ChildDiscardableSharedMemoryManager* manager,
33 scoped_ptr<DiscardableSharedMemoryHeap::Span> span) 33 scoped_ptr<DiscardableSharedMemoryHeap::Span> span)
34 : manager_(manager), span_(span.Pass()), is_locked_(true) {} 34 : manager_(manager), span_(span.Pass()) {}
35 35
36 ~DiscardableMemoryImpl() override { 36 ~DiscardableMemoryImpl() override {
37 if (is_locked_) 37 if (span_->is_locked())
38 manager_->UnlockSpan(span_.get()); 38 manager_->UnlockSpan(span_.get());
39 39
40 manager_->ReleaseSpan(span_.Pass()); 40 manager_->ReleaseSpan(span_.Pass());
41 } 41 }
42 42
43 // Overridden from base::DiscardableMemory: 43 // Overridden from base::DiscardableMemory:
44 bool Lock() override { 44 bool Lock() override {
45 DCHECK(!is_locked_); 45 DCHECK(!span_->is_locked());
46 46
47 if (!manager_->LockSpan(span_.get())) 47 if (!manager_->LockSpan(span_.get()))
48 return false; 48 return false;
49 49
50 is_locked_ = true;
51 return true; 50 return true;
52 } 51 }
53 void Unlock() override { 52 void Unlock() override {
54 DCHECK(is_locked_); 53 DCHECK(span_->is_locked());
55 54
56 manager_->UnlockSpan(span_.get()); 55 manager_->UnlockSpan(span_.get());
57 is_locked_ = false;
58 } 56 }
59 void* data() const override { 57 void* data() const override {
60 DCHECK(is_locked_); 58 DCHECK(span_->is_locked());
61 return reinterpret_cast<void*>(span_->start() * base::GetPageSize()); 59 return reinterpret_cast<void*>(span_->start() * base::GetPageSize());
62 } 60 }
63 61
64 base::trace_event::MemoryAllocatorDump* CreateMemoryAllocatorDump( 62 base::trace_event::MemoryAllocatorDump* CreateMemoryAllocatorDump(
65 const char* name, 63 const char* name,
66 base::trace_event::ProcessMemoryDump* pmd) const override { 64 base::trace_event::ProcessMemoryDump* pmd) const override {
67 return manager_->CreateMemoryAllocatorDump(span_.get(), name, pmd); 65 return manager_->CreateMemoryAllocatorDump(span_.get(), name, pmd);
68 } 66 }
69 67
70 private: 68 private:
71 ChildDiscardableSharedMemoryManager* const manager_; 69 ChildDiscardableSharedMemoryManager* const manager_;
72 scoped_ptr<DiscardableSharedMemoryHeap::Span> span_; 70 scoped_ptr<DiscardableSharedMemoryHeap::Span> span_;
73 bool is_locked_;
74 71
75 DISALLOW_COPY_AND_ASSIGN(DiscardableMemoryImpl); 72 DISALLOW_COPY_AND_ASSIGN(DiscardableMemoryImpl);
76 }; 73 };
77 74
78 void SendDeletedDiscardableSharedMemoryMessage( 75 void SendDeletedDiscardableSharedMemoryMessage(
79 scoped_refptr<ThreadSafeSender> sender, 76 scoped_refptr<ThreadSafeSender> sender,
80 DiscardableSharedMemoryId id) { 77 DiscardableSharedMemoryId id) {
81 sender->Send(new ChildProcessHostMsg_DeletedDiscardableSharedMemory(id)); 78 sender->Send(new ChildProcessHostMsg_DeletedDiscardableSharedMemory(id));
82 } 79 }
83 80
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 size_t heap_size_prior_to_releasing_purged_memory = heap_.GetSize(); 127 size_t heap_size_prior_to_releasing_purged_memory = heap_.GetSize();
131 for (;;) { 128 for (;;) {
132 // Search free lists for suitable span. 129 // Search free lists for suitable span.
133 scoped_ptr<DiscardableSharedMemoryHeap::Span> free_span = 130 scoped_ptr<DiscardableSharedMemoryHeap::Span> free_span =
134 heap_.SearchFreeLists(pages, slack); 131 heap_.SearchFreeLists(pages, slack);
135 if (!free_span.get()) 132 if (!free_span.get())
136 break; 133 break;
137 134
138 // Attempt to lock |free_span|. Delete span and search free lists again 135 // Attempt to lock |free_span|. Delete span and search free lists again
139 // if locking failed. 136 // if locking failed.
140 if (free_span->shared_memory()->Lock( 137 if (free_span->Lock(base::GetPageSize()) ==
141 free_span->start() * base::GetPageSize() -
142 reinterpret_cast<size_t>(free_span->shared_memory()->memory()),
143 free_span->length() * base::GetPageSize()) ==
144 base::DiscardableSharedMemory::FAILED) { 138 base::DiscardableSharedMemory::FAILED) {
145 DCHECK(!free_span->shared_memory()->IsMemoryResident()); 139 DCHECK(!free_span->IsMemoryResident());
146 // We have to release purged memory before |free_span| can be destroyed. 140 // We have to release purged memory before |free_span| can be destroyed.
147 heap_.ReleasePurgedMemory(); 141 heap_.ReleasePurgedMemory();
148 DCHECK(!free_span->shared_memory()); 142 DCHECK(!free_span->shared_memory());
149 continue; 143 continue;
150 } 144 }
151 145
152 // Memory usage is guaranteed to have changed after having removed 146 // Memory usage is guaranteed to have changed after having removed
153 // at least one span from the free lists. 147 // at least one span from the free lists.
154 MemoryUsageChanged(heap_.GetSize(), heap_.GetSizeOfFreeLists()); 148 MemoryUsageChanged(heap_.GetSize(), heap_.GetSizeOfFreeLists());
155 149
(...skipping 21 matching lines...) Expand all
177 171
178 // Create span for allocated memory. 172 // Create span for allocated memory.
179 scoped_ptr<DiscardableSharedMemoryHeap::Span> new_span(heap_.Grow( 173 scoped_ptr<DiscardableSharedMemoryHeap::Span> new_span(heap_.Grow(
180 shared_memory.Pass(), allocation_size_in_bytes, new_id, 174 shared_memory.Pass(), allocation_size_in_bytes, new_id,
181 base::Bind(&SendDeletedDiscardableSharedMemoryMessage, sender_, new_id))); 175 base::Bind(&SendDeletedDiscardableSharedMemoryMessage, sender_, new_id)));
182 176
183 // Unlock and insert any left over memory into free lists. 177 // Unlock and insert any left over memory into free lists.
184 if (pages < pages_to_allocate) { 178 if (pages < pages_to_allocate) {
185 scoped_ptr<DiscardableSharedMemoryHeap::Span> leftover = 179 scoped_ptr<DiscardableSharedMemoryHeap::Span> leftover =
186 heap_.Split(new_span.get(), pages); 180 heap_.Split(new_span.get(), pages);
187 leftover->shared_memory()->Unlock( 181 leftover->Unlock(base::GetPageSize());
188 leftover->start() * base::GetPageSize() -
189 reinterpret_cast<size_t>(leftover->shared_memory()->memory()),
190 leftover->length() * base::GetPageSize());
191 heap_.MergeIntoFreeLists(leftover.Pass()); 182 heap_.MergeIntoFreeLists(leftover.Pass());
192 } 183 }
193 184
194 MemoryUsageChanged(heap_.GetSize(), heap_.GetSizeOfFreeLists()); 185 MemoryUsageChanged(heap_.GetSize(), heap_.GetSizeOfFreeLists());
195 186
196 return make_scoped_ptr(new DiscardableMemoryImpl(this, new_span.Pass())); 187 return make_scoped_ptr(new DiscardableMemoryImpl(this, new_span.Pass()));
197 } 188 }
198 189
199 bool ChildDiscardableSharedMemoryManager::OnMemoryDump( 190 bool ChildDiscardableSharedMemoryManager::OnMemoryDump(
200 const base::trace_event::MemoryDumpArgs& args, 191 const base::trace_event::MemoryDumpArgs& args,
(...skipping 15 matching lines...) Expand all
216 MemoryUsageChanged(heap_.GetSize(), heap_.GetSizeOfFreeLists()); 207 MemoryUsageChanged(heap_.GetSize(), heap_.GetSizeOfFreeLists());
217 } 208 }
218 209
219 bool ChildDiscardableSharedMemoryManager::LockSpan( 210 bool ChildDiscardableSharedMemoryManager::LockSpan(
220 DiscardableSharedMemoryHeap::Span* span) { 211 DiscardableSharedMemoryHeap::Span* span) {
221 base::AutoLock lock(lock_); 212 base::AutoLock lock(lock_);
222 213
223 if (!span->shared_memory()) 214 if (!span->shared_memory())
224 return false; 215 return false;
225 216
226 size_t offset = span->start() * base::GetPageSize() - 217 switch (span->Lock(base::GetPageSize())) {
227 reinterpret_cast<size_t>(span->shared_memory()->memory());
228 size_t length = span->length() * base::GetPageSize();
229
230 switch (span->shared_memory()->Lock(offset, length)) {
231 case base::DiscardableSharedMemory::SUCCESS: 218 case base::DiscardableSharedMemory::SUCCESS:
232 return true; 219 return true;
233 case base::DiscardableSharedMemory::PURGED: 220 case base::DiscardableSharedMemory::PURGED:
234 span->shared_memory()->Unlock(offset, length); 221 span->Unlock(base::GetPageSize());
235 return false; 222 return false;
236 case base::DiscardableSharedMemory::FAILED: 223 case base::DiscardableSharedMemory::FAILED:
237 return false; 224 return false;
238 } 225 }
239 226
240 NOTREACHED(); 227 NOTREACHED();
241 return false; 228 return false;
242 } 229 }
243 230
244 void ChildDiscardableSharedMemoryManager::UnlockSpan( 231 void ChildDiscardableSharedMemoryManager::UnlockSpan(
245 DiscardableSharedMemoryHeap::Span* span) { 232 DiscardableSharedMemoryHeap::Span* span) {
246 base::AutoLock lock(lock_); 233 base::AutoLock lock(lock_);
247 234
248 DCHECK(span->shared_memory()); 235 DCHECK(span->shared_memory());
249 size_t offset = span->start() * base::GetPageSize() -
250 reinterpret_cast<size_t>(span->shared_memory()->memory());
251 size_t length = span->length() * base::GetPageSize();
252 236
253 return span->shared_memory()->Unlock(offset, length); 237 return span->Unlock(base::GetPageSize());
254 } 238 }
255 239
256 void ChildDiscardableSharedMemoryManager::ReleaseSpan( 240 void ChildDiscardableSharedMemoryManager::ReleaseSpan(
257 scoped_ptr<DiscardableSharedMemoryHeap::Span> span) { 241 scoped_ptr<DiscardableSharedMemoryHeap::Span> span) {
258 base::AutoLock lock(lock_); 242 base::AutoLock lock(lock_);
259 243
260 // Delete span instead of merging it into free lists if memory is gone. 244 // Delete span instead of merging it into free lists if memory is gone.
261 if (!span->shared_memory()) 245 if (!span->shared_memory())
262 return; 246 return;
263 247
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 "discardable-memory-allocated"; 287 "discardable-memory-allocated";
304 base::debug::SetCrashKeyValue(kDiscardableMemoryAllocatedKey, 288 base::debug::SetCrashKeyValue(kDiscardableMemoryAllocatedKey,
305 base::Uint64ToString(new_bytes_total)); 289 base::Uint64ToString(new_bytes_total));
306 290
307 static const char kDiscardableMemoryFreeKey[] = "discardable-memory-free"; 291 static const char kDiscardableMemoryFreeKey[] = "discardable-memory-free";
308 base::debug::SetCrashKeyValue(kDiscardableMemoryFreeKey, 292 base::debug::SetCrashKeyValue(kDiscardableMemoryFreeKey,
309 base::Uint64ToString(new_bytes_free)); 293 base::Uint64ToString(new_bytes_free));
310 } 294 }
311 295
312 } // namespace content 296 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698