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

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

Issue 1468173003: [Tracing Clock Sync] Add TracingAgent interface in Chrome (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: review fix Created 5 years 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) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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 #include "content/browser/tracing/tracing_controller_impl.h" 4 #include "content/browser/tracing/tracing_controller_impl.h"
5 5
6 #include "base/bind.h" 6 #include "base/bind.h"
7 #include "base/cpu.h" 7 #include "base/cpu.h"
8 #include "base/files/file_util.h" 8 #include "base/files/file_util.h"
9 #include "base/json/string_escape.h" 9 #include "base/json/string_escape.h"
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 27 matching lines...) Expand all
38 using base::trace_event::TraceLog; 38 using base::trace_event::TraceLog;
39 using base::trace_event::TraceConfig; 39 using base::trace_event::TraceConfig;
40 40
41 namespace content { 41 namespace content {
42 42
43 namespace { 43 namespace {
44 44
45 base::LazyInstance<TracingControllerImpl>::Leaky g_controller = 45 base::LazyInstance<TracingControllerImpl>::Leaky g_controller =
46 LAZY_INSTANCE_INITIALIZER; 46 LAZY_INSTANCE_INITIALIZER;
47 47
48 const char kChromeTracingAgentName[] = "chrome";
49 const char kETWTracingAgentName[] = "etw";
50 const char kChromeTraceLabel[] = "traceEvents";
48 51
49 std::string GetNetworkTypeString() { 52 std::string GetNetworkTypeString() {
50 switch (net::NetworkChangeNotifier::GetConnectionType()) { 53 switch (net::NetworkChangeNotifier::GetConnectionType()) {
51 case net::NetworkChangeNotifier::CONNECTION_ETHERNET: 54 case net::NetworkChangeNotifier::CONNECTION_ETHERNET:
52 return "Ethernet"; 55 return "Ethernet";
53 case net::NetworkChangeNotifier::CONNECTION_WIFI: 56 case net::NetworkChangeNotifier::CONNECTION_WIFI:
54 return "WiFi"; 57 return "WiFi";
55 case net::NetworkChangeNotifier::CONNECTION_2G: 58 case net::NetworkChangeNotifier::CONNECTION_2G:
56 return "2G"; 59 return "2G";
57 case net::NetworkChangeNotifier::CONNECTION_3G: 60 case net::NetworkChangeNotifier::CONNECTION_3G:
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 } 141 }
139 142
140 TracingControllerImpl::TracingControllerImpl() 143 TracingControllerImpl::TracingControllerImpl()
141 : pending_stop_tracing_ack_count_(0), 144 : pending_stop_tracing_ack_count_(0),
142 pending_capture_monitoring_snapshot_ack_count_(0), 145 pending_capture_monitoring_snapshot_ack_count_(0),
143 pending_trace_log_status_ack_count_(0), 146 pending_trace_log_status_ack_count_(0),
144 maximum_trace_buffer_usage_(0), 147 maximum_trace_buffer_usage_(0),
145 approximate_event_count_(0), 148 approximate_event_count_(0),
146 pending_memory_dump_ack_count_(0), 149 pending_memory_dump_ack_count_(0),
147 failed_memory_dump_count_(0), 150 failed_memory_dump_count_(0),
148 // Tracing may have been enabled by ContentMainRunner if kTraceStartup
149 // is specified in command line.
150 #if defined(OS_CHROMEOS) || defined(OS_WIN)
151 is_system_tracing_(false),
152 #endif
153 is_tracing_(false), 151 is_tracing_(false),
154 is_monitoring_(false), 152 is_monitoring_(false) {
155 is_power_tracing_(false) {
156 base::trace_event::MemoryDumpManager::GetInstance()->Initialize( 153 base::trace_event::MemoryDumpManager::GetInstance()->Initialize(
157 this /* delegate */, true /* is_coordinator */); 154 this /* delegate */, true /* is_coordinator */);
158 155
159 // Deliberately leaked, like this class. 156 // Deliberately leaked, like this class.
160 base::FileTracing::SetProvider(new FileTracingProviderImpl); 157 base::FileTracing::SetProvider(new FileTracingProviderImpl);
161 } 158 }
162 159
163 TracingControllerImpl::~TracingControllerImpl() { 160 TracingControllerImpl::~TracingControllerImpl() {
164 // This is a Leaky instance. 161 // This is a Leaky instance.
165 NOTREACHED(); 162 NOTREACHED();
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 200 DCHECK_CURRENTLY_ON(BrowserThread::FILE);
204 201
205 TraceLog::GetInstance()->SetDisabled(); 202 TraceLog::GetInstance()->SetDisabled();
206 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, callback); 203 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, callback);
207 } 204 }
208 205
209 bool TracingControllerImpl::StartTracing( 206 bool TracingControllerImpl::StartTracing(
210 const TraceConfig& trace_config, 207 const TraceConfig& trace_config,
211 const StartTracingDoneCallback& callback) { 208 const StartTracingDoneCallback& callback) {
212 DCHECK_CURRENTLY_ON(BrowserThread::UI); 209 DCHECK_CURRENTLY_ON(BrowserThread::UI);
210 DCHECK(additional_tracing_agents_.empty());
213 211
214 if (!can_start_tracing()) 212 if (!can_start_tracing())
215 return false; 213 return false;
216 is_tracing_ = true; 214 is_tracing_ = true;
215 start_tracing_done_callback_ = callback;
217 216
218 #if defined(OS_ANDROID) 217 #if defined(OS_ANDROID)
219 if (pending_get_categories_done_callback_.is_null()) 218 if (pending_get_categories_done_callback_.is_null())
220 TraceLog::GetInstance()->AddClockSyncMetadataEvent(); 219 TraceLog::GetInstance()->AddClockSyncMetadataEvent();
221 #endif 220 #endif
222 221
223 if (trace_config.IsSystraceEnabled()) { 222 if (trace_config.IsSystraceEnabled()) {
224 DCHECK(!is_power_tracing_); 223 if (PowerTracingAgent::GetInstance()->StartAgentTracing(trace_config))
225 is_power_tracing_ = PowerTracingAgent::GetInstance()->StartTracing(); 224 additional_tracing_agents_.push_back(PowerTracingAgent::GetInstance());
226 #if defined(OS_CHROMEOS) 225 #if defined(OS_CHROMEOS)
227 DCHECK(!is_system_tracing_); 226 chromeos::DebugDaemonClient* debug_daemon =
228 chromeos::DBusThreadManager::Get()->GetDebugDaemonClient()-> 227 chromeos::DBusThreadManager::Get()->GetDebugDaemonClient();
229 StartSystemTracing(); 228 if (debug_daemon && debug_daemon->StartAgentTracing(trace_config)) {
230 is_system_tracing_ = true; 229 debug_daemon->SetStopAgentTracingTaskRunner(
230 BrowserThread::GetBlockingPool());
231 additional_tracing_agents_.push_back(
232 chromeos::DBusThreadManager::Get()->GetDebugDaemonClient());
233 }
231 #elif defined(OS_WIN) 234 #elif defined(OS_WIN)
232 DCHECK(!is_system_tracing_); 235 if (EtwSystemEventConsumer::GetInstance()->StartAgentTracing(
233 is_system_tracing_ = 236 trace_config)) {
234 EtwSystemEventConsumer::GetInstance()->StartSystemTracing(); 237 additional_tracing_agents_.push_back(
238 EtwSystemEventConsumer::GetInstance());
239 }
235 #endif 240 #endif
236 } 241 }
237 242
238 // TraceLog may have been enabled in startup tracing before threads are ready. 243 // TraceLog may have been enabled in startup tracing before threads are ready.
239 if (TraceLog::GetInstance()->IsEnabled()) 244 if (TraceLog::GetInstance()->IsEnabled())
240 return true; 245 return true;
241 246 return StartAgentTracing(trace_config);
242 base::Closure on_start_tracing_done_callback =
243 base::Bind(&TracingControllerImpl::OnStartTracingDone,
244 base::Unretained(this),
245 trace_config, callback);
246 if (!BrowserThread::PostTask(
247 BrowserThread::FILE, FROM_HERE,
248 base::Bind(&TracingControllerImpl::SetEnabledOnFileThread,
249 base::Unretained(this), trace_config,
250 base::trace_event::TraceLog::RECORDING_MODE,
251 on_start_tracing_done_callback))) {
252 // BrowserThread::PostTask fails if the threads haven't been created yet,
253 // so it should be safe to just use TraceLog::SetEnabled directly.
254 base::trace_event::TraceLog::GetInstance()->SetEnabled(
255 trace_config, base::trace_event::TraceLog::RECORDING_MODE);
256 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
257 on_start_tracing_done_callback);
258 }
259
260 return true;
261 } 247 }
262 248
263 void TracingControllerImpl::OnStartTracingDone( 249 void TracingControllerImpl::OnStartAgentTracingDone(
264 const TraceConfig& trace_config, 250 const TraceConfig& trace_config,
265 const StartTracingDoneCallback& callback) { 251 const StartTracingDoneCallback& callback) {
266 DCHECK_CURRENTLY_ON(BrowserThread::UI); 252 DCHECK_CURRENTLY_ON(BrowserThread::UI);
267 253
268 TRACE_EVENT_API_ADD_METADATA_EVENT("IsTimeTicksHighResolution", "value", 254 TRACE_EVENT_API_ADD_METADATA_EVENT("IsTimeTicksHighResolution", "value",
269 base::TimeTicks::IsHighResolution()); 255 base::TimeTicks::IsHighResolution());
270 TRACE_EVENT_API_ADD_METADATA_EVENT("TraceConfig", "value", 256 TRACE_EVENT_API_ADD_METADATA_EVENT("TraceConfig", "value",
271 trace_config.AsConvertableToTraceFormat()); 257 trace_config.AsConvertableToTraceFormat());
272 258
273 // Notify all child processes. 259 // Notify all child processes.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 #if defined(OS_ANDROID) 304 #if defined(OS_ANDROID)
319 if (pending_get_categories_done_callback_.is_null()) 305 if (pending_get_categories_done_callback_.is_null())
320 TraceLog::GetInstance()->AddClockSyncMetadataEvent(); 306 TraceLog::GetInstance()->AddClockSyncMetadataEvent();
321 #endif 307 #endif
322 308
323 // Count myself (local trace) in pending_stop_tracing_ack_count_, 309 // Count myself (local trace) in pending_stop_tracing_ack_count_,
324 // acked below. 310 // acked below.
325 pending_stop_tracing_ack_count_ = trace_message_filters_.size() + 1; 311 pending_stop_tracing_ack_count_ = trace_message_filters_.size() + 1;
326 pending_stop_tracing_filters_ = trace_message_filters_; 312 pending_stop_tracing_filters_ = trace_message_filters_;
327 313
328 #if defined(OS_CHROMEOS) || defined(OS_WIN) 314 pending_stop_tracing_ack_count_ += additional_tracing_agents_.size();
329 if (is_system_tracing_) { 315 for (auto it : additional_tracing_agents_) {
330 // Disable system tracing. 316 it->StopAgentTracing(
331 is_system_tracing_ = false; 317 base::Bind(&TracingControllerImpl::OnEndAgentTracingAcked,
332 ++pending_stop_tracing_ack_count_;
333
334 #if defined(OS_CHROMEOS)
335 scoped_refptr<base::TaskRunner> task_runner =
336 BrowserThread::GetBlockingPool();
337 chromeos::DBusThreadManager::Get()
338 ->GetDebugDaemonClient()
339 ->RequestStopSystemTracing(
340 task_runner,
341 base::Bind(&TracingControllerImpl::OnEndSystemTracingAcked,
342 base::Unretained(this)));
343 #elif defined(OS_WIN)
344 EtwSystemEventConsumer::GetInstance()->StopSystemTracing(
345 base::Bind(&TracingControllerImpl::OnEndSystemTracingAcked,
346 base::Unretained(this)));
347 #endif
348 }
349 #endif // defined(OS_CHROMEOS) || defined(OS_WIN)
350
351 if (is_power_tracing_) {
352 is_power_tracing_ = false;
353 ++pending_stop_tracing_ack_count_;
354 PowerTracingAgent::GetInstance()->StopTracing(
355 base::Bind(&TracingControllerImpl::OnEndPowerTracingAcked,
356 base::Unretained(this))); 318 base::Unretained(this)));
357 } 319 }
320 additional_tracing_agents_.clear();
358 321
359 // Handle special case of zero child processes by immediately flushing the 322 StopAgentTracing(StopAgentTracingCallback());
360 // trace log. Once the flush has completed the caller will be notified that
361 // tracing has ended.
362 if (pending_stop_tracing_ack_count_ == 1) {
363 // Flush/cancel asynchronously now, because we don't have any children to
364 // wait for.
365 if (trace_data_sink_) {
366 TraceLog::GetInstance()->Flush(
367 base::Bind(&TracingControllerImpl::OnLocalTraceDataCollected,
368 base::Unretained(this)),
369 true);
370 } else {
371 TraceLog::GetInstance()->CancelTracing(
372 base::Bind(&TracingControllerImpl::OnLocalTraceDataCollected,
373 base::Unretained(this)));
374 }
375 }
376
377 // Notify all child processes.
378 for (TraceMessageFilterSet::iterator it = trace_message_filters_.begin();
379 it != trace_message_filters_.end(); ++it) {
380 if (trace_data_sink_)
381 it->get()->SendEndTracing();
382 else
383 it->get()->SendCancelTracing();
384 }
385 } 323 }
386 324
387 bool TracingControllerImpl::StartMonitoring( 325 bool TracingControllerImpl::StartMonitoring(
388 const TraceConfig& trace_config, 326 const TraceConfig& trace_config,
389 const StartMonitoringDoneCallback& callback) { 327 const StartMonitoringDoneCallback& callback) {
390 DCHECK_CURRENTLY_ON(BrowserThread::UI); 328 DCHECK_CURRENTLY_ON(BrowserThread::UI);
391 329
392 if (!can_start_monitoring()) 330 if (!can_start_monitoring())
393 return false; 331 return false;
394 OnMonitoringStateChanged(true); 332 OnMonitoringStateChanged(true);
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
731 // Trigger callback if one is set. 669 // Trigger callback if one is set.
732 if (!pending_get_categories_done_callback_.is_null()) { 670 if (!pending_get_categories_done_callback_.is_null()) {
733 pending_get_categories_done_callback_.Run(known_category_groups_); 671 pending_get_categories_done_callback_.Run(known_category_groups_);
734 pending_get_categories_done_callback_.Reset(); 672 pending_get_categories_done_callback_.Reset();
735 } else if (trace_data_sink_.get()) { 673 } else if (trace_data_sink_.get()) {
736 trace_data_sink_->Close(); 674 trace_data_sink_->Close();
737 trace_data_sink_ = NULL; 675 trace_data_sink_ = NULL;
738 } 676 }
739 } 677 }
740 678
741 void TracingControllerImpl::OnEndPowerTracingAcked( 679 void TracingControllerImpl::OnEndAgentTracingAcked(
680 const std::string& agent_name,
681 const std::string& events_label,
742 const scoped_refptr<base::RefCountedString>& events_str_ptr) { 682 const scoped_refptr<base::RefCountedString>& events_str_ptr) {
743 DCHECK_CURRENTLY_ON(BrowserThread::UI); 683 DCHECK_CURRENTLY_ON(BrowserThread::UI);
744 684
745 if (trace_data_sink_.get()) { 685 if (trace_data_sink_.get()) {
746 std::string json_string = base::GetQuotedJSONString(events_str_ptr->data()); 686 std::string json_string;
747 trace_data_sink_->SetPowerTrace(json_string); 687 if (agent_name == kETWTracingAgentName) {
688 // The Windows kernel events are kept into a JSON format stored as string
689 // and must not be escaped.
690 json_string = events_str_ptr->data();
691 } else {
692 json_string = base::GetQuotedJSONString(events_str_ptr->data());
693 }
694 trace_data_sink_->AddAgentTrace(events_label, json_string);
748 } 695 }
749 std::vector<std::string> category_groups; 696 std::vector<std::string> category_groups;
750 OnStopTracingAcked(NULL, category_groups); 697 OnStopTracingAcked(NULL, category_groups);
751 } 698 }
752 699
753 #if defined(OS_CHROMEOS) || defined(OS_WIN)
754 void TracingControllerImpl::OnEndSystemTracingAcked(
755 const scoped_refptr<base::RefCountedString>& events_str_ptr) {
756 DCHECK_CURRENTLY_ON(BrowserThread::UI);
757
758 if (trace_data_sink_.get()) {
759 #if defined(OS_WIN)
760 // The Windows kernel events are kept into a JSon format stored as string
761 // and must not be escaped.
762 std::string json_string = events_str_ptr->data();
763 #else
764 std::string json_string =
765 base::GetQuotedJSONString(events_str_ptr->data());
766 #endif
767 trace_data_sink_->SetSystemTrace(json_string);
768 }
769 DCHECK(!is_system_tracing_);
770 std::vector<std::string> category_groups;
771 OnStopTracingAcked(NULL, category_groups);
772 }
773 #endif
774
775 void TracingControllerImpl::OnCaptureMonitoringSnapshotAcked( 700 void TracingControllerImpl::OnCaptureMonitoringSnapshotAcked(
776 TraceMessageFilter* trace_message_filter) { 701 TraceMessageFilter* trace_message_filter) {
777 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 702 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
778 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 703 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
779 base::Bind(&TracingControllerImpl::OnCaptureMonitoringSnapshotAcked, 704 base::Bind(&TracingControllerImpl::OnCaptureMonitoringSnapshotAcked,
780 base::Unretained(this), 705 base::Unretained(this),
781 make_scoped_refptr(trace_message_filter))); 706 make_scoped_refptr(trace_message_filter)));
782 return; 707 return;
783 } 708 }
784 709
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
917 DCHECK(tracing_uis_.find(tracing_ui) == tracing_uis_.end()); 842 DCHECK(tracing_uis_.find(tracing_ui) == tracing_uis_.end());
918 tracing_uis_.insert(tracing_ui); 843 tracing_uis_.insert(tracing_ui);
919 } 844 }
920 845
921 void TracingControllerImpl::UnregisterTracingUI(TracingUI* tracing_ui) { 846 void TracingControllerImpl::UnregisterTracingUI(TracingUI* tracing_ui) {
922 std::set<TracingUI*>::iterator it = tracing_uis_.find(tracing_ui); 847 std::set<TracingUI*>::iterator it = tracing_uis_.find(tracing_ui);
923 DCHECK(it != tracing_uis_.end()); 848 DCHECK(it != tracing_uis_.end());
924 tracing_uis_.erase(it); 849 tracing_uis_.erase(it);
925 } 850 }
926 851
852 std::string TracingControllerImpl::GetTracingAgentName() {
853 return kChromeTracingAgentName;
854 }
855
856 std::string TracingControllerImpl::GetTraceEventLabel() {
857 return kChromeTraceLabel;
858 }
859
860 bool TracingControllerImpl::StartAgentTracing(
861 const base::trace_event::TraceConfig& trace_config) {
862 DCHECK_CURRENTLY_ON(BrowserThread::UI);
863
864 base::Closure on_start_tracing_done_callback =
865 base::Bind(&TracingControllerImpl::OnStartAgentTracingDone,
866 base::Unretained(this),
867 trace_config, start_tracing_done_callback_);
868 if (!BrowserThread::PostTask(
869 BrowserThread::FILE, FROM_HERE,
870 base::Bind(&TracingControllerImpl::SetEnabledOnFileThread,
871 base::Unretained(this), trace_config,
872 base::trace_event::TraceLog::RECORDING_MODE,
873 on_start_tracing_done_callback))) {
874 // BrowserThread::PostTask fails if the threads haven't been created yet,
875 // so it should be safe to just use TraceLog::SetEnabled directly.
876 base::trace_event::TraceLog::GetInstance()->SetEnabled(
877 trace_config, base::trace_event::TraceLog::RECORDING_MODE);
878 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
879 on_start_tracing_done_callback);
880 }
881
882 return true;
883 }
884
885 void TracingControllerImpl::StopAgentTracing(
886 const StopAgentTracingCallback& callback) {
887 DCHECK_CURRENTLY_ON(BrowserThread::UI);
888 // Handle special case of zero child processes by immediately flushing the
889 // trace log. Once the flush has completed the caller will be notified that
890 // tracing has ended.
891 if (pending_stop_tracing_ack_count_ == 1) {
892 // Flush/cancel asynchronously now, because we don't have any children to
893 // wait for.
894 if (trace_data_sink_) {
895 TraceLog::GetInstance()->Flush(
896 base::Bind(&TracingControllerImpl::OnLocalTraceDataCollected,
897 base::Unretained(this)),
898 true);
899 } else {
900 TraceLog::GetInstance()->CancelTracing(
901 base::Bind(&TracingControllerImpl::OnLocalTraceDataCollected,
902 base::Unretained(this)));
903 }
904 }
905
906 // Notify all child processes.
907 for (auto it : trace_message_filters_) {
908 if (trace_data_sink_)
909 it->SendEndTracing();
910 else
911 it->SendCancelTracing();
912 }
913 }
914
915 bool TracingControllerImpl::SupportsExplicitClockSync() {
916 // TODO(zhenw): return true after implementing explicit clock sync.
917 return false;
918 }
919
920 void TracingControllerImpl::RecordClockSyncMarker(
921 int sync_id,
922 const RecordClockSyncMarkerCallback& callback) {
923 DCHECK(SupportsExplicitClockSync());
924 // TODO(zhenw): implement explicit clock sync.
925 }
926
927 void TracingControllerImpl::IssueClockSyncMarker() {
928 // TODO(zhenw): implement explicit clock sync.
929 }
930
927 void TracingControllerImpl::RequestGlobalMemoryDump( 931 void TracingControllerImpl::RequestGlobalMemoryDump(
928 const base::trace_event::MemoryDumpRequestArgs& args, 932 const base::trace_event::MemoryDumpRequestArgs& args,
929 const base::trace_event::MemoryDumpCallback& callback) { 933 const base::trace_event::MemoryDumpCallback& callback) {
930 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 934 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
931 BrowserThread::PostTask( 935 BrowserThread::PostTask(
932 BrowserThread::UI, FROM_HERE, 936 BrowserThread::UI, FROM_HERE,
933 base::Bind(&TracingControllerImpl::RequestGlobalMemoryDump, 937 base::Bind(&TracingControllerImpl::RequestGlobalMemoryDump,
934 base::Unretained(this), args, callback)); 938 base::Unretained(this), args, callback));
935 return; 939 return;
936 } 940 }
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
1053 is_monitoring_ = is_monitoring; 1057 is_monitoring_ = is_monitoring;
1054 #if !defined(OS_ANDROID) 1058 #if !defined(OS_ANDROID)
1055 for (std::set<TracingUI*>::iterator it = tracing_uis_.begin(); 1059 for (std::set<TracingUI*>::iterator it = tracing_uis_.begin();
1056 it != tracing_uis_.end(); it++) { 1060 it != tracing_uis_.end(); it++) {
1057 (*it)->OnMonitoringStateChanged(is_monitoring); 1061 (*it)->OnMonitoringStateChanged(is_monitoring);
1058 } 1062 }
1059 #endif 1063 #endif
1060 } 1064 }
1061 1065
1062 } // namespace content 1066 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/tracing/tracing_controller_impl.h ('k') | content/browser/tracing/tracing_controller_impl_data_sinks.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698