| 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/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 MemoryDumpManager* MemoryDumpManager::GetInstance() { | 91 MemoryDumpManager* MemoryDumpManager::GetInstance() { |
| 92 if (g_instance_for_testing) | 92 if (g_instance_for_testing) |
| 93 return g_instance_for_testing; | 93 return g_instance_for_testing; |
| 94 | 94 |
| 95 return Singleton<MemoryDumpManager, | 95 return Singleton<MemoryDumpManager, |
| 96 LeakySingletonTraits<MemoryDumpManager>>::get(); | 96 LeakySingletonTraits<MemoryDumpManager>>::get(); |
| 97 } | 97 } |
| 98 | 98 |
| 99 // static | 99 // static |
| 100 void MemoryDumpManager::SetInstanceForTesting(MemoryDumpManager* instance) { | 100 void MemoryDumpManager::SetInstanceForTesting(MemoryDumpManager* instance) { |
| 101 if (instance) | |
| 102 instance->skip_core_dumpers_auto_registration_for_testing_ = true; | |
| 103 g_instance_for_testing = instance; | 101 g_instance_for_testing = instance; |
| 104 } | 102 } |
| 105 | 103 |
| 106 MemoryDumpManager::MemoryDumpManager() | 104 MemoryDumpManager::MemoryDumpManager() |
| 107 : delegate_(nullptr), | 105 : delegate_(nullptr), |
| 108 is_coordinator_(false), | 106 is_coordinator_(false), |
| 109 memory_tracing_enabled_(0), | 107 memory_tracing_enabled_(0), |
| 110 tracing_process_id_(kInvalidTracingProcessId), | 108 tracing_process_id_(kInvalidTracingProcessId), |
| 111 skip_core_dumpers_auto_registration_for_testing_(false) { | 109 dumper_registrations_ignored_for_testing_(false) { |
| 112 g_next_guid.GetNext(); // Make sure that first guid is not zero. | 110 g_next_guid.GetNext(); // Make sure that first guid is not zero. |
| 113 } | 111 } |
| 114 | 112 |
| 115 MemoryDumpManager::~MemoryDumpManager() { | 113 MemoryDumpManager::~MemoryDumpManager() { |
| 116 TraceLog::GetInstance()->RemoveEnabledStateObserver(this); | 114 TraceLog::GetInstance()->RemoveEnabledStateObserver(this); |
| 117 } | 115 } |
| 118 | 116 |
| 119 void MemoryDumpManager::Initialize(MemoryDumpManagerDelegate* delegate, | 117 void MemoryDumpManager::Initialize(MemoryDumpManagerDelegate* delegate, |
| 120 bool is_coordinator) { | 118 bool is_coordinator) { |
| 121 { | 119 { |
| 122 AutoLock lock(lock_); | 120 AutoLock lock(lock_); |
| 123 DCHECK(delegate); | 121 DCHECK(delegate); |
| 124 DCHECK(!delegate_); | 122 DCHECK(!delegate_); |
| 125 delegate_ = delegate; | 123 delegate_ = delegate; |
| 126 is_coordinator_ = is_coordinator; | 124 is_coordinator_ = is_coordinator; |
| 127 } | 125 } |
| 128 | 126 |
| 129 // Enable the core dump providers. | 127 // Enable the core dump providers. |
| 130 if (!skip_core_dumpers_auto_registration_for_testing_) { | |
| 131 #if !defined(OS_NACL) | 128 #if !defined(OS_NACL) |
| 132 RegisterDumpProvider(ProcessMemoryTotalsDumpProvider::GetInstance()); | 129 RegisterDumpProvider(ProcessMemoryTotalsDumpProvider::GetInstance()); |
| 133 #endif | 130 #endif |
| 134 | 131 |
| 135 #if defined(OS_LINUX) || defined(OS_ANDROID) | 132 #if defined(OS_LINUX) || defined(OS_ANDROID) |
| 136 RegisterDumpProvider(ProcessMemoryMapsDumpProvider::GetInstance()); | 133 RegisterDumpProvider(ProcessMemoryMapsDumpProvider::GetInstance()); |
| 137 RegisterDumpProvider(MallocDumpProvider::GetInstance()); | 134 RegisterDumpProvider(MallocDumpProvider::GetInstance()); |
| 138 #endif | 135 #endif |
| 139 | 136 |
| 140 #if defined(OS_ANDROID) | 137 #if defined(OS_ANDROID) |
| 141 RegisterDumpProvider(JavaHeapDumpProvider::GetInstance()); | 138 RegisterDumpProvider(JavaHeapDumpProvider::GetInstance()); |
| 142 #endif | 139 #endif |
| 143 | 140 |
| 144 #if defined(OS_WIN) | 141 #if defined(OS_WIN) |
| 145 RegisterDumpProvider(WinHeapDumpProvider::GetInstance()); | 142 RegisterDumpProvider(WinHeapDumpProvider::GetInstance()); |
| 146 #endif | 143 #endif |
| 147 } // !skip_core_dumpers_auto_registration_for_testing_ | |
| 148 | 144 |
| 149 // If tracing was enabled before initializing MemoryDumpManager, we missed the | 145 // If tracing was enabled before initializing MemoryDumpManager, we missed the |
| 150 // OnTraceLogEnabled() event. Synthetize it so we can late-join the party. | 146 // OnTraceLogEnabled() event. Synthetize it so we can late-join the party. |
| 151 bool is_tracing_already_enabled = TraceLog::GetInstance()->IsEnabled(); | 147 bool is_tracing_already_enabled = TraceLog::GetInstance()->IsEnabled(); |
| 152 TRACE_EVENT0(kTraceCategory, "init"); // Add to trace-viewer category list. | 148 TRACE_EVENT0(kTraceCategory, "init"); // Add to trace-viewer category list. |
| 153 TraceLog::GetInstance()->AddEnabledStateObserver(this); | 149 TraceLog::GetInstance()->AddEnabledStateObserver(this); |
| 154 if (is_tracing_already_enabled) | 150 if (is_tracing_already_enabled) |
| 155 OnTraceLogEnabled(); | 151 OnTraceLogEnabled(); |
| 156 } | 152 } |
| 157 | 153 |
| 158 void MemoryDumpManager::RegisterDumpProvider( | 154 void MemoryDumpManager::RegisterDumpProvider( |
| 159 MemoryDumpProvider* mdp, | 155 MemoryDumpProvider* mdp, |
| 160 const scoped_refptr<SingleThreadTaskRunner>& task_runner) { | 156 const scoped_refptr<SingleThreadTaskRunner>& task_runner) { |
| 157 if (dumper_registrations_ignored_for_testing_) |
| 158 return; |
| 159 |
| 161 MemoryDumpProviderInfo mdp_info(mdp, task_runner); | 160 MemoryDumpProviderInfo mdp_info(mdp, task_runner); |
| 162 AutoLock lock(lock_); | 161 AutoLock lock(lock_); |
| 163 auto iter_new = dump_providers_.insert(mdp_info); | 162 auto iter_new = dump_providers_.insert(mdp_info); |
| 164 | 163 |
| 165 // If there was a previous entry, replace it with the new one. This is to deal | 164 // If there was a previous entry, replace it with the new one. This is to deal |
| 166 // with the case where a dump provider unregisters itself and then re- | 165 // with the case where a dump provider unregisters itself and then re- |
| 167 // registers before a memory dump happens, so its entry was still in the | 166 // registers before a memory dump happens, so its entry was still in the |
| 168 // collection but flagged |unregistered|. | 167 // collection but flagged |unregistered|. |
| 169 if (!iter_new.second) { | 168 if (!iter_new.second) { |
| 170 dump_providers_.erase(iter_new.first); | 169 dump_providers_.erase(iter_new.first); |
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 next_dump_provider(next_dump_provider), | 505 next_dump_provider(next_dump_provider), |
| 507 callback(callback), | 506 callback(callback), |
| 508 task_runner(MessageLoop::current()->task_runner()) { | 507 task_runner(MessageLoop::current()->task_runner()) { |
| 509 } | 508 } |
| 510 | 509 |
| 511 MemoryDumpManager::ProcessMemoryDumpAsyncState::~ProcessMemoryDumpAsyncState() { | 510 MemoryDumpManager::ProcessMemoryDumpAsyncState::~ProcessMemoryDumpAsyncState() { |
| 512 } | 511 } |
| 513 | 512 |
| 514 } // namespace trace_event | 513 } // namespace trace_event |
| 515 } // namespace base | 514 } // namespace base |
| OLD | NEW |