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 |