| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef BASE_TRACE_EVENT_MEMORY_DUMP_MANAGER_H_ |
| #define BASE_TRACE_EVENT_MEMORY_DUMP_MANAGER_H_ |
| |
| #include <vector> |
| |
| #include "base/atomicops.h" |
| #include "base/memory/singleton.h" |
| #include "base/synchronization/lock.h" |
| #include "base/trace_event/trace_event.h" |
| |
| namespace base { |
| namespace trace_event { |
| |
| class MemoryDumpProvider; |
| |
| // Captures the reason why a dump point is being requested. This is to allow |
| // selective enabling of dump points, filtering and post-processing. |
| enum class DumpPointType { |
| TASK_BEGIN, // Dumping memory at the beginning of a message-loop task. |
| TASK_END, // Dumping memory at the ending of a message-loop task. |
| PERIODIC_INTERVAL, // Dumping memory at periodic intervals. |
| EXPLICITLY_TRIGGERED, // Non maskable dump request. |
| }; |
| |
| // This is the interface exposed to the rest of the codebase to deal with |
| // memory tracing. The main entry point for clients is represented by |
| // RequestDumpPoint(). The extension by Un(RegisterDumpProvider). |
| class BASE_EXPORT MemoryDumpManager : public TraceLog::EnabledStateObserver { |
| public: |
| static MemoryDumpManager* GetInstance(); |
| |
| // Invoked once per process to register the TraceLog observer. |
| void Initialize(); |
| |
| // MemoryDumpManager does NOT take memory ownership of |mdp|, which is |
| // expected to be a singleton. |
| void RegisterDumpProvider(MemoryDumpProvider* mdp); |
| void UnregisterDumpProvider(MemoryDumpProvider* mdp); |
| |
| // Requests a memory dump. The dump might happen or not depending on the |
| // filters and categories specified when enabling tracing. |
| void RequestDumpPoint(DumpPointType type); |
| |
| // TraceLog::EnabledStateObserver implementation. |
| void OnTraceLogEnabled() override; |
| void OnTraceLogDisabled() override; |
| |
| private: |
| friend struct DefaultSingletonTraits<MemoryDumpManager>; |
| friend class MemoryDumpManagerTest; |
| |
| static const char kTraceCategory[]; |
| |
| MemoryDumpManager(); |
| virtual ~MemoryDumpManager(); |
| |
| // Tears down the singleton instance. |
| static void DeleteForTesting(); |
| |
| // Broadcasts the dump requests to the other processes. |
| void BroadcastDumpRequest(); |
| |
| // Creates a dump point for the current process and appends it to the trace. |
| void CreateLocalDumpPoint(); |
| |
| std::vector<MemoryDumpProvider*> dump_providers_registered_; // Not owned. |
| std::vector<MemoryDumpProvider*> dump_providers_enabled_; // Not owned. |
| |
| // Protects from concurrent accesses to the |dump_providers_*|, e.g., tearing |
| // down logging while creating a dump point on another thread. |
| Lock lock_; |
| |
| // Optimization to avoid attempting any dump point (i.e. to not walk an empty |
| // dump_providers_enabled_ list) when tracing is not enabled. |
| subtle::AtomicWord memory_tracing_enabled_; |
| |
| DISALLOW_COPY_AND_ASSIGN(MemoryDumpManager); |
| }; |
| |
| } // namespace trace_event |
| } // namespace base |
| |
| #endif // BASE_TRACE_EVENT_MEMORY_DUMP_MANAGER_H_ |