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

Side by Side Diff: content/browser/tracing/trace_message_filter.cc

Issue 2833873003: WIP: The tracing service prototype
Patch Set: sync Created 3 years, 7 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
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/tracing/trace_message_filter.h" 5 #include "content/browser/tracing/trace_message_filter.h"
6 6
7 #include "components/tracing/common/tracing_messages.h" 7 #include "components/tracing/common/tracing_messages.h"
8 #include "content/browser/tracing/background_tracing_manager_impl.h" 8 #include "content/browser/tracing/background_tracing_manager_impl.h"
9 #include "content/browser/tracing/tracing_controller_impl.h" 9 #include "content/browser/tracing/tracing_controller_impl.h"
10 #include "content/common/child_process_host_impl.h" 10 #include "content/common/child_process_host_impl.h"
11 11
12 namespace content { 12 namespace content {
13 13
14 TraceMessageFilter::TraceMessageFilter(int child_process_id) 14 TraceMessageFilter::TraceMessageFilter(int child_process_id)
15 : BrowserMessageFilter(TracingMsgStart), 15 : BrowserMessageFilter(TracingMsgStart) {}
16 has_child_(false),
17 tracing_process_id_(
18 ChildProcessHostImpl::ChildProcessUniqueIdToTracingProcessId(
19 child_process_id)),
20 is_awaiting_end_ack_(false),
21 is_awaiting_buffer_percent_full_ack_(false) {
22 }
23 16
24 TraceMessageFilter::~TraceMessageFilter() {} 17 TraceMessageFilter::~TraceMessageFilter() {}
25 18
26 void TraceMessageFilter::OnChannelClosing() {
27 if (has_child_) {
28 if (is_awaiting_end_ack_)
29 OnEndTracingAck(std::vector<std::string>());
30
31 if (is_awaiting_buffer_percent_full_ack_)
32 OnTraceLogStatusReply(base::trace_event::TraceLogStatus());
33
34 TracingControllerImpl::GetInstance()->RemoveTraceMessageFilter(this);
35 }
36 }
37
38 bool TraceMessageFilter::OnMessageReceived(const IPC::Message& message) { 19 bool TraceMessageFilter::OnMessageReceived(const IPC::Message& message) {
39 // Always on IO thread (BrowserMessageFilter guarantee). 20 // Always on IO thread (BrowserMessageFilter guarantee).
40 bool handled = true; 21 bool handled = true;
41 IPC_BEGIN_MESSAGE_MAP(TraceMessageFilter, message) 22 IPC_BEGIN_MESSAGE_MAP(TraceMessageFilter, message)
42 IPC_MESSAGE_HANDLER(TracingHostMsg_ChildSupportsTracing,
43 OnChildSupportsTracing)
44 IPC_MESSAGE_HANDLER(TracingHostMsg_EndTracingAck, OnEndTracingAck)
45 IPC_MESSAGE_HANDLER(TracingHostMsg_TraceDataCollected,
46 OnTraceDataCollected)
47 IPC_MESSAGE_HANDLER(TracingHostMsg_TraceLogStatusReply,
48 OnTraceLogStatusReply)
49 IPC_MESSAGE_HANDLER(TracingHostMsg_TriggerBackgroundTrace, 23 IPC_MESSAGE_HANDLER(TracingHostMsg_TriggerBackgroundTrace,
50 OnTriggerBackgroundTrace) 24 OnTriggerBackgroundTrace)
51 IPC_MESSAGE_HANDLER(TracingHostMsg_AbortBackgroundTrace, 25 IPC_MESSAGE_HANDLER(TracingHostMsg_AbortBackgroundTrace,
52 OnAbortBackgroundTrace) 26 OnAbortBackgroundTrace)
53 IPC_MESSAGE_UNHANDLED(handled = false) 27 IPC_MESSAGE_UNHANDLED(handled = false)
54 IPC_END_MESSAGE_MAP() 28 IPC_END_MESSAGE_MAP()
55 return handled; 29 return handled;
56 } 30 }
57 31
58 void TraceMessageFilter::SendBeginTracing(
59 const base::trace_event::TraceConfig& trace_config) {
60 DCHECK_CURRENTLY_ON(BrowserThread::UI);
61 Send(new TracingMsg_BeginTracing(
62 trace_config.ToString(), base::TimeTicks::Now(), tracing_process_id_));
63 }
64
65 void TraceMessageFilter::SendEndTracing() {
66 DCHECK_CURRENTLY_ON(BrowserThread::UI);
67 DCHECK(!is_awaiting_end_ack_);
68 is_awaiting_end_ack_ = true;
69 Send(new TracingMsg_EndTracing);
70 }
71
72 void TraceMessageFilter::SendCancelTracing() {
73 DCHECK_CURRENTLY_ON(BrowserThread::UI);
74 DCHECK(!is_awaiting_end_ack_);
75 is_awaiting_end_ack_ = true;
76 Send(new TracingMsg_CancelTracing);
77 }
78
79 void TraceMessageFilter::SendGetTraceLogStatus() {
80 DCHECK_CURRENTLY_ON(BrowserThread::UI);
81 DCHECK(!is_awaiting_buffer_percent_full_ack_);
82 is_awaiting_buffer_percent_full_ack_ = true;
83 Send(new TracingMsg_GetTraceLogStatus);
84 }
85
86 void TraceMessageFilter::OnChildSupportsTracing() {
87 has_child_ = true;
88 TracingControllerImpl::GetInstance()->AddTraceMessageFilter(this);
89 }
90
91 void TraceMessageFilter::OnEndTracingAck(
92 const std::vector<std::string>& known_categories) {
93 // is_awaiting_end_ack_ should always be true here, but check in case the
94 // child process is compromised.
95 if (is_awaiting_end_ack_) {
96 is_awaiting_end_ack_ = false;
97 TracingControllerImpl::GetInstance()->OnStopTracingAcked(
98 this, known_categories);
99 } else {
100 NOTREACHED();
101 }
102 }
103
104 void TraceMessageFilter::OnTraceDataCollected(const std::string& data) {
105 scoped_refptr<base::RefCountedString> data_ptr(new base::RefCountedString());
106 data_ptr->data() = data;
107 TracingControllerImpl::GetInstance()->OnTraceDataCollected(data_ptr);
108 }
109
110 void TraceMessageFilter::OnTraceLogStatusReply(
111 const base::trace_event::TraceLogStatus& status) {
112 if (is_awaiting_buffer_percent_full_ack_) {
113 is_awaiting_buffer_percent_full_ack_ = false;
114 TracingControllerImpl::GetInstance()->OnTraceLogStatusReply(this, status);
115 } else {
116 NOTREACHED();
117 }
118 }
119
120 void TraceMessageFilter::OnTriggerBackgroundTrace(const std::string& name) { 32 void TraceMessageFilter::OnTriggerBackgroundTrace(const std::string& name) {
121 BackgroundTracingManagerImpl::GetInstance()->OnHistogramTrigger(name); 33 BackgroundTracingManagerImpl::GetInstance()->OnHistogramTrigger(name);
122 } 34 }
123 35
124 void TraceMessageFilter::OnAbortBackgroundTrace() { 36 void TraceMessageFilter::OnAbortBackgroundTrace() {
125 BackgroundTracingManagerImpl::GetInstance()->AbortScenario(); 37 BackgroundTracingManagerImpl::GetInstance()->AbortScenario();
126 } 38 }
127 39
128 } // namespace content 40 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/tracing/trace_message_filter.h ('k') | content/browser/tracing/tracing_controller_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698