|  | // Copyright 2017 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_PROVIDER_INFO_H_ | 
|  | #define BASE_TRACE_EVENT_MEMORY_DUMP_PROVIDER_INFO_H_ | 
|  |  | 
|  | #include <memory> | 
|  | #include <set> | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "base/memory/ref_counted.h" | 
|  | #include "base/trace_event/memory_dump_provider.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | class SequencedTaskRunner; | 
|  |  | 
|  | namespace trace_event { | 
|  |  | 
|  | // Wraps a MemoryDumpProvider (MDP), which is registered via | 
|  | // MemoryDumpManager(MDM)::RegisterDumpProvider(), holding the extra information | 
|  | // required to deal with it (which task runner it should be invoked onto, | 
|  | // whether it has been disabled, etc.) | 
|  | // More importantly, having a refptr to this object guarantees that a MDP that | 
|  | // is not thread-bound (hence which can only be unregistered via | 
|  | // MDM::UnregisterAndDeleteDumpProviderSoon()) will stay alive as long as the | 
|  | // refptr is held. | 
|  | // | 
|  | // Lifetime: | 
|  | // At any time, there is at most one instance of this class for each instance | 
|  | // of a given MemoryDumpProvider, but there might be several scoped_refptr | 
|  | // holding onto each of this. Specifically: | 
|  | // - In nominal conditions, there is a refptr for each registered MDP in the | 
|  | //   MDM's |dump_providers_| list. | 
|  | // - In most cases, the only refptr (in the |dump_providers_| list) is destroyed | 
|  | //   by MDM::UnregisterDumpProvider(). | 
|  | // - However, when MDM starts a dump, the list of refptrs is copied into the | 
|  | //   ProcessMemoryDumpAsyncState. That list is pruned as MDP(s) are invoked. | 
|  | // - If UnregisterDumpProvider() is called on a non-thread-bound MDP while a | 
|  | //   dump is in progress, the extar extra of the handle is destroyed in | 
|  | //   MDM::SetupNextMemoryDump() or MDM::InvokeOnMemoryDump(), when the copy | 
|  | //   inside ProcessMemoryDumpAsyncState is erase()-d. | 
|  | // - The PeakDetector can keep extra refptrs when enabled. | 
|  | struct BASE_EXPORT MemoryDumpProviderInfo | 
|  | : public RefCountedThreadSafe<MemoryDumpProviderInfo> { | 
|  | public: | 
|  | // Define a total order based on the |task_runner| affinity, so that MDPs | 
|  | // belonging to the same SequencedTaskRunner are adjacent in the set. | 
|  | struct Comparator { | 
|  | bool operator()(const scoped_refptr<MemoryDumpProviderInfo>& a, | 
|  | const scoped_refptr<MemoryDumpProviderInfo>& b) const; | 
|  | }; | 
|  | using OrderedSet = | 
|  | std::set<scoped_refptr<MemoryDumpProviderInfo>, Comparator>; | 
|  |  | 
|  | MemoryDumpProviderInfo(MemoryDumpProvider* dump_provider, | 
|  | const char* name, | 
|  | scoped_refptr<SequencedTaskRunner> task_runner, | 
|  | const MemoryDumpProvider::Options& options, | 
|  | bool whitelisted_for_background_mode); | 
|  |  | 
|  | // It is safe to access the const fields below from any thread as they are | 
|  | // never mutated. | 
|  |  | 
|  | MemoryDumpProvider* const dump_provider; | 
|  |  | 
|  | // The |options| arg passed to MDM::RegisterDumpProvider(). | 
|  | const MemoryDumpProvider::Options options; | 
|  |  | 
|  | // Human readable name, not unique (distinct MDP instances might have the same | 
|  | // name). Used for debugging, testing and whitelisting for BACKGROUND mode. | 
|  | const char* const name; | 
|  |  | 
|  | // The task runner on which the MDP::OnMemoryDump call should be posted onto. | 
|  | // Can be nullptr, in which case the MDP will be invoked on a background | 
|  | // thread handled by MDM. | 
|  | const scoped_refptr<SequencedTaskRunner> task_runner; | 
|  |  | 
|  | // True if the dump provider is whitelisted for background mode. | 
|  | const bool whitelisted_for_background_mode; | 
|  |  | 
|  | // These fields below, instead, are not thread safe and can be mutated only: | 
|  | // - On the |task_runner|, when not null (i.e. for thread-bound MDPS). | 
|  | // - By the MDM's background thread (or in any other way that guarantees | 
|  | //   sequencing) for non-thread-bound MDPs. | 
|  |  | 
|  | // Used to transfer ownership for UnregisterAndDeleteDumpProviderSoon(). | 
|  | // nullptr in all other cases. | 
|  | std::unique_ptr<MemoryDumpProvider> owned_dump_provider; | 
|  |  | 
|  | // For fail-safe logic (auto-disable failing MDPs). | 
|  | int consecutive_failures; | 
|  |  | 
|  | // Flagged either by the auto-disable logic or during unregistration. | 
|  | bool disabled; | 
|  |  | 
|  | private: | 
|  | friend class base::RefCountedThreadSafe<MemoryDumpProviderInfo>; | 
|  | ~MemoryDumpProviderInfo(); | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(MemoryDumpProviderInfo); | 
|  | }; | 
|  |  | 
|  | }  // namespace trace_event | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_TRACE_EVENT_MEMORY_DUMP_PROVIDER_INFO_H_ |