Chromium Code Reviews| 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 |