OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2017 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_tracing_observer.h" | |
6 | |
7 #include "base/trace_event/memory_dump_manager.h" | |
8 #include "base/trace_event/trace_event_argument.h" | |
9 | |
10 namespace base { | |
11 namespace trace_event { | |
12 | |
13 namespace { | |
14 | |
15 const int kTraceEventNumArgs = 1; | |
16 const char* kTraceEventArgNames[] = {"dumps"}; | |
17 const unsigned char kTraceEventArgTypes[] = {TRACE_VALUE_TYPE_CONVERTABLE}; | |
18 | |
19 bool IsMemoryInfraTracingEnabled() { | |
20 bool enabled; | |
21 TRACE_EVENT_CATEGORY_GROUP_ENABLED(MemoryDumpManager::kTraceCategory, | |
22 &enabled); | |
23 return enabled; | |
24 } | |
25 | |
26 }; // namespace | |
27 | |
28 MemoryTracingObserver::MemoryTracingObserver( | |
29 TraceLog* trace_log, | |
30 MemoryDumpManager* memory_dump_manager) | |
31 : enabled_(false), | |
32 memory_dump_manager_(memory_dump_manager), | |
33 trace_log_(trace_log) { | |
34 // If tracing was enabled before initializing MemoryDumpManager, we missed the | |
35 // OnTraceLogEnabled() event. Synthetize it so we can late-join the party. | |
36 // IsEnabled is called before adding observer to avoid calling | |
37 // OnTraceLogEnabled twice. | |
38 bool is_tracing_already_enabled = trace_log_->IsEnabled(); | |
39 trace_log_->AddEnabledStateObserver(this); | |
40 if (is_tracing_already_enabled) | |
41 OnTraceLogEnabled(); | |
42 } | |
43 | |
44 MemoryTracingObserver::~MemoryTracingObserver() { | |
45 trace_log_->RemoveEnabledStateObserver(this); | |
46 } | |
47 | |
48 void MemoryTracingObserver::OnTraceLogEnabled() { | |
49 if (!IsMemoryInfraTracingEnabled()) | |
50 return; | |
51 | |
52 // Initialize the TraceLog for the current thread. This is to avoids that the | |
53 // TraceLog memory dump provider is registered lazily during the MDM Enable() | |
54 TraceLog::GetInstance()->InitializeThreadLocalEventBufferIfSupported(); | |
55 | |
56 const TraceConfig& trace_config = | |
57 TraceLog::GetInstance()->GetCurrentTraceConfig(); | |
58 const TraceConfig::MemoryDumpConfig& memory_dump_config = | |
59 trace_config.memory_dump_config(); | |
60 | |
61 enabled_ = true; | |
Primiano Tucci (use gerrit)
2017/04/21 13:14:17
sorry I just realized my comment was a bit ambiguo
hjd
2017/04/21 13:42:32
Done.
| |
62 memory_dump_manager_->Enable(memory_dump_config); | |
63 } | |
64 | |
65 void MemoryTracingObserver::OnTraceLogDisabled() { | |
66 memory_dump_manager_->Disable(); | |
67 enabled_ = false; | |
68 } | |
69 | |
70 bool MemoryTracingObserver::AddDumpToTraceIfEnabled( | |
71 const MemoryDumpRequestArgs* req_args, | |
72 const ProcessId pid, | |
73 const ProcessMemoryDump* process_memory_dump) { | |
74 if (!enabled_) | |
Primiano Tucci (use gerrit)
2017/04/21 13:14:16
this should really be IsMemoryInfraTracingEnabled(
hjd
2017/04/21 13:42:32
Done.
| |
75 return false; | |
76 | |
77 const uint64_t dump_guid = req_args->dump_guid; | |
78 | |
79 std::unique_ptr<TracedValue> traced_value(new TracedValue); | |
80 process_memory_dump->AsValueInto(traced_value.get()); | |
81 traced_value->SetString("level_of_detail", MemoryDumpLevelOfDetailToString( | |
82 req_args->level_of_detail)); | |
83 const char* const event_name = MemoryDumpTypeToString(req_args->dump_type); | |
84 | |
85 std::unique_ptr<ConvertableToTraceFormat> event_value( | |
86 std::move(traced_value)); | |
87 TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_PROCESS_ID( | |
88 TRACE_EVENT_PHASE_MEMORY_DUMP, | |
89 TraceLog::GetCategoryGroupEnabled(MemoryDumpManager::kTraceCategory), | |
90 event_name, trace_event_internal::kGlobalScope, dump_guid, pid, | |
91 kTraceEventNumArgs, kTraceEventArgNames, kTraceEventArgTypes, | |
92 nullptr /* arg_values */, &event_value, TRACE_EVENT_FLAG_HAS_ID); | |
93 | |
94 return true; | |
95 } | |
96 | |
97 } // namespace trace_event | |
98 } // namespace base | |
OLD | NEW |