Chromium Code Reviews| 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/allocator/features.h" | 10 #include "base/allocator/features.h" |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 146 return Singleton<MemoryDumpManager, | 146 return Singleton<MemoryDumpManager, |
| 147 LeakySingletonTraits<MemoryDumpManager>>::get(); | 147 LeakySingletonTraits<MemoryDumpManager>>::get(); |
| 148 } | 148 } |
| 149 | 149 |
| 150 // static | 150 // static |
| 151 void MemoryDumpManager::SetInstanceForTesting(MemoryDumpManager* instance) { | 151 void MemoryDumpManager::SetInstanceForTesting(MemoryDumpManager* instance) { |
| 152 g_instance_for_testing = instance; | 152 g_instance_for_testing = instance; |
| 153 } | 153 } |
| 154 | 154 |
| 155 MemoryDumpManager::MemoryDumpManager() | 155 MemoryDumpManager::MemoryDumpManager() |
| 156 : delegate_(nullptr), | 156 : memory_tracing_enabled_(0), |
| 157 is_coordinator_(false), | |
| 158 memory_tracing_enabled_(0), | |
| 159 tracing_process_id_(kInvalidTracingProcessId), | 157 tracing_process_id_(kInvalidTracingProcessId), |
| 160 dumper_registrations_ignored_for_testing_(false), | 158 dumper_registrations_ignored_for_testing_(false), |
| 161 heap_profiling_enabled_(false) { | 159 heap_profiling_enabled_(false) { |
| 162 g_next_guid.GetNext(); // Make sure that first guid is not zero. | 160 g_next_guid.GetNext(); // Make sure that first guid is not zero. |
| 163 | 161 |
| 164 // At this point the command line may not be initialized but we try to | 162 // At this point the command line may not be initialized but we try to |
| 165 // enable the heap profiler to capture allocations as soon as possible. | 163 // enable the heap profiler to capture allocations as soon as possible. |
| 166 EnableHeapProfilingIfNeeded(); | 164 EnableHeapProfilingIfNeeded(); |
| 167 | 165 |
| 168 strict_thread_check_blacklist_.insert(std::begin(kStrictThreadCheckBlacklist), | 166 strict_thread_check_blacklist_.insert(std::begin(kStrictThreadCheckBlacklist), |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 205 } else { | 203 } else { |
| 206 CHECK(false) << "Invalid mode '" << profiling_mode << "' for " | 204 CHECK(false) << "Invalid mode '" << profiling_mode << "' for " |
| 207 << switches::kEnableHeapProfiling << " flag."; | 205 << switches::kEnableHeapProfiling << " flag."; |
| 208 } | 206 } |
| 209 | 207 |
| 210 for (auto mdp : dump_providers_) | 208 for (auto mdp : dump_providers_) |
| 211 mdp->dump_provider->OnHeapProfilingEnabled(true); | 209 mdp->dump_provider->OnHeapProfilingEnabled(true); |
| 212 heap_profiling_enabled_ = true; | 210 heap_profiling_enabled_ = true; |
| 213 } | 211 } |
| 214 | 212 |
| 215 void MemoryDumpManager::Initialize(MemoryDumpManagerDelegate* delegate, | 213 void MemoryDumpManager::Initialize( |
| 216 bool is_coordinator) { | 214 std::unique_ptr<MemoryDumpManagerDelegate> delegate) { |
| 217 { | 215 { |
| 218 AutoLock lock(lock_); | 216 AutoLock lock(lock_); |
| 219 DCHECK(delegate); | 217 DCHECK(delegate); |
| 220 DCHECK(!delegate_); | 218 DCHECK(!delegate_); |
| 221 delegate_ = delegate; | 219 delegate_.swap(delegate); |
|
Primiano Tucci (use gerrit)
2017/02/17 19:08:44
As commented above I think this doesn't need to be
chiniforooshan
2017/02/22 05:16:34
Done.
| |
| 222 is_coordinator_ = is_coordinator; | |
| 223 EnableHeapProfilingIfNeeded(); | 220 EnableHeapProfilingIfNeeded(); |
| 224 } | 221 } |
| 225 | 222 |
| 226 // Enable the core dump providers. | 223 // Enable the core dump providers. |
| 227 #if defined(MALLOC_MEMORY_TRACING_SUPPORTED) | 224 #if defined(MALLOC_MEMORY_TRACING_SUPPORTED) |
| 228 RegisterDumpProvider(MallocDumpProvider::GetInstance(), "Malloc", nullptr); | 225 RegisterDumpProvider(MallocDumpProvider::GetInstance(), "Malloc", nullptr); |
| 229 #endif | 226 #endif |
| 230 | 227 |
| 231 #if defined(OS_ANDROID) | 228 #if defined(OS_ANDROID) |
| 232 RegisterDumpProvider(JavaHeapDumpProvider::GetInstance(), "JavaHeap", | 229 RegisterDumpProvider(JavaHeapDumpProvider::GetInstance(), "JavaHeap", |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 443 const uint64_t guid = | 440 const uint64_t guid = |
| 444 TraceLog::GetInstance()->MangleEventId(g_next_guid.GetNext()); | 441 TraceLog::GetInstance()->MangleEventId(g_next_guid.GetNext()); |
| 445 | 442 |
| 446 // Creates an async event to keep track of the global dump evolution. | 443 // Creates an async event to keep track of the global dump evolution. |
| 447 // The |wrapped_callback| will generate the ASYNC_END event and then invoke | 444 // The |wrapped_callback| will generate the ASYNC_END event and then invoke |
| 448 // the real |callback| provided by the caller. | 445 // the real |callback| provided by the caller. |
| 449 TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(kTraceCategory, "GlobalMemoryDump", | 446 TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(kTraceCategory, "GlobalMemoryDump", |
| 450 TRACE_ID_MANGLE(guid)); | 447 TRACE_ID_MANGLE(guid)); |
| 451 MemoryDumpCallback wrapped_callback = Bind(&OnGlobalDumpDone, callback); | 448 MemoryDumpCallback wrapped_callback = Bind(&OnGlobalDumpDone, callback); |
| 452 | 449 |
| 453 // Technically there is no need to grab the |lock_| here as the delegate is | |
| 454 // long-lived and can only be set by Initialize(), which is locked and | |
| 455 // necessarily happens before memory_tracing_enabled_ == true. | |
| 456 // Not taking the |lock_|, though, is lakely make TSan barf and, at this point | |
| 457 // (memory-infra is enabled) we're not in the fast-path anymore. | |
| 458 MemoryDumpManagerDelegate* delegate; | |
| 459 { | |
| 460 AutoLock lock(lock_); | |
| 461 delegate = delegate_; | |
| 462 } | |
| 463 | |
| 464 // The delegate will coordinate the IPC broadcast and at some point invoke | 450 // The delegate will coordinate the IPC broadcast and at some point invoke |
| 465 // CreateProcessDump() to get a dump for the current process. | 451 // CreateProcessDump() to get a dump for the current process. |
| 466 MemoryDumpRequestArgs args = {guid, dump_type, level_of_detail}; | 452 MemoryDumpRequestArgs args = {guid, dump_type, level_of_detail}; |
| 467 delegate->RequestGlobalMemoryDump(args, wrapped_callback); | 453 delegate_->RequestGlobalMemoryDump(args, wrapped_callback); |
| 468 } | 454 } |
| 469 | 455 |
| 470 void MemoryDumpManager::RequestGlobalDump( | 456 void MemoryDumpManager::RequestGlobalDump( |
| 471 MemoryDumpType dump_type, | 457 MemoryDumpType dump_type, |
| 472 MemoryDumpLevelOfDetail level_of_detail) { | 458 MemoryDumpLevelOfDetail level_of_detail) { |
| 473 RequestGlobalDump(dump_type, level_of_detail, MemoryDumpCallback()); | 459 RequestGlobalDump(dump_type, level_of_detail, MemoryDumpCallback()); |
| 474 } | 460 } |
| 475 | 461 |
| 476 void MemoryDumpManager::CreateProcessDump(const MemoryDumpRequestArgs& args, | 462 void MemoryDumpManager::CreateProcessDump(const MemoryDumpRequestArgs& args, |
| 477 const MemoryDumpCallback& callback) { | 463 const MemoryDumpCallback& callback) { |
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 803 dump_thread_ = std::move(dump_thread); | 789 dump_thread_ = std::move(dump_thread); |
| 804 | 790 |
| 805 dump_providers_for_polling_.clear(); | 791 dump_providers_for_polling_.clear(); |
| 806 for (const auto& mdpinfo : dump_providers_) { | 792 for (const auto& mdpinfo : dump_providers_) { |
| 807 if (mdpinfo->options.is_fast_polling_supported) | 793 if (mdpinfo->options.is_fast_polling_supported) |
| 808 dump_providers_for_polling_.insert(mdpinfo); | 794 dump_providers_for_polling_.insert(mdpinfo); |
| 809 } | 795 } |
| 810 | 796 |
| 811 subtle::NoBarrier_Store(&memory_tracing_enabled_, 1); | 797 subtle::NoBarrier_Store(&memory_tracing_enabled_, 1); |
| 812 | 798 |
| 813 if (!is_coordinator_) | 799 if (!delegate_->IsCoordinator()) |
| 814 return; | 800 return; |
| 815 } | 801 } |
| 816 | 802 |
| 817 // Enable periodic dumps if necessary. | 803 // Enable periodic dumps if necessary. |
| 818 periodic_dump_timer_.Start(trace_config.memory_dump_config().triggers); | 804 periodic_dump_timer_.Start(trace_config.memory_dump_config().triggers); |
| 819 } | 805 } |
| 820 | 806 |
| 821 void MemoryDumpManager::OnTraceLogDisabled() { | 807 void MemoryDumpManager::OnTraceLogDisabled() { |
| 822 // There might be a memory dump in progress while this happens. Therefore, | 808 // There might be a memory dump in progress while this happens. Therefore, |
| 823 // ensure that the MDM state which depends on the tracing enabled / disabled | 809 // ensure that the MDM state which depends on the tracing enabled / disabled |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 849 } | 835 } |
| 850 | 836 |
| 851 bool MemoryDumpManager::IsDumpModeAllowed(MemoryDumpLevelOfDetail dump_mode) { | 837 bool MemoryDumpManager::IsDumpModeAllowed(MemoryDumpLevelOfDetail dump_mode) { |
| 852 AutoLock lock(lock_); | 838 AutoLock lock(lock_); |
| 853 if (!session_state_) | 839 if (!session_state_) |
| 854 return false; | 840 return false; |
| 855 return session_state_->memory_dump_config().allowed_dump_modes.count( | 841 return session_state_->memory_dump_config().allowed_dump_modes.count( |
| 856 dump_mode) != 0; | 842 dump_mode) != 0; |
| 857 } | 843 } |
| 858 | 844 |
| 859 uint64_t MemoryDumpManager::GetTracingProcessId() const { | |
| 860 return delegate_->GetTracingProcessId(); | |
| 861 } | |
| 862 | |
| 863 MemoryDumpManager::MemoryDumpProviderInfo::MemoryDumpProviderInfo( | 845 MemoryDumpManager::MemoryDumpProviderInfo::MemoryDumpProviderInfo( |
| 864 MemoryDumpProvider* dump_provider, | 846 MemoryDumpProvider* dump_provider, |
| 865 const char* name, | 847 const char* name, |
| 866 scoped_refptr<SequencedTaskRunner> task_runner, | 848 scoped_refptr<SequencedTaskRunner> task_runner, |
| 867 const MemoryDumpProvider::Options& options, | 849 const MemoryDumpProvider::Options& options, |
| 868 bool whitelisted_for_background_mode) | 850 bool whitelisted_for_background_mode) |
| 869 : dump_provider(dump_provider), | 851 : dump_provider(dump_provider), |
| 870 name(name), | 852 name(name), |
| 871 task_runner(std::move(task_runner)), | 853 task_runner(std::move(task_runner)), |
| 872 options(options), | 854 options(options), |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 989 if (heavy_dump_rate_ > 0 && periodic_dumps_count_ % heavy_dump_rate_ == 0) | 971 if (heavy_dump_rate_ > 0 && periodic_dumps_count_ % heavy_dump_rate_ == 0) |
| 990 level_of_detail = MemoryDumpLevelOfDetail::DETAILED; | 972 level_of_detail = MemoryDumpLevelOfDetail::DETAILED; |
| 991 ++periodic_dumps_count_; | 973 ++periodic_dumps_count_; |
| 992 | 974 |
| 993 MemoryDumpManager::GetInstance()->RequestGlobalDump( | 975 MemoryDumpManager::GetInstance()->RequestGlobalDump( |
| 994 MemoryDumpType::PERIODIC_INTERVAL, level_of_detail); | 976 MemoryDumpType::PERIODIC_INTERVAL, level_of_detail); |
| 995 } | 977 } |
| 996 | 978 |
| 997 } // namespace trace_event | 979 } // namespace trace_event |
| 998 } // namespace base | 980 } // namespace base |
| OLD | NEW |