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

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

Issue 935333002: Update from https://crrev.com/316786 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 10 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "base/trace_event/memory_dump_manager.h"
6
7 #include <algorithm>
8
9 #include "base/compiler_specific.h"
10 #include "base/trace_event/memory_dump_provider.h"
11 #include "base/trace_event/process_memory_dump.h"
12
13 // TODO(primiano): in a separate CL rename DeleteTraceLogForTesting into
14 // something like base::internal::TeardownSingletonForTesting so we don't have
15 // to add a new friend to singleton each time.
16 class DeleteTraceLogForTesting {
17 public:
18 static void Delete() {
19 Singleton<
20 base::trace_event::MemoryDumpManager,
21 LeakySingletonTraits<base::trace_event::MemoryDumpManager>>::OnExit(0);
22 }
23 };
24
25 namespace base {
26 namespace trace_event {
27
28 // TODO(primiano): this should be smarter and should do something similar to
29 // trace event synthetic delays.
30 const char MemoryDumpManager::kTraceCategory[] =
31 TRACE_DISABLED_BY_DEFAULT("memory-dumps");
32
33 // static
34 MemoryDumpManager* MemoryDumpManager::GetInstance() {
35 return Singleton<MemoryDumpManager,
36 LeakySingletonTraits<MemoryDumpManager>>::get();
37 }
38
39 // static
40 void MemoryDumpManager::DeleteForTesting() {
41 DeleteTraceLogForTesting::Delete();
42 }
43
44 MemoryDumpManager::MemoryDumpManager() : memory_tracing_enabled_(0) {
45 }
46
47 MemoryDumpManager::~MemoryDumpManager() {
48 base::trace_event::TraceLog::GetInstance()->RemoveEnabledStateObserver(this);
49 }
50
51 void MemoryDumpManager::Initialize() {
52 TRACE_EVENT0(kTraceCategory, "init"); // Add to trace-viewer category list.
53 trace_event::TraceLog::GetInstance()->AddEnabledStateObserver(this);
54 }
55
56 void MemoryDumpManager::RegisterDumpProvider(MemoryDumpProvider* mdp) {
57 AutoLock lock(lock_);
58 if (std::find(dump_providers_registered_.begin(),
59 dump_providers_registered_.end(),
60 mdp) != dump_providers_registered_.end()) {
61 return;
62 }
63 dump_providers_registered_.push_back(mdp);
64 }
65
66 void MemoryDumpManager::UnregisterDumpProvider(MemoryDumpProvider* mdp) {
67 AutoLock lock(lock_);
68
69 // Remove from the registered providers list.
70 auto it = std::find(dump_providers_registered_.begin(),
71 dump_providers_registered_.end(), mdp);
72 if (it != dump_providers_registered_.end())
73 dump_providers_registered_.erase(it);
74
75 // Remove from the enabled providers list. This is to deal with the case that
76 // UnregisterDumpProvider is called while the trace is enabled.
77 it = std::find(dump_providers_enabled_.begin(), dump_providers_enabled_.end(),
78 mdp);
79 if (it != dump_providers_enabled_.end())
80 dump_providers_enabled_.erase(it);
81 }
82
83 void MemoryDumpManager::RequestDumpPoint(DumpPointType type) {
84 // TODO(primiano): this will have more logic, IPC broadcast & co.
85 // Bail out immediately if tracing is not enabled at all.
86 if (!UNLIKELY(subtle::NoBarrier_Load(&memory_tracing_enabled_)))
87 return;
88
89 CreateLocalDumpPoint();
90 }
91
92 void MemoryDumpManager::BroadcastDumpRequest() {
93 NOTREACHED(); // TODO(primiano): implement IPC synchronization.
94 }
95
96 // Creates a dump point for the current process and appends it to the trace.
97 void MemoryDumpManager::CreateLocalDumpPoint() {
98 AutoLock lock(lock_);
99 // TRACE_EVENT_* macros don't induce scoped_refptr type inference, hence we
100 // need the base ConvertableToTraceFormat and the upcast below. The
101 // alternative would be unnecessarily expensive (double Acquire/Release).
102 scoped_refptr<ConvertableToTraceFormat> pmd(new ProcessMemoryDump());
103
104 for (MemoryDumpProvider* dump_provider : dump_providers_enabled_) {
105 dump_provider->DumpInto(static_cast<ProcessMemoryDump*>(pmd.get()));
106 }
107
108 // TODO(primiano): add the dump point to the trace at this point.
109 }
110
111 void MemoryDumpManager::OnTraceLogEnabled() {
112 // TODO(primiano): at this point we query TraceLog::GetCurrentCategoryFilter
113 // to figure out (and cache) which dumpers should be enabled or not.
114 // For the moment piggy back everything on the generic "memory" category.
115 bool enabled;
116 TRACE_EVENT_CATEGORY_GROUP_ENABLED(kTraceCategory, &enabled);
117
118 AutoLock lock(lock_);
119 if (enabled) {
120 dump_providers_enabled_.assign(dump_providers_registered_.begin(),
121 dump_providers_registered_.end());
122 } else {
123 dump_providers_enabled_.clear();
124 }
125 subtle::NoBarrier_Store(&memory_tracing_enabled_, 1);
126 }
127
128 void MemoryDumpManager::OnTraceLogDisabled() {
129 AutoLock lock(lock_);
130 dump_providers_enabled_.clear();
131 subtle::NoBarrier_Store(&memory_tracing_enabled_, 0);
132 }
133
134 } // namespace trace_event
135 } // 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