Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/tracing_controller_impl.h" | 5 #include "content/browser/tracing/tracing_controller_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/debug/trace_event.h" | |
| 8 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 9 #include "base/json/string_escape.h" | 10 #include "base/json/string_escape.h" |
| 10 #include "base/strings/string_number_conversions.h" | 11 #include "base/strings/string_number_conversions.h" |
| 11 #include "content/browser/tracing/trace_message_filter.h" | 12 #include "content/browser/tracing/trace_message_filter.h" |
| 12 #include "content/common/child_process_messages.h" | 13 #include "content/common/child_process_messages.h" |
| 13 #include "content/public/browser/browser_message_filter.h" | 14 #include "content/public/browser/browser_message_filter.h" |
| 14 #include "content/public/common/content_switches.h" | 15 #include "content/public/common/content_switches.h" |
| 15 | 16 |
| 16 using base::debug::TraceLog; | 17 using base::debug::TraceLog; |
| 17 | 18 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 111 | 112 |
| 112 | 113 |
| 113 TracingControllerImpl::TracingControllerImpl() : | 114 TracingControllerImpl::TracingControllerImpl() : |
| 114 pending_disable_recording_ack_count_(0), | 115 pending_disable_recording_ack_count_(0), |
| 115 pending_capture_monitoring_snapshot_ack_count_(0), | 116 pending_capture_monitoring_snapshot_ack_count_(0), |
| 116 pending_trace_buffer_percent_full_ack_count_(0), | 117 pending_trace_buffer_percent_full_ack_count_(0), |
| 117 maximum_trace_buffer_percent_full_(0), | 118 maximum_trace_buffer_percent_full_(0), |
| 118 // Tracing may have been enabled by ContentMainRunner if kTraceStartup | 119 // Tracing may have been enabled by ContentMainRunner if kTraceStartup |
| 119 // is specified in command line. | 120 // is specified in command line. |
| 120 is_recording_(TraceLog::GetInstance()->IsEnabled()), | 121 is_recording_(TraceLog::GetInstance()->IsEnabled()), |
| 121 is_monitoring_(false), | 122 is_monitoring_(false) { |
| 122 category_filter_( | |
| 123 base::debug::CategoryFilter::kDefaultCategoryFilterString) { | |
| 124 } | 123 } |
| 125 | 124 |
| 126 TracingControllerImpl::~TracingControllerImpl() { | 125 TracingControllerImpl::~TracingControllerImpl() { |
| 127 // This is a Leaky instance. | 126 // This is a Leaky instance. |
| 128 NOTREACHED(); | 127 NOTREACHED(); |
| 129 } | 128 } |
| 130 | 129 |
| 131 TracingControllerImpl* TracingControllerImpl::GetInstance() { | 130 TracingControllerImpl* TracingControllerImpl::GetInstance() { |
| 132 return g_controller.Pointer(); | 131 return g_controller.Pointer(); |
| 133 } | 132 } |
| 134 | 133 |
| 135 void TracingControllerImpl::GetCategories( | 134 bool TracingControllerImpl::GetCategories( |
| 136 const GetCategoriesDoneCallback& callback) { | 135 const GetCategoriesDoneCallback& callback) { |
| 137 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 136 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 138 | 137 |
| 139 // Known categories come back from child processes with the EndTracingAck | 138 // Known categories come back from child processes with the EndTracingAck |
| 140 // message. So to get known categories, just begin and end tracing immediately | 139 // message. So to get known categories, just begin and end tracing immediately |
| 141 // afterwards. This will ping all the child processes for categories. | 140 // afterwards. This will ping all the child processes for categories. |
| 142 pending_get_categories_done_callback_ = callback; | 141 pending_get_categories_done_callback_ = callback; |
| 143 EnableRecording(base::debug::CategoryFilter("*"), | 142 if (!EnableRecording("*", TracingController::Options(), |
| 144 TracingController::Options(), | 143 EnableRecordingDoneCallback())) { |
| 145 EnableRecordingDoneCallback()); | 144 pending_get_categories_done_callback_.Reset(); |
| 146 DisableRecording(base::FilePath(), TracingFileResultCallback()); | 145 return false; |
| 146 } | |
| 147 | |
| 148 bool ok = DisableRecording(base::FilePath(), TracingFileResultCallback()); | |
| 149 DCHECK(ok); | |
| 150 return true; | |
| 147 } | 151 } |
| 148 | 152 |
| 149 bool TracingControllerImpl::EnableRecording( | 153 bool TracingControllerImpl::EnableRecording( |
| 150 const base::debug::CategoryFilter& filter, | 154 const std::string& category_filter, |
| 151 TracingController::Options options, | 155 TracingController::Options options, |
| 152 const EnableRecordingDoneCallback& callback) { | 156 const EnableRecordingDoneCallback& callback) { |
| 153 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 157 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 154 | 158 |
| 155 if (!can_enable_recording()) | 159 if (!can_enable_recording()) |
| 156 return false; | 160 return false; |
| 157 | 161 |
| 158 #if defined(OS_ANDROID) | 162 #if defined(OS_ANDROID) |
| 159 if (pending_get_categories_done_callback_.is_null()) | 163 if (pending_get_categories_done_callback_.is_null()) |
| 160 TraceLog::GetInstance()->AddClockSyncMetadataEvent(); | 164 TraceLog::GetInstance()->AddClockSyncMetadataEvent(); |
| 161 #endif | 165 #endif |
| 162 | 166 |
| 163 TraceLog::Options trace_options = (options & RECORD_CONTINUOUSLY) ? | 167 TraceLog::Options trace_options = (options & RECORD_CONTINUOUSLY) ? |
| 164 TraceLog::RECORD_CONTINUOUSLY : TraceLog::RECORD_UNTIL_FULL; | 168 TraceLog::RECORD_CONTINUOUSLY : TraceLog::RECORD_UNTIL_FULL; |
| 165 if (options & ENABLE_SAMPLING) { | 169 if (options & ENABLE_SAMPLING) { |
| 166 trace_options = static_cast<TraceLog::Options>( | 170 trace_options = static_cast<TraceLog::Options>( |
| 167 trace_options | TraceLog::ENABLE_SAMPLING); | 171 trace_options | TraceLog::ENABLE_SAMPLING); |
| 168 } | 172 } |
| 169 // TODO(haraken): How to handle ENABLE_SYSTRACE? | 173 // TODO(haraken): How to handle ENABLE_SYSTRACE? |
| 170 | 174 |
| 171 TraceLog::GetInstance()->SetEnabled(filter, trace_options); | 175 TraceLog::GetInstance()->SetEnabled( |
| 176 base::debug::CategoryFilter(category_filter), trace_options); | |
| 172 is_recording_ = true; | 177 is_recording_ = true; |
| 173 category_filter_ = TraceLog::GetInstance()->GetCurrentCategoryFilter(); | |
| 174 | 178 |
| 175 // Notify all child processes. | 179 // Notify all child processes. |
| 176 for (FilterMap::iterator it = filters_.begin(); it != filters_.end(); ++it) { | 180 for (TraceMessageFilterMap::iterator it = trace_message_filters_.begin(); |
| 177 it->get()->SendBeginTracing(category_filter_.ToString(), trace_options); | 181 it != trace_message_filters_.end(); ++it) { |
| 182 it->get()->SendBeginTracing(category_filter, trace_options); | |
| 178 } | 183 } |
| 179 | 184 |
| 180 if (!callback.is_null()) | 185 if (!callback.is_null()) |
| 181 callback.Run(); | 186 callback.Run(); |
| 182 return true; | 187 return true; |
| 183 } | 188 } |
| 184 | 189 |
| 185 bool TracingControllerImpl::DisableRecording( | 190 bool TracingControllerImpl::DisableRecording( |
| 186 const base::FilePath& result_file_path, | 191 const base::FilePath& result_file_path, |
| 187 const TracingFileResultCallback& callback) { | 192 const TracingFileResultCallback& callback) { |
| 188 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 193 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 189 | 194 |
| 190 if (!can_disable_recording()) | 195 if (!can_disable_recording()) |
| 191 return false; | 196 return false; |
| 192 | 197 |
| 193 pending_disable_recording_done_callback_ = callback; | 198 pending_disable_recording_done_callback_ = callback; |
| 194 | 199 |
| 195 // Disable local trace early to avoid traces during end-tracing process from | 200 // Disable local trace early to avoid traces during end-tracing process from |
| 196 // interfering with the process. | 201 // interfering with the process. |
| 197 TraceLog::GetInstance()->SetDisabled(); | 202 TraceLog::GetInstance()->SetDisabled(); |
| 198 | 203 |
| 199 #if defined(OS_ANDROID) | 204 #if defined(OS_ANDROID) |
| 200 if (pending_get_categories_done_callback_.is_null()) | 205 if (pending_get_categories_done_callback_.is_null()) |
| 201 TraceLog::GetInstance()->AddClockSyncMetadataEvent(); | 206 TraceLog::GetInstance()->AddClockSyncMetadataEvent(); |
| 202 #endif | 207 #endif |
| 203 | 208 |
| 204 if (!callback.is_null() || !result_file_path.empty()) | 209 if (!callback.is_null() || !result_file_path.empty()) |
| 205 result_file_.reset(new ResultFile(result_file_path)); | 210 result_file_.reset(new ResultFile(result_file_path)); |
| 206 | 211 |
| 207 // There could be a case where there are no child processes and filters_ | |
| 208 // is empty. In that case we can immediately tell the subscriber that tracing | |
| 209 // has ended. To avoid recursive calls back to the subscriber, we will just | |
| 210 // use the existing asynchronous OnDisableRecordingAcked code. | |
| 211 // Count myself (local trace) in pending_disable_recording_ack_count_, | 212 // Count myself (local trace) in pending_disable_recording_ack_count_, |
| 212 // acked below. | 213 // acked below. |
| 213 pending_disable_recording_ack_count_ = filters_.size() + 1; | 214 pending_disable_recording_ack_count_ = trace_message_filters_.size() + 1; |
| 214 | 215 |
| 215 // Handle special case of zero child processes. | 216 // Handle special case of zero child processes by immediately telling the |
| 217 // caller that tracing has ended. Use asynchronous OnDisableRecordingAcked | |
| 218 // to avoid recursive call back to the caller. | |
| 216 if (pending_disable_recording_ack_count_ == 1) { | 219 if (pending_disable_recording_ack_count_ == 1) { |
| 217 // Ack asynchronously now, because we don't have any children to wait for. | 220 // Ack asynchronously now, because we don't have any children to wait for. |
| 218 std::vector<std::string> category_groups; | 221 std::vector<std::string> category_groups; |
| 219 TraceLog::GetInstance()->GetKnownCategoryGroups(&category_groups); | 222 TraceLog::GetInstance()->GetKnownCategoryGroups(&category_groups); |
| 220 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 223 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 221 base::Bind(&TracingControllerImpl::OnDisableRecordingAcked, | 224 base::Bind(&TracingControllerImpl::OnDisableRecordingAcked, |
| 222 base::Unretained(this), category_groups)); | 225 base::Unretained(this), category_groups)); |
| 223 } | 226 } |
| 224 | 227 |
| 225 // Notify all child processes. | 228 // Notify all child processes. |
| 226 for (FilterMap::iterator it = filters_.begin(); it != filters_.end(); ++it) { | 229 for (TraceMessageFilterMap::iterator it = trace_message_filters_.begin(); |
| 230 it != trace_message_filters_.end(); ++it) { | |
| 227 it->get()->SendEndTracing(); | 231 it->get()->SendEndTracing(); |
| 228 } | 232 } |
| 229 return true; | 233 return true; |
| 230 } | 234 } |
| 231 | 235 |
| 232 bool TracingControllerImpl::EnableMonitoring( | 236 bool TracingControllerImpl::EnableMonitoring( |
| 233 const base::debug::CategoryFilter& filter, | 237 const std::string& category_filter, |
| 234 TracingController::Options options, | 238 TracingController::Options options, |
| 235 const EnableMonitoringDoneCallback& callback) { | 239 const EnableMonitoringDoneCallback& callback) { |
| 236 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 240 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 237 | 241 |
| 238 if (!can_enable_monitoring()) | 242 if (!can_enable_monitoring()) |
| 239 return false; | 243 return false; |
| 240 is_monitoring_ = true; | 244 is_monitoring_ = true; |
| 241 | 245 |
| 242 #if defined(OS_ANDROID) | 246 #if defined(OS_ANDROID) |
| 243 TraceLog::GetInstance()->AddClockSyncMetadataEvent(); | 247 TraceLog::GetInstance()->AddClockSyncMetadataEvent(); |
| 244 #endif | 248 #endif |
| 245 | 249 |
| 246 int monitoring_tracing_options = 0; | 250 int monitoring_tracing_options = 0; |
| 247 if (options & ENABLE_SAMPLING) | 251 if (options & ENABLE_SAMPLING) |
| 248 monitoring_tracing_options |= base::debug::TraceLog::MONITOR_SAMPLING; | 252 monitoring_tracing_options |= base::debug::TraceLog::MONITOR_SAMPLING; |
| 249 | 253 |
| 250 TraceLog::GetInstance()->SetEnabled( | 254 TraceLog::GetInstance()->SetEnabled( |
| 251 filter, base::debug::TraceLog::Options(monitoring_tracing_options)); | 255 base::debug::CategoryFilter(category_filter), |
| 256 static_cast<TraceLog::Options>(monitoring_tracing_options)); | |
| 252 | 257 |
| 253 // Notify all child processes. | 258 // Notify all child processes. |
| 254 for (FilterMap::iterator it = filters_.begin(); it != filters_.end(); ++it) { | 259 for (TraceMessageFilterMap::iterator it = trace_message_filters_.begin(); |
| 255 it->get()->SendEnableMonitoring(filter.ToString(), | 260 it != trace_message_filters_.end(); ++it) { |
| 256 base::debug::TraceLog::Options(monitoring_tracing_options)); | 261 it->get()->SendEnableMonitoring(category_filter, |
| 262 static_cast<TraceLog::Options>(monitoring_tracing_options)); | |
| 257 } | 263 } |
| 258 | 264 |
| 259 if (!callback.is_null()) | 265 if (!callback.is_null()) |
| 260 callback.Run(); | 266 callback.Run(); |
| 261 return true; | 267 return true; |
| 262 } | 268 } |
| 263 | 269 |
| 264 bool TracingControllerImpl::DisableMonitoring( | 270 bool TracingControllerImpl::DisableMonitoring( |
| 265 const DisableMonitoringDoneCallback& callback) { | 271 const DisableMonitoringDoneCallback& callback) { |
| 266 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 272 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 267 | 273 |
| 268 if (!can_disable_monitoring()) | 274 if (!can_disable_monitoring()) |
| 269 return false; | 275 return false; |
| 270 is_monitoring_ = false; | 276 is_monitoring_ = false; |
| 271 | 277 |
| 272 TraceLog::GetInstance()->SetDisabled(); | 278 TraceLog::GetInstance()->SetDisabled(); |
| 273 | 279 |
| 274 // Notify all child processes. | 280 // Notify all child processes. |
| 275 for (FilterMap::iterator it = filters_.begin(); it != filters_.end(); ++it) { | 281 for (TraceMessageFilterMap::iterator it = trace_message_filters_.begin(); |
| 282 it != trace_message_filters_.end(); ++it) { | |
| 276 it->get()->SendDisableMonitoring(); | 283 it->get()->SendDisableMonitoring(); |
| 277 } | 284 } |
| 278 | 285 |
| 279 if (!callback.is_null()) | 286 if (!callback.is_null()) |
| 280 callback.Run(); | 287 callback.Run(); |
| 281 return true; | 288 return true; |
| 282 } | 289 } |
| 283 | 290 |
| 284 void TracingControllerImpl::GetMonitoringStatus( | 291 void TracingControllerImpl::GetMonitoringStatus( |
| 285 bool* out_enabled, | 292 bool* out_enabled, |
| 286 base::debug::CategoryFilter* out_filter, | 293 std::string* out_category_filter, |
| 287 TracingController::Options* out_options) { | 294 TracingController::Options* out_options) { |
| 288 NOTIMPLEMENTED(); | 295 NOTIMPLEMENTED(); |
| 289 } | 296 } |
| 290 | 297 |
| 291 void TracingControllerImpl::CaptureMonitoringSnapshot( | 298 bool TracingControllerImpl::CaptureMonitoringSnapshot( |
| 292 const base::FilePath& result_file_path, | 299 const base::FilePath& result_file_path, |
| 293 const TracingFileResultCallback& callback) { | 300 const TracingFileResultCallback& callback) { |
| 294 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 301 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 295 | 302 |
| 296 if (!can_disable_monitoring()) | 303 if (!can_disable_monitoring()) |
| 297 return; | 304 return false; |
| 298 | 305 |
| 299 if (callback.is_null() && result_file_path.empty()) | 306 if (callback.is_null() && result_file_path.empty()) |
| 300 return; | 307 return false; |
| 301 | 308 |
| 302 pending_capture_monitoring_snapshot_done_callback_ = callback; | 309 pending_capture_monitoring_snapshot_done_callback_ = callback; |
| 303 monitoring_snapshot_file_.reset(new ResultFile(result_file_path)); | 310 monitoring_snapshot_file_.reset(new ResultFile(result_file_path)); |
| 304 | 311 |
| 305 // There could be a case where there are no child processes and filters_ | |
| 306 // is empty. In that case we can immediately tell the subscriber that tracing | |
| 307 // has ended. To avoid recursive calls back to the subscriber, we will just | |
| 308 // use the existing asynchronous OnCaptureMonitoringSnapshotAcked code. | |
| 309 // Count myself in pending_capture_monitoring_snapshot_ack_count_, | 312 // Count myself in pending_capture_monitoring_snapshot_ack_count_, |
| 310 // acked below. | 313 // acked below. |
| 311 pending_capture_monitoring_snapshot_ack_count_ = filters_.size() + 1; | 314 pending_capture_monitoring_snapshot_ack_count_ = |
| 315 trace_message_filters_.size() + 1; | |
| 312 | 316 |
| 313 // Handle special case of zero child processes. | 317 // Handle special case of zero child processes by immediately telling the |
| 318 // caller that capturing snapshot has ended. Use asynchronous | |
| 319 // OnCaptureMonitoringSnapshotAcked to avoid recursive call back to the | |
| 320 // caller. | |
| 314 if (pending_capture_monitoring_snapshot_ack_count_ == 1) { | 321 if (pending_capture_monitoring_snapshot_ack_count_ == 1) { |
| 315 // Ack asynchronously now, because we don't have any children to wait for. | 322 // Ack asynchronously now, because we don't have any children to wait for. |
| 316 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 323 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 317 base::Bind(&TracingControllerImpl::OnCaptureMonitoringSnapshotAcked, | 324 base::Bind(&TracingControllerImpl::OnCaptureMonitoringSnapshotAcked, |
| 318 base::Unretained(this))); | 325 base::Unretained(this))); |
| 319 } | 326 } |
| 320 | 327 |
| 321 // Notify all child processes. | 328 // Notify all child processes. |
| 322 for (FilterMap::iterator it = filters_.begin(); it != filters_.end(); ++it) { | 329 for (TraceMessageFilterMap::iterator it = trace_message_filters_.begin(); |
| 330 it != trace_message_filters_.end(); ++it) { | |
| 323 it->get()->SendCaptureMonitoringSnapshot(); | 331 it->get()->SendCaptureMonitoringSnapshot(); |
| 324 } | 332 } |
| 325 | 333 |
| 326 #if defined(OS_ANDROID) | 334 #if defined(OS_ANDROID) |
| 327 TraceLog::GetInstance()->AddClockSyncMetadataEvent(); | 335 TraceLog::GetInstance()->AddClockSyncMetadataEvent(); |
| 328 #endif | 336 #endif |
| 337 | |
| 338 return true; | |
| 329 } | 339 } |
| 330 | 340 |
| 331 bool TracingControllerImpl::GetTraceBufferPercentFull( | 341 bool TracingControllerImpl::GetTraceBufferPercentFull( |
| 332 const GetTraceBufferPercentFullCallback& callback) { | 342 const GetTraceBufferPercentFullCallback& callback) { |
| 333 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 343 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 334 | 344 |
| 335 if (!can_get_trace_buffer_percent_full() || callback.is_null()) | 345 if (!can_get_trace_buffer_percent_full() || callback.is_null()) |
| 336 return false; | 346 return false; |
| 337 | 347 |
| 338 pending_trace_buffer_percent_full_callback_ = callback; | 348 pending_trace_buffer_percent_full_callback_ = callback; |
| 339 | 349 |
| 340 // Count myself in pending_trace_buffer_percent_full_ack_count_, acked below. | 350 // Count myself in pending_trace_buffer_percent_full_ack_count_, acked below. |
| 341 pending_trace_buffer_percent_full_ack_count_ = filters_.size() + 1; | 351 pending_trace_buffer_percent_full_ack_count_ = |
| 352 trace_message_filters_.size() + 1; | |
| 342 maximum_trace_buffer_percent_full_ = 0; | 353 maximum_trace_buffer_percent_full_ = 0; |
| 343 | 354 |
| 344 // Handle special case of zero child processes. | 355 // Handle special case of zero child processes. |
| 345 if (pending_trace_buffer_percent_full_ack_count_ == 1) { | 356 if (pending_trace_buffer_percent_full_ack_count_ == 1) { |
| 346 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 357 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 347 base::Bind(&TracingControllerImpl::OnTraceBufferPercentFullReply, | 358 base::Bind(&TracingControllerImpl::OnTraceBufferPercentFullReply, |
| 348 base::Unretained(this), | 359 base::Unretained(this), |
| 349 TraceLog::GetInstance()->GetBufferPercentFull())); | 360 TraceLog::GetInstance()->GetBufferPercentFull())); |
| 350 } | 361 } |
| 351 | 362 |
| 352 // Notify all child processes. | 363 // Notify all child processes. |
| 353 for (FilterMap::iterator it = filters_.begin(); it != filters_.end(); ++it) { | 364 for (TraceMessageFilterMap::iterator it = trace_message_filters_.begin(); |
| 365 it != trace_message_filters_.end(); ++it) { | |
| 354 it->get()->SendGetTraceBufferPercentFull(); | 366 it->get()->SendGetTraceBufferPercentFull(); |
| 355 } | 367 } |
| 356 return true; | 368 return true; |
| 357 } | 369 } |
| 358 | 370 |
| 359 void TracingControllerImpl::AddFilter(TraceMessageFilter* filter) { | 371 bool TracingControllerImpl::SetWatchEvent( |
| 372 const std::string& category_name, | |
| 373 const std::string& event_name, | |
| 374 const WatchEventCallback& callback) { | |
| 375 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 376 | |
| 377 if (callback.is_null()) | |
| 378 return false; | |
| 379 | |
| 380 watch_category_name_ = category_name; | |
| 381 watch_event_name_ = event_name; | |
| 382 watch_event_callback_ = callback; | |
| 383 | |
| 384 TraceLog::GetInstance()->SetWatchEvent( | |
| 385 category_name, event_name, | |
| 386 base::Bind(&TracingControllerImpl::OnWatchEventMatched, | |
| 387 base::Unretained(this))); | |
| 388 | |
| 389 for (TraceMessageFilterMap::iterator it = trace_message_filters_.begin(); | |
| 390 it != trace_message_filters_.end(); ++it) { | |
| 391 it->get()->SendSetWatchEvent(category_name, event_name); | |
| 392 } | |
| 393 return true; | |
| 394 } | |
| 395 | |
| 396 bool TracingControllerImpl::CancelWatchEvent() { | |
| 397 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 398 | |
| 399 if (!can_cancel_watch_event()) | |
| 400 return false; | |
| 401 | |
| 402 for (TraceMessageFilterMap::iterator it = trace_message_filters_.begin(); | |
| 403 it != trace_message_filters_.end(); ++it) { | |
| 404 it->get()->SendCancelWatchEvent(); | |
| 405 } | |
| 406 | |
| 407 watch_event_callback_.Reset(); | |
| 408 return true; | |
| 409 } | |
| 410 | |
| 411 void TracingControllerImpl::AddTraceMessageFilter( | |
| 412 TraceMessageFilter* trace_message_filter) { | |
| 360 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 413 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| 361 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 414 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 362 base::Bind(&TracingControllerImpl::AddFilter, base::Unretained(this), | 415 base::Bind(&TracingControllerImpl::AddTraceMessageFilter, |
| 363 make_scoped_refptr(filter))); | 416 base::Unretained(this), |
| 417 make_scoped_refptr(trace_message_filter))); | |
| 364 return; | 418 return; |
| 365 } | 419 } |
| 366 | 420 |
| 367 filters_.insert(filter); | 421 trace_message_filters_.insert(trace_message_filter); |
| 422 if (can_cancel_watch_event()) { | |
| 423 trace_message_filter->SendSetWatchEvent(watch_category_name_, | |
| 424 watch_event_name_); | |
| 425 } | |
| 368 if (can_disable_recording()) { | 426 if (can_disable_recording()) { |
| 369 std::string cf_str = category_filter_.ToString(); | 427 trace_message_filter->SendBeginTracing( |
| 370 filter->SendBeginTracing(cf_str, TraceLog::GetInstance()->trace_options()); | 428 TraceLog::GetInstance()->GetCurrentCategoryFilter().ToString(), |
| 429 TraceLog::GetInstance()->trace_options()); | |
| 371 } | 430 } |
| 372 } | 431 } |
| 373 | 432 |
| 374 void TracingControllerImpl::RemoveFilter(TraceMessageFilter* filter) { | 433 void TracingControllerImpl::RemoveTraceMessageFilter( |
| 434 TraceMessageFilter* trace_message_filter) { | |
| 375 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 435 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| 376 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 436 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 377 base::Bind(&TracingControllerImpl::RemoveFilter, base::Unretained(this), | 437 base::Bind(&TracingControllerImpl::RemoveTraceMessageFilter, |
| 378 make_scoped_refptr(filter))); | 438 base::Unretained(this), |
| 439 make_scoped_refptr(trace_message_filter))); | |
| 379 return; | 440 return; |
| 380 } | 441 } |
| 381 | 442 |
| 382 filters_.erase(filter); | 443 trace_message_filters_.erase(trace_message_filter); |
| 383 } | 444 } |
| 384 | 445 |
| 385 void TracingControllerImpl::OnDisableRecordingAcked( | 446 void TracingControllerImpl::OnDisableRecordingAcked( |
| 386 const std::vector<std::string>& known_category_groups) { | 447 const std::vector<std::string>& known_category_groups) { |
| 387 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 448 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| 388 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 449 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 389 base::Bind(&TracingControllerImpl::OnDisableRecordingAcked, | 450 base::Bind(&TracingControllerImpl::OnDisableRecordingAcked, |
| 390 base::Unretained(this), known_category_groups)); | 451 base::Unretained(this), known_category_groups)); |
| 391 return; | 452 return; |
| 392 } | 453 } |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 562 if (pending_trace_buffer_percent_full_ack_count_ == 1) { | 623 if (pending_trace_buffer_percent_full_ack_count_ == 1) { |
| 563 // The last ack represents local trace, so we need to ack it now. Note that | 624 // The last ack represents local trace, so we need to ack it now. Note that |
| 564 // this code only executes if there were child processes. | 625 // this code only executes if there were child processes. |
| 565 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 626 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 566 base::Bind(&TracingControllerImpl::OnTraceBufferPercentFullReply, | 627 base::Bind(&TracingControllerImpl::OnTraceBufferPercentFullReply, |
| 567 base::Unretained(this), | 628 base::Unretained(this), |
| 568 TraceLog::GetInstance()->GetBufferPercentFull())); | 629 TraceLog::GetInstance()->GetBufferPercentFull())); |
| 569 } | 630 } |
| 570 } | 631 } |
| 571 | 632 |
| 633 void TracingControllerImpl::OnWatchEventMatched() { | |
| 634 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { | |
| 635 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | |
| 636 base::Bind(&TracingControllerImpl::OnWatchEventMatched, | |
| 637 base::Unretained(this))); | |
|
no sievers
2013/12/05 02:25:58
missing return, i'll upload a patch
| |
| 638 } | |
| 639 | |
| 640 if (!watch_event_callback_.is_null()) | |
| 641 watch_event_callback_.Run(); | |
| 642 } | |
| 643 | |
| 572 } // namespace content | 644 } // namespace content |
| OLD | NEW |