| Index: base/trace_event/memory_dump_manager.h
|
| diff --git a/base/trace_event/memory_dump_manager.h b/base/trace_event/memory_dump_manager.h
|
| index 0718d32e9525ad3527a4e914f2033b2f9d8ec623..92c5cb867dbd1f664abee0e3271238566c71ad15 100644
|
| --- a/base/trace_event/memory_dump_manager.h
|
| +++ b/base/trace_event/memory_dump_manager.h
|
| @@ -5,7 +5,7 @@
|
| #ifndef BASE_TRACE_EVENT_MEMORY_DUMP_MANAGER_H_
|
| #define BASE_TRACE_EVENT_MEMORY_DUMP_MANAGER_H_
|
|
|
| -#include <vector>
|
| +#include <set>
|
|
|
| #include "base/atomicops.h"
|
| #include "base/containers/hash_tables.h"
|
| @@ -14,6 +14,7 @@
|
| #include "base/synchronization/lock.h"
|
| #include "base/timer/timer.h"
|
| #include "base/trace_event/memory_dump_request_args.h"
|
| +#include "base/trace_event/process_memory_dump.h"
|
| #include "base/trace_event/trace_event.h"
|
|
|
| namespace base {
|
| @@ -22,13 +23,8 @@ class SingleThreadTaskRunner;
|
|
|
| namespace trace_event {
|
|
|
| -namespace {
|
| -class ProcessMemoryDumpHolder;
|
| -}
|
| -
|
| class MemoryDumpManagerDelegate;
|
| class MemoryDumpProvider;
|
| -class ProcessMemoryDump;
|
| class MemoryDumpSessionState;
|
|
|
| // This is the interface exposed to the rest of the codebase to deal with
|
| @@ -99,32 +95,81 @@ class BASE_EXPORT MemoryDumpManager : public TraceLog::EnabledStateObserver {
|
| uint64 tracing_process_id() const { return tracing_process_id_; }
|
|
|
| private:
|
| + friend struct DefaultDeleter<MemoryDumpManager>; // For the testing instance.
|
| + friend struct DefaultSingletonTraits<MemoryDumpManager>;
|
| + friend class MemoryDumpManagerDelegate;
|
| + friend class MemoryDumpManagerTest;
|
| + FRIEND_TEST_ALL_PREFIXES(MemoryDumpManagerTest, DisableFailingDumpers);
|
| +
|
| // Descriptor struct used to hold information about registered MDPs. It is
|
| - // deliberately copyable, in order to allow to be used as hash_map value.
|
| + // deliberately copyable, in order to allow it to be used as std::set value.
|
| struct MemoryDumpProviderInfo {
|
| MemoryDumpProviderInfo(
|
| + MemoryDumpProvider* dump_provider,
|
| const scoped_refptr<SingleThreadTaskRunner>& task_runner);
|
| ~MemoryDumpProviderInfo();
|
|
|
| + // Define a total order based on the thread (i.e. |task_runner|) affinity,
|
| + // so that all MDP belonging to the same thread are adjacent in the set.
|
| + bool operator<(const MemoryDumpProviderInfo& other) const;
|
| +
|
| + MemoryDumpProvider* const dump_provider;
|
| scoped_refptr<SingleThreadTaskRunner> task_runner; // Optional.
|
| - int consecutive_failures; // Number of times the provider failed (to
|
| - // disable the MDPs).
|
| - bool disabled; // For fail-safe logic (auto-disable failing MDPs).
|
| +
|
| + // For fail-safe logic (auto-disable failing MDPs). These fields are mutable
|
| + // as can be safely changed without impacting the order within the set.
|
| + mutable int consecutive_failures;
|
| + mutable bool disabled;
|
| };
|
|
|
| - friend struct DefaultDeleter<MemoryDumpManager>; // For the testing instance.
|
| - friend struct DefaultSingletonTraits<MemoryDumpManager>;
|
| - friend class MemoryDumpManagerDelegate;
|
| - friend class MemoryDumpManagerTest;
|
| - FRIEND_TEST_ALL_PREFIXES(MemoryDumpManagerTest, DisableFailingDumpers);
|
| + using MemoryDumpProviderInfoSet = std::set<MemoryDumpProviderInfo>;
|
|
|
| - static const int kMaxConsecutiveFailuresCount;
|
| + // Holds the state of a process memory dump that needs to be carried over
|
| + // across threads in order to fulfil an asynchronous CreateProcessDump()
|
| + // request. At any time exactly one thread owns a ProcessMemoryDumpAsyncState.
|
| + struct ProcessMemoryDumpAsyncState {
|
| + ProcessMemoryDumpAsyncState(
|
| + MemoryDumpRequestArgs req_args,
|
| + MemoryDumpProviderInfoSet::iterator next_dump_provider,
|
| + const scoped_refptr<MemoryDumpSessionState>& session_state,
|
| + MemoryDumpCallback callback);
|
| + ~ProcessMemoryDumpAsyncState();
|
|
|
| - static void SetInstanceForTesting(MemoryDumpManager* instance);
|
| + // The ProcessMemoryDump container, where each dump provider will dump its
|
| + // own MemoryAllocatorDump(s) upon the OnMemoryDump() call.
|
| + ProcessMemoryDump process_memory_dump;
|
| +
|
| + // The arguments passed to the initial CreateProcessDump() request.
|
| + const MemoryDumpRequestArgs req_args;
|
| +
|
| + // The |dump_providers_| iterator to the next dump provider that should be
|
| + // invoked (or dump_providers_.end() if at the end of the sequence).
|
| + MemoryDumpProviderInfoSet::iterator next_dump_provider;
|
| +
|
| + // Callback passed to the initial call to CreateProcessDump().
|
| + MemoryDumpCallback callback;
|
| +
|
| + // The thread on which FinalizeDumpAndAddToTrace() (and hence |callback|)
|
| + // should be invoked. This is the thread on which the initial
|
| + // CreateProcessDump() request was called.
|
| + const scoped_refptr<SingleThreadTaskRunner> task_runner;
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(ProcessMemoryDumpAsyncState);
|
| + };
|
| +
|
| + static const int kMaxConsecutiveFailuresCount;
|
|
|
| MemoryDumpManager();
|
| virtual ~MemoryDumpManager();
|
|
|
| + static void SetInstanceForTesting(MemoryDumpManager* instance);
|
| + static void FinalizeDumpAndAddToTrace(
|
| + scoped_ptr<ProcessMemoryDumpAsyncState> pmd_async_state);
|
| + static void AbortDumpLocked(MemoryDumpCallback callback,
|
| + scoped_refptr<SingleThreadTaskRunner> task_runner,
|
| + uint64 dump_guid);
|
| +
|
| // Internal, used only by MemoryDumpManagerDelegate.
|
| // Creates a memory dump for the current process and appends it to the trace.
|
| // |callback| will be invoked asynchronously upon completion on the same
|
| @@ -132,11 +177,10 @@ class BASE_EXPORT MemoryDumpManager : public TraceLog::EnabledStateObserver {
|
| void CreateProcessDump(const MemoryDumpRequestArgs& args,
|
| const MemoryDumpCallback& callback);
|
|
|
| - bool InvokeDumpProviderLocked(MemoryDumpProvider* mdp,
|
| - ProcessMemoryDump* pmd);
|
| + // Continues the ProcessMemoryDump started by CreateProcessDump(), hopping
|
| + // across threads as needed as specified by MDPs in RegisterDumpProvider().
|
| void ContinueAsyncProcessDump(
|
| - MemoryDumpProvider* mdp,
|
| - scoped_refptr<ProcessMemoryDumpHolder> pmd_holder);
|
| + scoped_ptr<ProcessMemoryDumpAsyncState> pmd_async_state);
|
|
|
| // Pass kInvalidTracingProcessId to invalidate the id.
|
| void set_tracing_process_id(uint64 id) {
|
| @@ -145,7 +189,13 @@ class BASE_EXPORT MemoryDumpManager : public TraceLog::EnabledStateObserver {
|
| tracing_process_id_ = id;
|
| }
|
|
|
| - hash_map<MemoryDumpProvider*, MemoryDumpProviderInfo> dump_providers_;
|
| + // An ordererd set of registered MemoryDumpProviderInfo(s), sorted by thread
|
| + // affinity (MDPs belonging to the same thread are adjacent).
|
| + MemoryDumpProviderInfoSet dump_providers_;
|
| +
|
| + // Flag used to signal that some provider was removed from |dump_providers_|
|
| + // and therefore the current memory dump (if any) should be aborted.
|
| + bool did_unregister_dump_provider_;
|
|
|
| // Shared among all the PMDs to keep state scoped to the tracing session.
|
| scoped_refptr<MemoryDumpSessionState> session_state_;
|
|
|