Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(470)

Side by Side Diff: base/trace_event/memory_dump_manager.cc

Issue 1306843006: [tracing] Fix MemoryDumpManager periodic scheduler and improve tests (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Re petrcermak review Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 49
50 void RequestPeriodicGlobalDump() { 50 void RequestPeriodicGlobalDump() {
51 MemoryDumpArgs::LevelOfDetail dump_level_of_detail; 51 MemoryDumpArgs::LevelOfDetail dump_level_of_detail;
52 if (g_heavy_dumps_rate == 0) { 52 if (g_heavy_dumps_rate == 0) {
53 dump_level_of_detail = MemoryDumpArgs::LevelOfDetail::LOW; 53 dump_level_of_detail = MemoryDumpArgs::LevelOfDetail::LOW;
54 } else { 54 } else {
55 dump_level_of_detail = g_periodic_dumps_count == 0 55 dump_level_of_detail = g_periodic_dumps_count == 0
56 ? MemoryDumpArgs::LevelOfDetail::HIGH 56 ? MemoryDumpArgs::LevelOfDetail::HIGH
57 : MemoryDumpArgs::LevelOfDetail::LOW; 57 : MemoryDumpArgs::LevelOfDetail::LOW;
58 58
59 if (++g_periodic_dumps_count == g_heavy_dumps_rate) 59 if (++g_periodic_dumps_count == g_heavy_dumps_rate - 1)
60 g_periodic_dumps_count = 0; 60 g_periodic_dumps_count = 0;
61 } 61 }
62 62
63 MemoryDumpArgs dump_args = {dump_level_of_detail}; 63 MemoryDumpArgs dump_args = {dump_level_of_detail};
64 MemoryDumpManager::GetInstance()->RequestGlobalDump( 64 MemoryDumpManager::GetInstance()->RequestGlobalDump(
65 MemoryDumpType::PERIODIC_INTERVAL, dump_args); 65 MemoryDumpType::PERIODIC_INTERVAL, dump_args);
66 } 66 }
67 67
68 } // namespace 68 } // namespace
69 69
70 // static 70 // static
71 const char* const MemoryDumpManager::kTraceCategory = 71 const char* const MemoryDumpManager::kTraceCategory =
72 TRACE_DISABLED_BY_DEFAULT("memory-infra"); 72 TRACE_DISABLED_BY_DEFAULT("memory-infra");
73 73
74 // static 74 // static
75 const int MemoryDumpManager::kMaxConsecutiveFailuresCount = 3; 75 const int MemoryDumpManager::kMaxConsecutiveFailuresCount = 3;
76 76
77 // static 77 // static
78 const uint64 MemoryDumpManager::kInvalidTracingProcessId = 0; 78 const uint64 MemoryDumpManager::kInvalidTracingProcessId = 0;
79 79
80 // static 80 // static
81 const char* const MemoryDumpManager::kSystemAllocatorPoolName =
82 #if defined(OS_LINUX) || defined(OS_ANDROID)
83 MallocDumpProvider::kAllocatedObjects;
84 #elif defined(OS_WIN)
85 WinHeapDumpProvider::kAllocatedObjects;
86 #else
87 nullptr;
88 #endif
89
90
91 // static
81 MemoryDumpManager* MemoryDumpManager::GetInstance() { 92 MemoryDumpManager* MemoryDumpManager::GetInstance() {
82 if (g_instance_for_testing) 93 if (g_instance_for_testing)
83 return g_instance_for_testing; 94 return g_instance_for_testing;
84 95
85 return Singleton<MemoryDumpManager, 96 return Singleton<MemoryDumpManager,
86 LeakySingletonTraits<MemoryDumpManager>>::get(); 97 LeakySingletonTraits<MemoryDumpManager>>::get();
87 } 98 }
88 99
89 // static 100 // static
90 void MemoryDumpManager::SetInstanceForTesting(MemoryDumpManager* instance) { 101 void MemoryDumpManager::SetInstanceForTesting(MemoryDumpManager* instance) {
91 if (instance) 102 if (instance)
92 instance->skip_core_dumpers_auto_registration_for_testing_ = true; 103 instance->skip_core_dumpers_auto_registration_for_testing_ = true;
93 g_instance_for_testing = instance; 104 g_instance_for_testing = instance;
94 } 105 }
95 106
96 MemoryDumpManager::MemoryDumpManager() 107 MemoryDumpManager::MemoryDumpManager()
97 : delegate_(nullptr), 108 : delegate_(nullptr),
98 memory_tracing_enabled_(0), 109 memory_tracing_enabled_(0),
99 tracing_process_id_(kInvalidTracingProcessId), 110 tracing_process_id_(kInvalidTracingProcessId),
100 system_allocator_pool_name_(nullptr),
101 skip_core_dumpers_auto_registration_for_testing_(false), 111 skip_core_dumpers_auto_registration_for_testing_(false),
102 disable_periodic_dumps_for_testing_(false) { 112 disable_periodic_dumps_for_testing_(false) {
103 g_next_guid.GetNext(); // Make sure that first guid is not zero. 113 g_next_guid.GetNext(); // Make sure that first guid is not zero.
104 } 114 }
105 115
106 MemoryDumpManager::~MemoryDumpManager() { 116 MemoryDumpManager::~MemoryDumpManager() {
107 base::trace_event::TraceLog::GetInstance()->RemoveEnabledStateObserver(this); 117 TraceLog::GetInstance()->RemoveEnabledStateObserver(this);
108 } 118 }
109 119
110 void MemoryDumpManager::Initialize() { 120 void MemoryDumpManager::Initialize() {
111 TRACE_EVENT0(kTraceCategory, "init"); // Add to trace-viewer category list. 121 TRACE_EVENT0(kTraceCategory, "init"); // Add to trace-viewer category list.
112 trace_event::TraceLog::GetInstance()->AddEnabledStateObserver(this);
113 122
114 if (skip_core_dumpers_auto_registration_for_testing_) 123 TraceLog::GetInstance()->AddEnabledStateObserver(this);
115 return;
116 124
117 // Enable the core dump providers. 125 // Enable the core dump providers.
126 if (!skip_core_dumpers_auto_registration_for_testing_) {
118 #if !defined(OS_NACL) 127 #if !defined(OS_NACL)
119 RegisterDumpProvider(ProcessMemoryTotalsDumpProvider::GetInstance()); 128 RegisterDumpProvider(ProcessMemoryTotalsDumpProvider::GetInstance());
120 #endif 129 #endif
121 130
122 #if defined(OS_LINUX) || defined(OS_ANDROID) 131 #if defined(OS_LINUX) || defined(OS_ANDROID)
123 RegisterDumpProvider(ProcessMemoryMapsDumpProvider::GetInstance()); 132 RegisterDumpProvider(ProcessMemoryMapsDumpProvider::GetInstance());
124 RegisterDumpProvider(MallocDumpProvider::GetInstance()); 133 RegisterDumpProvider(MallocDumpProvider::GetInstance());
125 system_allocator_pool_name_ = MallocDumpProvider::kAllocatedObjects;
126 #endif 134 #endif
127 135
128 #if defined(OS_ANDROID) 136 #if defined(OS_ANDROID)
129 RegisterDumpProvider(JavaHeapDumpProvider::GetInstance()); 137 RegisterDumpProvider(JavaHeapDumpProvider::GetInstance());
130 #endif 138 #endif
131 139
132 #if defined(OS_WIN) 140 #if defined(OS_WIN)
133 RegisterDumpProvider(WinHeapDumpProvider::GetInstance()); 141 RegisterDumpProvider(WinHeapDumpProvider::GetInstance());
134 system_allocator_pool_name_ = WinHeapDumpProvider::kAllocatedObjects;
135 #endif 142 #endif
143 } // !skip_core_dumpers_auto_registration_for_testing_
136 } 144 }
137 145
138 void MemoryDumpManager::SetDelegate(MemoryDumpManagerDelegate* delegate) { 146 void MemoryDumpManager::SetDelegate(MemoryDumpManagerDelegate* delegate) {
139 AutoLock lock(lock_); 147 AutoLock lock(lock_);
140 DCHECK_EQ(static_cast<MemoryDumpManagerDelegate*>(nullptr), delegate_); 148 DCHECK_EQ(static_cast<MemoryDumpManagerDelegate*>(nullptr), delegate_);
141 delegate_ = delegate; 149 delegate_ = delegate;
142 } 150 }
143 151
144 void MemoryDumpManager::RegisterDumpProvider( 152 void MemoryDumpManager::RegisterDumpProvider(
145 MemoryDumpProvider* mdp, 153 MemoryDumpProvider* mdp,
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 if (!UNLIKELY(subtle::NoBarrier_Load(&memory_tracing_enabled_))) { 204 if (!UNLIKELY(subtle::NoBarrier_Load(&memory_tracing_enabled_))) {
197 if (!callback.is_null()) 205 if (!callback.is_null())
198 callback.Run(0u /* guid */, false /* success */); 206 callback.Run(0u /* guid */, false /* success */);
199 return; 207 return;
200 } 208 }
201 209
202 const uint64 guid = 210 const uint64 guid =
203 TraceLog::GetInstance()->MangleEventId(g_next_guid.GetNext()); 211 TraceLog::GetInstance()->MangleEventId(g_next_guid.GetNext());
204 212
205 // The delegate_ is supposed to be thread safe, immutable and long lived. 213 // The delegate_ is supposed to be thread safe, immutable and long lived.
206 // No need to keep the lock after we ensure that a delegate has been set. 214 // No need to keep the lock after we ensured that a delegate has been set.
207 MemoryDumpManagerDelegate* delegate; 215 MemoryDumpManagerDelegate* delegate;
208 { 216 {
209 AutoLock lock(lock_); 217 AutoLock lock(lock_);
210 delegate = delegate_; 218 delegate = delegate_;
211 } 219 }
212 220
213 if (delegate) { 221 if (delegate) {
214 // The delegate is in charge to coordinate the request among all the 222 // The delegate is in charge to coordinate the request among all the
215 // processes and call the CreateLocalDumpPoint on the local process. 223 // processes and call the CreateLocalDumpPoint on the local process.
216 MemoryDumpRequestArgs args = {guid, dump_type, dump_args}; 224 MemoryDumpRequestArgs args = {guid, dump_type, dump_args};
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 next_dump_provider(next_dump_provider), 504 next_dump_provider(next_dump_provider),
497 callback(callback), 505 callback(callback),
498 task_runner(MessageLoop::current()->task_runner()) { 506 task_runner(MessageLoop::current()->task_runner()) {
499 } 507 }
500 508
501 MemoryDumpManager::ProcessMemoryDumpAsyncState::~ProcessMemoryDumpAsyncState() { 509 MemoryDumpManager::ProcessMemoryDumpAsyncState::~ProcessMemoryDumpAsyncState() {
502 } 510 }
503 511
504 } // namespace trace_event 512 } // namespace trace_event
505 } // namespace base 513 } // namespace base
OLDNEW
« no previous file with comments | « base/trace_event/memory_dump_manager.h ('k') | base/trace_event/memory_dump_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698