OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/trace_controller.h" | 5 #include "content/browser/trace_controller.h" |
6 | 6 |
7 #include "base/bind.h" | |
8 #include "base/debug/trace_event.h" | |
9 #include "base/task.h" | 7 #include "base/task.h" |
10 #include "content/browser/browser_message_filter.h" | 8 #include "content/browser/browser_message_filter.h" |
11 #include "content/browser/trace_message_filter.h" | 9 #include "content/browser/trace_message_filter.h" |
12 #include "content/common/child_process_messages.h" | 10 #include "content/common/child_process_messages.h" |
| 11 #include "gpu/common/gpu_trace_event.h" |
13 | 12 |
14 | 13 |
15 TraceController::TraceController() : | 14 TraceController::TraceController() : |
16 subscriber_(NULL), | 15 subscriber_(NULL), |
17 pending_end_ack_count_(0), | 16 pending_end_ack_count_(0), |
18 pending_bpf_ack_count_(0), | 17 pending_bpf_ack_count_(0), |
19 maximum_bpf_(0.0f), | 18 maximum_bpf_(0.0f), |
20 is_tracing_(false) { | 19 is_tracing_(false) { |
21 base::debug::TraceLog::GetInstance()->SetOutputCallback( | 20 gpu::TraceLog::GetInstance()->SetOutputCallback( |
22 base::Bind(&TraceController::OnTraceDataCollected, | 21 NewCallback(this, &TraceController::OnTraceDataCollected)); |
23 base::Unretained(this))); | |
24 } | 22 } |
25 | 23 |
26 TraceController::~TraceController() { | 24 TraceController::~TraceController() { |
27 if (base::debug::TraceLog* trace_log = base::debug::TraceLog::GetInstance()) | 25 gpu::TraceLog::GetInstance()->SetOutputCallback(NULL); |
28 trace_log->SetOutputCallback(base::debug::TraceLog::OutputCallback()); | |
29 } | 26 } |
30 | 27 |
31 //static | 28 //static |
32 TraceController* TraceController::GetInstance() { | 29 TraceController* TraceController::GetInstance() { |
33 return Singleton<TraceController>::get(); | 30 return Singleton<TraceController>::get(); |
34 } | 31 } |
35 | 32 |
36 bool TraceController::BeginTracing(TraceSubscriber* subscriber) { | 33 bool TraceController::BeginTracing(TraceSubscriber* subscriber) { |
37 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 34 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
38 | 35 |
39 if (!can_begin_tracing() || | 36 if (!can_begin_tracing() || |
40 (subscriber_ != NULL && subscriber != subscriber_)) | 37 (subscriber_ != NULL && subscriber != subscriber_)) |
41 return false; | 38 return false; |
42 | 39 |
43 subscriber_ = subscriber; | 40 subscriber_ = subscriber; |
44 | 41 |
45 // Enable tracing | 42 // Enable tracing |
46 is_tracing_ = true; | 43 is_tracing_ = true; |
47 base::debug::TraceLog::GetInstance()->SetEnabled(true); | 44 gpu::TraceLog::GetInstance()->SetEnabled(true); |
48 | 45 |
49 // Notify all child processes. | 46 // Notify all child processes. |
50 for (FilterMap::iterator it = filters_.begin(); it != filters_.end(); ++it) { | 47 for (FilterMap::iterator it = filters_.begin(); it != filters_.end(); ++it) { |
51 it->get()->SendBeginTracing(); | 48 it->get()->SendBeginTracing(); |
52 } | 49 } |
53 | 50 |
54 return true; | 51 return true; |
55 } | 52 } |
56 | 53 |
57 bool TraceController::EndTracingAsync(TraceSubscriber* subscriber) { | 54 bool TraceController::EndTracingAsync(TraceSubscriber* subscriber) { |
(...skipping 30 matching lines...) Expand all Loading... |
88 | 85 |
89 if (!can_get_buffer_percent_full() || subscriber != subscriber_) | 86 if (!can_get_buffer_percent_full() || subscriber != subscriber_) |
90 return false; | 87 return false; |
91 | 88 |
92 maximum_bpf_ = 0.0f; | 89 maximum_bpf_ = 0.0f; |
93 pending_bpf_ack_count_ = filters_.size() + 1; | 90 pending_bpf_ack_count_ = filters_.size() + 1; |
94 | 91 |
95 // Handle special case of zero child processes. | 92 // Handle special case of zero child processes. |
96 if (pending_bpf_ack_count_ == 1) { | 93 if (pending_bpf_ack_count_ == 1) { |
97 // Ack asynchronously now, because we don't have any children to wait for. | 94 // Ack asynchronously now, because we don't have any children to wait for. |
98 float bpf = base::debug::TraceLog::GetInstance()->GetBufferPercentFull(); | 95 float bpf = gpu::TraceLog::GetInstance()->GetBufferPercentFull(); |
99 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 96 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
100 NewRunnableMethod(this, | 97 NewRunnableMethod(this, |
101 &TraceController::OnTraceBufferPercentFullReply, | 98 &TraceController::OnTraceBufferPercentFullReply, |
102 bpf)); | 99 bpf)); |
103 } | 100 } |
104 | 101 |
105 // Message all child processes. | 102 // Message all child processes. |
106 for (FilterMap::iterator it = filters_.begin(); it != filters_.end(); ++it) { | 103 for (FilterMap::iterator it = filters_.begin(); it != filters_.end(); ++it) { |
107 it->get()->SendGetTraceBufferPercentFull(); | 104 it->get()->SendGetTraceBufferPercentFull(); |
108 } | 105 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 return; | 154 return; |
158 | 155 |
159 if (--pending_end_ack_count_ == 0) { | 156 if (--pending_end_ack_count_ == 0) { |
160 // All acks have been received. | 157 // All acks have been received. |
161 is_tracing_ = false; | 158 is_tracing_ = false; |
162 | 159 |
163 // Disable local trace. During this call, our OnTraceDataCollected will be | 160 // Disable local trace. During this call, our OnTraceDataCollected will be |
164 // called with the last of the local trace data. Since we are on the UI | 161 // called with the last of the local trace data. Since we are on the UI |
165 // thread, the call to OnTraceDataCollected will be synchronous, so we can | 162 // thread, the call to OnTraceDataCollected will be synchronous, so we can |
166 // immediately call OnEndTracingComplete below. | 163 // immediately call OnEndTracingComplete below. |
167 base::debug::TraceLog::GetInstance()->SetEnabled(false); | 164 gpu::TraceLog::GetInstance()->SetEnabled(false); |
168 | 165 |
169 // Trigger callback if one is set. | 166 // Trigger callback if one is set. |
170 if (subscriber_) { | 167 if (subscriber_) { |
171 subscriber_->OnEndTracingComplete(); | 168 subscriber_->OnEndTracingComplete(); |
172 // Clear subscriber so that others can use TraceController. | 169 // Clear subscriber so that others can use TraceController. |
173 subscriber_ = NULL; | 170 subscriber_ = NULL; |
174 } | 171 } |
175 } | 172 } |
176 | 173 |
177 if (pending_end_ack_count_ == 1) { | 174 if (pending_end_ack_count_ == 1) { |
178 // The last ack represents local trace, so we need to ack it now. Note that | 175 // The last ack represents local trace, so we need to ack it now. Note that |
179 // this code only executes if there were child processes. | 176 // this code only executes if there were child processes. |
180 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 177 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
181 NewRunnableMethod(this, &TraceController::OnEndTracingAck)); | 178 NewRunnableMethod(this, &TraceController::OnEndTracingAck)); |
182 } | 179 } |
183 } | 180 } |
184 | 181 |
185 void TraceController::OnTraceDataCollected( | 182 void TraceController::OnTraceDataCollected(const std::string& data) { |
186 const scoped_refptr<base::debug::TraceLog::RefCountedString>& | |
187 json_events_str_ptr) { | |
188 // OnTraceDataCollected may be called from any browser thread, either by the | 183 // OnTraceDataCollected may be called from any browser thread, either by the |
189 // local event trace system or from child processes via TraceMessageFilter. | 184 // local event trace system or from child processes via TraceMessageFilter. |
190 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 185 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
191 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 186 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
192 NewRunnableMethod(this, | 187 NewRunnableMethod(this, &TraceController::OnTraceDataCollected, data)); |
193 &TraceController::OnTraceDataCollected, | |
194 json_events_str_ptr)); | |
195 return; | 188 return; |
196 } | 189 } |
197 | 190 |
198 if (subscriber_) | 191 if (subscriber_) |
199 subscriber_->OnTraceDataCollected(json_events_str_ptr->data); | 192 subscriber_->OnTraceDataCollected(data); |
200 } | 193 } |
201 | 194 |
202 void TraceController::OnTraceBufferFull() { | 195 void TraceController::OnTraceBufferFull() { |
203 // OnTraceBufferFull may be called from any browser thread, either by the | 196 // OnTraceBufferFull may be called from any browser thread, either by the |
204 // local event trace system or from child processes via TraceMessageFilter. | 197 // local event trace system or from child processes via TraceMessageFilter. |
205 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 198 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
206 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 199 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
207 NewRunnableMethod(this, &TraceController::OnTraceBufferFull)); | 200 NewRunnableMethod(this, &TraceController::OnTraceBufferFull)); |
208 return; | 201 return; |
209 } | 202 } |
(...skipping 19 matching lines...) Expand all Loading... |
229 | 222 |
230 if (--pending_bpf_ack_count_ == 0) { | 223 if (--pending_bpf_ack_count_ == 0) { |
231 // Trigger callback if one is set. | 224 // Trigger callback if one is set. |
232 if (subscriber_) | 225 if (subscriber_) |
233 subscriber_->OnTraceBufferPercentFullReply(maximum_bpf_); | 226 subscriber_->OnTraceBufferPercentFullReply(maximum_bpf_); |
234 } | 227 } |
235 | 228 |
236 if (pending_bpf_ack_count_ == 1) { | 229 if (pending_bpf_ack_count_ == 1) { |
237 // The last ack represents local trace, so we need to ack it now. Note that | 230 // The last ack represents local trace, so we need to ack it now. Note that |
238 // this code only executes if there were child processes. | 231 // this code only executes if there were child processes. |
239 float bpf = base::debug::TraceLog::GetInstance()->GetBufferPercentFull(); | 232 float bpf = gpu::TraceLog::GetInstance()->GetBufferPercentFull(); |
240 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 233 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
241 NewRunnableMethod(this, | 234 NewRunnableMethod(this, |
242 &TraceController::OnTraceBufferPercentFullReply, | 235 &TraceController::OnTraceBufferPercentFullReply, |
243 bpf)); | 236 bpf)); |
244 } | 237 } |
245 } | 238 } |
246 | 239 |
OLD | NEW |