| 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 #ifndef BASE_TRACE_EVENT_MEMORY_DUMP_MANAGER_H_ | 5 #ifndef BASE_TRACE_EVENT_MEMORY_DUMP_MANAGER_H_ |
| 6 #define BASE_TRACE_EVENT_MEMORY_DUMP_MANAGER_H_ | 6 #define BASE_TRACE_EVENT_MEMORY_DUMP_MANAGER_H_ |
| 7 | 7 |
| 8 #include <set> | 8 #include <set> |
| 9 | 9 |
| 10 #include "base/atomicops.h" | 10 #include "base/atomicops.h" |
| 11 #include "base/containers/hash_tables.h" | 11 #include "base/containers/hash_tables.h" |
| 12 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
| 13 #include "base/memory/singleton.h" | 13 #include "base/memory/singleton.h" |
| 14 #include "base/synchronization/lock.h" | 14 #include "base/synchronization/lock.h" |
| 15 #include "base/timer/timer.h" | 15 #include "base/timer/timer.h" |
| 16 #include "base/trace_event/memory_dump_request_args.h" | 16 #include "base/trace_event/memory_dump_request_args.h" |
| 17 #include "base/trace_event/process_memory_dump.h" | 17 #include "base/trace_event/process_memory_dump.h" |
| 18 #include "base/trace_event/trace_event.h" | 18 #include "base/trace_event/trace_event.h" |
| 19 | 19 |
| 20 namespace base { | 20 namespace base { |
| 21 | 21 |
| 22 class SingleThreadTaskRunner; | 22 class SingleThreadTaskRunner; |
| 23 class Thread; |
| 23 | 24 |
| 24 namespace trace_event { | 25 namespace trace_event { |
| 25 | 26 |
| 26 class MemoryDumpManagerDelegate; | 27 class MemoryDumpManagerDelegate; |
| 27 class MemoryDumpProvider; | 28 class MemoryDumpProvider; |
| 28 class MemoryDumpSessionState; | 29 class MemoryDumpSessionState; |
| 29 | 30 |
| 30 // This is the interface exposed to the rest of the codebase to deal with | 31 // This is the interface exposed to the rest of the codebase to deal with |
| 31 // memory tracing. The main entry point for clients is represented by | 32 // memory tracing. The main entry point for clients is represented by |
| 32 // RequestDumpPoint(). The extension by Un(RegisterDumpProvider). | 33 // RequestDumpPoint(). The extension by Un(RegisterDumpProvider). |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 using MemoryDumpProviderInfoSet = std::set<MemoryDumpProviderInfo>; | 153 using MemoryDumpProviderInfoSet = std::set<MemoryDumpProviderInfo>; |
| 153 | 154 |
| 154 // Holds the state of a process memory dump that needs to be carried over | 155 // Holds the state of a process memory dump that needs to be carried over |
| 155 // across threads in order to fulfil an asynchronous CreateProcessDump() | 156 // across threads in order to fulfil an asynchronous CreateProcessDump() |
| 156 // request. At any time exactly one thread owns a ProcessMemoryDumpAsyncState. | 157 // request. At any time exactly one thread owns a ProcessMemoryDumpAsyncState. |
| 157 struct ProcessMemoryDumpAsyncState { | 158 struct ProcessMemoryDumpAsyncState { |
| 158 ProcessMemoryDumpAsyncState( | 159 ProcessMemoryDumpAsyncState( |
| 159 MemoryDumpRequestArgs req_args, | 160 MemoryDumpRequestArgs req_args, |
| 160 MemoryDumpProviderInfoSet::iterator next_dump_provider, | 161 MemoryDumpProviderInfoSet::iterator next_dump_provider, |
| 161 const scoped_refptr<MemoryDumpSessionState>& session_state, | 162 const scoped_refptr<MemoryDumpSessionState>& session_state, |
| 162 MemoryDumpCallback callback); | 163 MemoryDumpCallback callback, |
| 164 const scoped_refptr<SingleThreadTaskRunner>& dump_thread_task_runner); |
| 163 ~ProcessMemoryDumpAsyncState(); | 165 ~ProcessMemoryDumpAsyncState(); |
| 164 | 166 |
| 165 // The ProcessMemoryDump container, where each dump provider will dump its | 167 // The ProcessMemoryDump container, where each dump provider will dump its |
| 166 // own MemoryAllocatorDump(s) upon the OnMemoryDump() call. | 168 // own MemoryAllocatorDump(s) upon the OnMemoryDump() call. |
| 167 ProcessMemoryDump process_memory_dump; | 169 ProcessMemoryDump process_memory_dump; |
| 168 | 170 |
| 169 // The arguments passed to the initial CreateProcessDump() request. | 171 // The arguments passed to the initial CreateProcessDump() request. |
| 170 const MemoryDumpRequestArgs req_args; | 172 const MemoryDumpRequestArgs req_args; |
| 171 | 173 |
| 172 // The |dump_providers_| iterator to the next dump provider that should be | 174 // The |dump_providers_| iterator to the next dump provider that should be |
| 173 // invoked (or dump_providers_.end() if at the end of the sequence). | 175 // invoked (or dump_providers_.end() if at the end of the sequence). |
| 174 MemoryDumpProviderInfoSet::iterator next_dump_provider; | 176 MemoryDumpProviderInfoSet::iterator next_dump_provider; |
| 175 | 177 |
| 176 // Callback passed to the initial call to CreateProcessDump(). | 178 // Callback passed to the initial call to CreateProcessDump(). |
| 177 MemoryDumpCallback callback; | 179 MemoryDumpCallback callback; |
| 178 | 180 |
| 179 // The thread on which FinalizeDumpAndAddToTrace() (and hence |callback|) | 181 // The thread on which FinalizeDumpAndAddToTrace() (and hence |callback|) |
| 180 // should be invoked. This is the thread on which the initial | 182 // should be invoked. This is the thread on which the initial |
| 181 // CreateProcessDump() request was called. | 183 // CreateProcessDump() request was called. |
| 182 const scoped_refptr<SingleThreadTaskRunner> task_runner; | 184 const scoped_refptr<SingleThreadTaskRunner> callback_task_runner; |
| 185 |
| 186 // The thread on which unbound dump providers should be invoked. |
| 187 // This is essentially |dump_thread_|.task_runner() but needs to be kept |
| 188 // as a separate variable as it needs to be accessed by arbitrary dumpers' |
| 189 // threads outside of the lock_ to avoid races when disabling tracing. |
| 190 // It is immutable for all the duration of a tracing session. |
| 191 const scoped_refptr<SingleThreadTaskRunner> dump_thread_task_runner; |
| 183 | 192 |
| 184 private: | 193 private: |
| 185 DISALLOW_COPY_AND_ASSIGN(ProcessMemoryDumpAsyncState); | 194 DISALLOW_COPY_AND_ASSIGN(ProcessMemoryDumpAsyncState); |
| 186 }; | 195 }; |
| 187 | 196 |
| 188 static const int kMaxConsecutiveFailuresCount; | 197 static const int kMaxConsecutiveFailuresCount; |
| 189 static const char* const kSystemAllocatorPoolName; | 198 static const char* const kSystemAllocatorPoolName; |
| 190 | 199 |
| 191 MemoryDumpManager(); | 200 MemoryDumpManager(); |
| 192 ~MemoryDumpManager() override; | 201 ~MemoryDumpManager() override; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 // to guard against disabling logging while dumping on another thread. | 235 // to guard against disabling logging while dumping on another thread. |
| 227 Lock lock_; | 236 Lock lock_; |
| 228 | 237 |
| 229 // Optimization to avoid attempting any memory dump (i.e. to not walk an empty | 238 // Optimization to avoid attempting any memory dump (i.e. to not walk an empty |
| 230 // dump_providers_enabled_ list) when tracing is not enabled. | 239 // dump_providers_enabled_ list) when tracing is not enabled. |
| 231 subtle::AtomicWord memory_tracing_enabled_; | 240 subtle::AtomicWord memory_tracing_enabled_; |
| 232 | 241 |
| 233 // For time-triggered periodic dumps. | 242 // For time-triggered periodic dumps. |
| 234 RepeatingTimer periodic_dump_timer_; | 243 RepeatingTimer periodic_dump_timer_; |
| 235 | 244 |
| 245 // Thread used for MemoryDumpProviders which don't specify a thread affinity. |
| 246 scoped_ptr<Thread> dump_thread_; |
| 247 |
| 236 // The unique id of the child process. This is created only for tracing and is | 248 // The unique id of the child process. This is created only for tracing and is |
| 237 // expected to be valid only when tracing is enabled. | 249 // expected to be valid only when tracing is enabled. |
| 238 uint64_t tracing_process_id_; | 250 uint64_t tracing_process_id_; |
| 239 | 251 |
| 240 // When true, calling |RegisterMemoryDumpProvider| is a no-op. | 252 // When true, calling |RegisterMemoryDumpProvider| is a no-op. |
| 241 bool dumper_registrations_ignored_for_testing_; | 253 bool dumper_registrations_ignored_for_testing_; |
| 242 | 254 |
| 243 // Whether new memory dump providers should be told to enable heap profiling. | 255 // Whether new memory dump providers should be told to enable heap profiling. |
| 244 bool heap_profiling_enabled_; | 256 bool heap_profiling_enabled_; |
| 245 | 257 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 267 } | 279 } |
| 268 | 280 |
| 269 private: | 281 private: |
| 270 DISALLOW_COPY_AND_ASSIGN(MemoryDumpManagerDelegate); | 282 DISALLOW_COPY_AND_ASSIGN(MemoryDumpManagerDelegate); |
| 271 }; | 283 }; |
| 272 | 284 |
| 273 } // namespace trace_event | 285 } // namespace trace_event |
| 274 } // namespace base | 286 } // namespace base |
| 275 | 287 |
| 276 #endif // BASE_TRACE_EVENT_MEMORY_DUMP_MANAGER_H_ | 288 #endif // BASE_TRACE_EVENT_MEMORY_DUMP_MANAGER_H_ |
| OLD | NEW |