| 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 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/atomic_sequence_num.h" | 10 #include "base/atomic_sequence_num.h" |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 bool is_tracing_already_enabled = TraceLog::GetInstance()->IsEnabled(); | 204 bool is_tracing_already_enabled = TraceLog::GetInstance()->IsEnabled(); |
| 205 TRACE_EVENT0(kTraceCategory, "init"); // Add to trace-viewer category list. | 205 TRACE_EVENT0(kTraceCategory, "init"); // Add to trace-viewer category list. |
| 206 TraceLog::GetInstance()->AddEnabledStateObserver(this); | 206 TraceLog::GetInstance()->AddEnabledStateObserver(this); |
| 207 if (is_tracing_already_enabled) | 207 if (is_tracing_already_enabled) |
| 208 OnTraceLogEnabled(); | 208 OnTraceLogEnabled(); |
| 209 } | 209 } |
| 210 | 210 |
| 211 void MemoryDumpManager::RegisterDumpProvider( | 211 void MemoryDumpManager::RegisterDumpProvider( |
| 212 MemoryDumpProvider* mdp, | 212 MemoryDumpProvider* mdp, |
| 213 const char* name, | 213 const char* name, |
| 214 const scoped_refptr<SingleThreadTaskRunner>& task_runner, | 214 scoped_refptr<SingleThreadTaskRunner> task_runner, |
| 215 MemoryDumpProvider::Options options) { | 215 MemoryDumpProvider::Options options) { |
| 216 options.dumps_on_single_thread_task_runner = true; | 216 options.dumps_on_single_thread_task_runner = true; |
| 217 RegisterDumpProviderInternal(mdp, name, task_runner, options); | 217 RegisterDumpProviderInternal(mdp, name, std::move(task_runner), options); |
| 218 } | 218 } |
| 219 | 219 |
| 220 void MemoryDumpManager::RegisterDumpProvider( | 220 void MemoryDumpManager::RegisterDumpProvider( |
| 221 MemoryDumpProvider* mdp, | 221 MemoryDumpProvider* mdp, |
| 222 const char* name, | 222 const char* name, |
| 223 const scoped_refptr<SingleThreadTaskRunner>& task_runner) { | 223 scoped_refptr<SingleThreadTaskRunner> task_runner) { |
| 224 // Set |dumps_on_single_thread_task_runner| to true because all providers | 224 // Set |dumps_on_single_thread_task_runner| to true because all providers |
| 225 // without task runner are run on dump thread. | 225 // without task runner are run on dump thread. |
| 226 MemoryDumpProvider::Options options; | 226 MemoryDumpProvider::Options options; |
| 227 options.dumps_on_single_thread_task_runner = true; | 227 options.dumps_on_single_thread_task_runner = true; |
| 228 RegisterDumpProviderInternal(mdp, name, task_runner, options); | 228 RegisterDumpProviderInternal(mdp, name, std::move(task_runner), options); |
| 229 } | 229 } |
| 230 | 230 |
| 231 void MemoryDumpManager::RegisterDumpProviderWithSequencedTaskRunner( | 231 void MemoryDumpManager::RegisterDumpProviderWithSequencedTaskRunner( |
| 232 MemoryDumpProvider* mdp, | 232 MemoryDumpProvider* mdp, |
| 233 const char* name, | 233 const char* name, |
| 234 const scoped_refptr<SequencedTaskRunner>& task_runner, | 234 scoped_refptr<SequencedTaskRunner> task_runner, |
| 235 MemoryDumpProvider::Options options) { | 235 MemoryDumpProvider::Options options) { |
| 236 DCHECK(task_runner); | 236 DCHECK(task_runner); |
| 237 options.dumps_on_single_thread_task_runner = false; | 237 options.dumps_on_single_thread_task_runner = false; |
| 238 RegisterDumpProviderInternal(mdp, name, task_runner, options); | 238 RegisterDumpProviderInternal(mdp, name, std::move(task_runner), options); |
| 239 } | 239 } |
| 240 | 240 |
| 241 void MemoryDumpManager::RegisterDumpProviderInternal( | 241 void MemoryDumpManager::RegisterDumpProviderInternal( |
| 242 MemoryDumpProvider* mdp, | 242 MemoryDumpProvider* mdp, |
| 243 const char* name, | 243 const char* name, |
| 244 const scoped_refptr<SequencedTaskRunner>& task_runner, | 244 scoped_refptr<SequencedTaskRunner> task_runner, |
| 245 const MemoryDumpProvider::Options& options) { | 245 const MemoryDumpProvider::Options& options) { |
| 246 if (dumper_registrations_ignored_for_testing_) | 246 if (dumper_registrations_ignored_for_testing_) |
| 247 return; | 247 return; |
| 248 | 248 |
| 249 scoped_refptr<MemoryDumpProviderInfo> mdpinfo = | 249 scoped_refptr<MemoryDumpProviderInfo> mdpinfo = |
| 250 new MemoryDumpProviderInfo(mdp, name, task_runner, options); | 250 new MemoryDumpProviderInfo(mdp, name, std::move(task_runner), options); |
| 251 | 251 |
| 252 { | 252 { |
| 253 AutoLock lock(lock_); | 253 AutoLock lock(lock_); |
| 254 bool already_registered = !dump_providers_.insert(mdpinfo).second; | 254 bool already_registered = !dump_providers_.insert(mdpinfo).second; |
| 255 // This actually happens in some tests which don't have a clean tear-down | 255 // This actually happens in some tests which don't have a clean tear-down |
| 256 // path for RenderThreadImpl::Init(). | 256 // path for RenderThreadImpl::Init(). |
| 257 if (already_registered) | 257 if (already_registered) |
| 258 return; | 258 return; |
| 259 } | 259 } |
| 260 | 260 |
| (...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 696 dump_thread->Stop(); | 696 dump_thread->Stop(); |
| 697 } | 697 } |
| 698 | 698 |
| 699 uint64_t MemoryDumpManager::GetTracingProcessId() const { | 699 uint64_t MemoryDumpManager::GetTracingProcessId() const { |
| 700 return delegate_->GetTracingProcessId(); | 700 return delegate_->GetTracingProcessId(); |
| 701 } | 701 } |
| 702 | 702 |
| 703 MemoryDumpManager::MemoryDumpProviderInfo::MemoryDumpProviderInfo( | 703 MemoryDumpManager::MemoryDumpProviderInfo::MemoryDumpProviderInfo( |
| 704 MemoryDumpProvider* dump_provider, | 704 MemoryDumpProvider* dump_provider, |
| 705 const char* name, | 705 const char* name, |
| 706 const scoped_refptr<SequencedTaskRunner>& task_runner, | 706 scoped_refptr<SequencedTaskRunner> task_runner, |
| 707 const MemoryDumpProvider::Options& options) | 707 const MemoryDumpProvider::Options& options) |
| 708 : dump_provider(dump_provider), | 708 : dump_provider(dump_provider), |
| 709 name(name), | 709 name(name), |
| 710 task_runner(task_runner), | 710 task_runner(std::move(task_runner)), |
| 711 options(options), | 711 options(options), |
| 712 consecutive_failures(0), | 712 consecutive_failures(0), |
| 713 disabled(false) {} | 713 disabled(false) {} |
| 714 | 714 |
| 715 MemoryDumpManager::MemoryDumpProviderInfo::~MemoryDumpProviderInfo() {} | 715 MemoryDumpManager::MemoryDumpProviderInfo::~MemoryDumpProviderInfo() {} |
| 716 | 716 |
| 717 bool MemoryDumpManager::MemoryDumpProviderInfo::Comparator::operator()( | 717 bool MemoryDumpManager::MemoryDumpProviderInfo::Comparator::operator()( |
| 718 const scoped_refptr<MemoryDumpManager::MemoryDumpProviderInfo>& a, | 718 const scoped_refptr<MemoryDumpManager::MemoryDumpProviderInfo>& a, |
| 719 const scoped_refptr<MemoryDumpManager::MemoryDumpProviderInfo>& b) const { | 719 const scoped_refptr<MemoryDumpManager::MemoryDumpProviderInfo>& b) const { |
| 720 if (!a || !b) | 720 if (!a || !b) |
| 721 return a.get() < b.get(); | 721 return a.get() < b.get(); |
| 722 // Ensure that unbound providers (task_runner == nullptr) always run last. | 722 // Ensure that unbound providers (task_runner == nullptr) always run last. |
| 723 // Rationale: some unbound dump providers are known to be slow, keep them last | 723 // Rationale: some unbound dump providers are known to be slow, keep them last |
| 724 // to avoid skewing timings of the other dump providers. | 724 // to avoid skewing timings of the other dump providers. |
| 725 return std::tie(a->task_runner, a->dump_provider) > | 725 return std::tie(a->task_runner, a->dump_provider) > |
| 726 std::tie(b->task_runner, b->dump_provider); | 726 std::tie(b->task_runner, b->dump_provider); |
| 727 } | 727 } |
| 728 | 728 |
| 729 MemoryDumpManager::ProcessMemoryDumpAsyncState::ProcessMemoryDumpAsyncState( | 729 MemoryDumpManager::ProcessMemoryDumpAsyncState::ProcessMemoryDumpAsyncState( |
| 730 MemoryDumpRequestArgs req_args, | 730 MemoryDumpRequestArgs req_args, |
| 731 const MemoryDumpProviderInfo::OrderedSet& dump_providers, | 731 const MemoryDumpProviderInfo::OrderedSet& dump_providers, |
| 732 const scoped_refptr<MemoryDumpSessionState>& session_state, | 732 scoped_refptr<MemoryDumpSessionState> session_state, |
| 733 MemoryDumpCallback callback, | 733 MemoryDumpCallback callback, |
| 734 const scoped_refptr<SingleThreadTaskRunner>& dump_thread_task_runner) | 734 scoped_refptr<SingleThreadTaskRunner> dump_thread_task_runner) |
| 735 : req_args(req_args), | 735 : req_args(req_args), |
| 736 session_state(session_state), | 736 session_state(std::move(session_state)), |
| 737 callback(callback), | 737 callback(callback), |
| 738 dump_successful(true), | 738 dump_successful(true), |
| 739 callback_task_runner(MessageLoop::current()->task_runner()), | 739 callback_task_runner(MessageLoop::current()->task_runner()), |
| 740 dump_thread_task_runner(dump_thread_task_runner) { | 740 dump_thread_task_runner(std::move(dump_thread_task_runner)) { |
| 741 pending_dump_providers.reserve(dump_providers.size()); | 741 pending_dump_providers.reserve(dump_providers.size()); |
| 742 pending_dump_providers.assign(dump_providers.rbegin(), dump_providers.rend()); | 742 pending_dump_providers.assign(dump_providers.rbegin(), dump_providers.rend()); |
| 743 } | 743 } |
| 744 | 744 |
| 745 MemoryDumpManager::ProcessMemoryDumpAsyncState::~ProcessMemoryDumpAsyncState() { | 745 MemoryDumpManager::ProcessMemoryDumpAsyncState::~ProcessMemoryDumpAsyncState() { |
| 746 } | 746 } |
| 747 | 747 |
| 748 ProcessMemoryDump* MemoryDumpManager::ProcessMemoryDumpAsyncState:: | 748 ProcessMemoryDump* MemoryDumpManager::ProcessMemoryDumpAsyncState:: |
| 749 GetOrCreateMemoryDumpContainerForProcess(ProcessId pid) { | 749 GetOrCreateMemoryDumpContainerForProcess(ProcessId pid) { |
| 750 auto iter = process_dumps.find(pid); | 750 auto iter = process_dumps.find(pid); |
| 751 if (iter == process_dumps.end()) { | 751 if (iter == process_dumps.end()) { |
| 752 scoped_ptr<ProcessMemoryDump> new_pmd(new ProcessMemoryDump(session_state)); | 752 scoped_ptr<ProcessMemoryDump> new_pmd(new ProcessMemoryDump(session_state)); |
| 753 iter = process_dumps.insert(std::make_pair(pid, std::move(new_pmd))).first; | 753 iter = process_dumps.insert(std::make_pair(pid, std::move(new_pmd))).first; |
| 754 } | 754 } |
| 755 return iter->second.get(); | 755 return iter->second.get(); |
| 756 } | 756 } |
| 757 | 757 |
| 758 } // namespace trace_event | 758 } // namespace trace_event |
| 759 } // namespace base | 759 } // namespace base |
| OLD | NEW |