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