OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "base/trace_event/memory_dump_manager.h" | 5 #include "base/trace_event/memory_dump_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/atomic_sequence_num.h" | 9 #include "base/atomic_sequence_num.h" |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 RequestGlobalDump(dump_type, MemoryDumpCallback()); | 276 RequestGlobalDump(dump_type, MemoryDumpCallback()); |
277 } | 277 } |
278 | 278 |
279 // Creates a memory dump for the current process and appends it to the trace. | 279 // Creates a memory dump for the current process and appends it to the trace. |
280 void MemoryDumpManager::CreateProcessDump(const MemoryDumpRequestArgs& args, | 280 void MemoryDumpManager::CreateProcessDump(const MemoryDumpRequestArgs& args, |
281 const MemoryDumpCallback& callback) { | 281 const MemoryDumpCallback& callback) { |
282 scoped_refptr<ProcessMemoryDumpHolder> pmd_holder( | 282 scoped_refptr<ProcessMemoryDumpHolder> pmd_holder( |
283 new ProcessMemoryDumpHolder(args, session_state_, callback)); | 283 new ProcessMemoryDumpHolder(args, session_state_, callback)); |
284 ProcessMemoryDump* pmd = &pmd_holder->process_memory_dump; | 284 ProcessMemoryDump* pmd = &pmd_holder->process_memory_dump; |
285 bool did_any_provider_dump = false; | 285 bool did_any_provider_dump = false; |
| 286 bool did_post_any_async_task = false; |
286 | 287 |
287 // Iterate over the active dump providers and invoke OnMemoryDump(pmd). | 288 // Iterate over the active dump providers and invoke OnMemoryDump(pmd). |
288 // The MDM guarantees linearity (at most one MDP is active within one | 289 // The MDM guarantees linearity (at most one MDP is active within one |
289 // process) and thread-safety (MDM enforces the right locking when entering / | 290 // process) and thread-safety (MDM enforces the right locking when entering / |
290 // leaving the MDP.OnMemoryDump() call). This is to simplify the clients' | 291 // leaving the MDP.OnMemoryDump() call). This is to simplify the clients' |
291 // design | 292 // design |
292 // and not let the MDPs worry about locking. | 293 // and not let the MDPs worry about locking. |
293 // As regards thread affinity, depending on the MDP configuration (see | 294 // As regards thread affinity, depending on the MDP configuration (see |
294 // memory_dump_provider.h), the OnMemoryDump() invocation can happen: | 295 // memory_dump_provider.h), the OnMemoryDump() invocation can happen: |
295 // - Synchronousy on the MDM thread, when MDP.task_runner() is not set. | 296 // - Synchronousy on the MDM thread, when MDP.task_runner() is not set. |
(...skipping 11 matching lines...) Expand all Loading... |
307 continue; | 308 continue; |
308 } | 309 } |
309 if (mdp_info->disabled) | 310 if (mdp_info->disabled) |
310 continue; | 311 continue; |
311 if (mdp_info->task_runner) { | 312 if (mdp_info->task_runner) { |
312 // The OnMemoryDump() call must be posted. | 313 // The OnMemoryDump() call must be posted. |
313 bool did_post_async_task = mdp_info->task_runner->PostTask( | 314 bool did_post_async_task = mdp_info->task_runner->PostTask( |
314 FROM_HERE, Bind(&MemoryDumpManager::ContinueAsyncProcessDump, | 315 FROM_HERE, Bind(&MemoryDumpManager::ContinueAsyncProcessDump, |
315 Unretained(this), Unretained(mdp), pmd_holder)); | 316 Unretained(this), Unretained(mdp), pmd_holder)); |
316 // The thread underlying the TaskRunner might have gone away. | 317 // The thread underlying the TaskRunner might have gone away. |
317 if (did_post_async_task) | 318 if (did_post_async_task) { |
318 ++pmd_holder->num_pending_async_requests; | 319 ++pmd_holder->num_pending_async_requests; |
| 320 did_post_any_async_task = true; |
| 321 } |
319 } else { | 322 } else { |
320 // Invoke the dump provider synchronously. | 323 // Invoke the dump provider synchronously. |
321 did_any_provider_dump |= InvokeDumpProviderLocked(mdp, pmd); | 324 did_any_provider_dump |= InvokeDumpProviderLocked(mdp, pmd); |
322 } | 325 } |
323 } | 326 } |
324 } // AutoLock | 327 } // AutoLock |
325 | 328 |
326 // If at least one synchronous provider did dump and there are no pending | 329 // If at least one synchronous provider did dump and there are no pending |
327 // asynchronous requests, add the dump to the trace and invoke the callback | 330 // asynchronous requests, add the dump to the trace and invoke the callback |
328 // straight away (FinalizeDumpAndAddToTrace() takes care of the callback). | 331 // straight away (FinalizeDumpAndAddToTrace() takes care of the callback). |
329 if (did_any_provider_dump && pmd_holder->num_pending_async_requests == 0) | 332 if (did_any_provider_dump && !did_post_any_async_task) |
330 FinalizeDumpAndAddToTrace(pmd_holder); | 333 FinalizeDumpAndAddToTrace(pmd_holder); |
331 } | 334 } |
332 | 335 |
333 // Invokes the MemoryDumpProvider.OnMemoryDump(), taking care of the fail-safe | 336 // Invokes the MemoryDumpProvider.OnMemoryDump(), taking care of the fail-safe |
334 // logic which disables the dumper when failing (crbug.com/461788). | 337 // logic which disables the dumper when failing (crbug.com/461788). |
335 bool MemoryDumpManager::InvokeDumpProviderLocked(MemoryDumpProvider* mdp, | 338 bool MemoryDumpManager::InvokeDumpProviderLocked(MemoryDumpProvider* mdp, |
336 ProcessMemoryDump* pmd) { | 339 ProcessMemoryDump* pmd) { |
337 lock_.AssertAcquired(); | 340 lock_.AssertAcquired(); |
338 bool dump_successful = mdp->OnMemoryDump(pmd); | 341 bool dump_successful = mdp->OnMemoryDump(pmd); |
339 if (!dump_successful) { | 342 if (!dump_successful) { |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
415 | 418 |
416 MemoryDumpManager::MemoryDumpProviderInfo::MemoryDumpProviderInfo( | 419 MemoryDumpManager::MemoryDumpProviderInfo::MemoryDumpProviderInfo( |
417 const scoped_refptr<SingleThreadTaskRunner>& task_runner) | 420 const scoped_refptr<SingleThreadTaskRunner>& task_runner) |
418 : task_runner(task_runner), disabled(false) { | 421 : task_runner(task_runner), disabled(false) { |
419 } | 422 } |
420 MemoryDumpManager::MemoryDumpProviderInfo::~MemoryDumpProviderInfo() { | 423 MemoryDumpManager::MemoryDumpProviderInfo::~MemoryDumpProviderInfo() { |
421 } | 424 } |
422 | 425 |
423 } // namespace trace_event | 426 } // namespace trace_event |
424 } // namespace base | 427 } // namespace base |
OLD | NEW |