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

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

Issue 1407483003: Reland of [tracing] Display the locked size of discardable memory segment. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix. 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 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 reinterpret_cast<size_t>(free_span->shared_memory()->memory()), 142 reinterpret_cast<size_t>(free_span->shared_memory()->memory()),
143 free_span->length() * base::GetPageSize()) == 143 free_span->length() * base::GetPageSize()) ==
144 base::DiscardableSharedMemory::FAILED) { 144 base::DiscardableSharedMemory::FAILED) {
145 DCHECK(!free_span->shared_memory()->IsMemoryResident()); 145 DCHECK(!free_span->shared_memory()->IsMemoryResident());
146 // We have to release purged memory before |free_span| can be destroyed. 146 // We have to release purged memory before |free_span| can be destroyed.
147 heap_.ReleasePurgedMemory(); 147 heap_.ReleasePurgedMemory();
148 DCHECK(!free_span->shared_memory()); 148 DCHECK(!free_span->shared_memory());
149 continue; 149 continue;
150 } 150 }
151 151
152 free_span->set_is_locked(true);
153
152 // Memory usage is guaranteed to have changed after having removed 154 // Memory usage is guaranteed to have changed after having removed
153 // at least one span from the free lists. 155 // at least one span from the free lists.
154 MemoryUsageChanged(heap_.GetSize(), heap_.GetSizeOfFreeLists()); 156 MemoryUsageChanged(heap_.GetSize(), heap_.GetSizeOfFreeLists());
155 157
156 return make_scoped_ptr(new DiscardableMemoryImpl(this, free_span.Pass())); 158 return make_scoped_ptr(new DiscardableMemoryImpl(this, free_span.Pass()));
157 } 159 }
158 160
159 // Release purged memory to free up the address space before we attempt to 161 // Release purged memory to free up the address space before we attempt to
160 // allocate more memory. 162 // allocate more memory.
161 heap_.ReleasePurgedMemory(); 163 heap_.ReleasePurgedMemory();
(...skipping 10 matching lines...) Expand all
172 g_next_discardable_shared_memory_id.GetNext(); 174 g_next_discardable_shared_memory_id.GetNext();
173 175
174 // Ask parent process to allocate a new discardable shared memory segment. 176 // Ask parent process to allocate a new discardable shared memory segment.
175 scoped_ptr<base::DiscardableSharedMemory> shared_memory( 177 scoped_ptr<base::DiscardableSharedMemory> shared_memory(
176 AllocateLockedDiscardableSharedMemory(allocation_size_in_bytes, new_id)); 178 AllocateLockedDiscardableSharedMemory(allocation_size_in_bytes, new_id));
177 179
178 // Create span for allocated memory. 180 // Create span for allocated memory.
179 scoped_ptr<DiscardableSharedMemoryHeap::Span> new_span(heap_.Grow( 181 scoped_ptr<DiscardableSharedMemoryHeap::Span> new_span(heap_.Grow(
180 shared_memory.Pass(), allocation_size_in_bytes, new_id, 182 shared_memory.Pass(), allocation_size_in_bytes, new_id,
181 base::Bind(&SendDeletedDiscardableSharedMemoryMessage, sender_, new_id))); 183 base::Bind(&SendDeletedDiscardableSharedMemoryMessage, sender_, new_id)));
184 new_span->set_is_locked(true);
182 185
183 // Unlock and insert any left over memory into free lists. 186 // Unlock and insert any left over memory into free lists.
184 if (pages < pages_to_allocate) { 187 if (pages < pages_to_allocate) {
185 scoped_ptr<DiscardableSharedMemoryHeap::Span> leftover = 188 scoped_ptr<DiscardableSharedMemoryHeap::Span> leftover =
186 heap_.Split(new_span.get(), pages); 189 heap_.Split(new_span.get(), pages);
187 leftover->shared_memory()->Unlock( 190 leftover->shared_memory()->Unlock(
188 leftover->start() * base::GetPageSize() - 191 leftover->start() * base::GetPageSize() -
189 reinterpret_cast<size_t>(leftover->shared_memory()->memory()), 192 reinterpret_cast<size_t>(leftover->shared_memory()->memory()),
190 leftover->length() * base::GetPageSize()); 193 leftover->length() * base::GetPageSize());
194 leftover->set_is_locked(false);
191 heap_.MergeIntoFreeLists(leftover.Pass()); 195 heap_.MergeIntoFreeLists(leftover.Pass());
192 } 196 }
193 197
194 MemoryUsageChanged(heap_.GetSize(), heap_.GetSizeOfFreeLists()); 198 MemoryUsageChanged(heap_.GetSize(), heap_.GetSizeOfFreeLists());
195 199
196 return make_scoped_ptr(new DiscardableMemoryImpl(this, new_span.Pass())); 200 return make_scoped_ptr(new DiscardableMemoryImpl(this, new_span.Pass()));
197 } 201 }
198 202
199 bool ChildDiscardableSharedMemoryManager::OnMemoryDump( 203 bool ChildDiscardableSharedMemoryManager::OnMemoryDump(
200 const base::trace_event::MemoryDumpArgs& args, 204 const base::trace_event::MemoryDumpArgs& args,
(...skipping 21 matching lines...) Expand all
222 226
223 if (!span->shared_memory()) 227 if (!span->shared_memory())
224 return false; 228 return false;
225 229
226 size_t offset = span->start() * base::GetPageSize() - 230 size_t offset = span->start() * base::GetPageSize() -
227 reinterpret_cast<size_t>(span->shared_memory()->memory()); 231 reinterpret_cast<size_t>(span->shared_memory()->memory());
228 size_t length = span->length() * base::GetPageSize(); 232 size_t length = span->length() * base::GetPageSize();
229 233
230 switch (span->shared_memory()->Lock(offset, length)) { 234 switch (span->shared_memory()->Lock(offset, length)) {
231 case base::DiscardableSharedMemory::SUCCESS: 235 case base::DiscardableSharedMemory::SUCCESS:
236 span->set_is_locked(true);
232 return true; 237 return true;
233 case base::DiscardableSharedMemory::PURGED: 238 case base::DiscardableSharedMemory::PURGED:
234 span->shared_memory()->Unlock(offset, length); 239 span->shared_memory()->Unlock(offset, length);
240 span->set_is_locked(false);
235 return false; 241 return false;
236 case base::DiscardableSharedMemory::FAILED: 242 case base::DiscardableSharedMemory::FAILED:
237 return false; 243 return false;
238 } 244 }
239 245
240 NOTREACHED(); 246 NOTREACHED();
241 return false; 247 return false;
242 } 248 }
243 249
244 void ChildDiscardableSharedMemoryManager::UnlockSpan( 250 void ChildDiscardableSharedMemoryManager::UnlockSpan(
245 DiscardableSharedMemoryHeap::Span* span) { 251 DiscardableSharedMemoryHeap::Span* span) {
246 base::AutoLock lock(lock_); 252 base::AutoLock lock(lock_);
247 253
248 DCHECK(span->shared_memory()); 254 DCHECK(span->shared_memory());
249 size_t offset = span->start() * base::GetPageSize() - 255 size_t offset = span->start() * base::GetPageSize() -
250 reinterpret_cast<size_t>(span->shared_memory()->memory()); 256 reinterpret_cast<size_t>(span->shared_memory()->memory());
251 size_t length = span->length() * base::GetPageSize(); 257 size_t length = span->length() * base::GetPageSize();
252 258
259 span->set_is_locked(false);
253 return span->shared_memory()->Unlock(offset, length); 260 return span->shared_memory()->Unlock(offset, length);
254 } 261 }
255 262
256 void ChildDiscardableSharedMemoryManager::ReleaseSpan( 263 void ChildDiscardableSharedMemoryManager::ReleaseSpan(
257 scoped_ptr<DiscardableSharedMemoryHeap::Span> span) { 264 scoped_ptr<DiscardableSharedMemoryHeap::Span> span) {
258 base::AutoLock lock(lock_); 265 base::AutoLock lock(lock_);
259 266
260 // Delete span instead of merging it into free lists if memory is gone. 267 // Delete span instead of merging it into free lists if memory is gone.
261 if (!span->shared_memory()) 268 if (!span->shared_memory())
262 return; 269 return;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 "discardable-memory-allocated"; 310 "discardable-memory-allocated";
304 base::debug::SetCrashKeyValue(kDiscardableMemoryAllocatedKey, 311 base::debug::SetCrashKeyValue(kDiscardableMemoryAllocatedKey,
305 base::Uint64ToString(new_bytes_total)); 312 base::Uint64ToString(new_bytes_total));
306 313
307 static const char kDiscardableMemoryFreeKey[] = "discardable-memory-free"; 314 static const char kDiscardableMemoryFreeKey[] = "discardable-memory-free";
308 base::debug::SetCrashKeyValue(kDiscardableMemoryFreeKey, 315 base::debug::SetCrashKeyValue(kDiscardableMemoryFreeKey,
309 base::Uint64ToString(new_bytes_free)); 316 base::Uint64ToString(new_bytes_free));
310 } 317 }
311 318
312 } // namespace content 319 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698