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

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

Issue 1526883005: [Tracing Clock Sync] Implement clock sync in Chrome (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 } 141 }
142 142
143 TracingControllerImpl::TracingControllerImpl() 143 TracingControllerImpl::TracingControllerImpl()
144 : pending_stop_tracing_ack_count_(0), 144 : pending_stop_tracing_ack_count_(0),
145 pending_capture_monitoring_snapshot_ack_count_(0), 145 pending_capture_monitoring_snapshot_ack_count_(0),
146 pending_trace_log_status_ack_count_(0), 146 pending_trace_log_status_ack_count_(0),
147 maximum_trace_buffer_usage_(0), 147 maximum_trace_buffer_usage_(0),
148 approximate_event_count_(0), 148 approximate_event_count_(0),
149 pending_memory_dump_ack_count_(0), 149 pending_memory_dump_ack_count_(0),
150 failed_memory_dump_count_(0), 150 failed_memory_dump_count_(0),
151 clock_sync_id_(0),
152 pending_clock_sync_ack_count_(0),
151 is_tracing_(false), 153 is_tracing_(false),
152 is_monitoring_(false) { 154 is_monitoring_(false) {
153 base::trace_event::MemoryDumpManager::GetInstance()->Initialize( 155 base::trace_event::MemoryDumpManager::GetInstance()->Initialize(
154 this /* delegate */, true /* is_coordinator */); 156 this /* delegate */, true /* is_coordinator */);
155 157
156 // Deliberately leaked, like this class. 158 // Deliberately leaked, like this class.
157 base::FileTracing::SetProvider(new FileTracingProviderImpl); 159 base::FileTracing::SetProvider(new FileTracingProviderImpl);
158 } 160 }
159 161
160 TracingControllerImpl::~TracingControllerImpl() { 162 TracingControllerImpl::~TracingControllerImpl() {
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 delegate->GetMetadataFilterPredicate()); 282 delegate->GetMetadataFilterPredicate());
281 } 283 }
282 } 284 }
283 trace_data_sink->AddMetadata(*GenerateTracingMetadataDict().get()); 285 trace_data_sink->AddMetadata(*GenerateTracingMetadataDict().get());
284 } 286 }
285 287
286 if (!can_stop_tracing()) 288 if (!can_stop_tracing())
287 return false; 289 return false;
288 290
289 trace_data_sink_ = trace_data_sink; 291 trace_data_sink_ = trace_data_sink;
292
293 // Issue clock sync marker before actually stopping tracing.
294 // StopTracingAfterClockSync() will be called after clock sync is done.
295 IssueClockSyncMarker();
296
297 return true;
298 }
299
300 void TracingControllerImpl::StopTracingAfterClockSync() {
301 DCHECK_CURRENTLY_ON(BrowserThread::UI);
290 // Disable local trace early to avoid traces during end-tracing process from 302 // Disable local trace early to avoid traces during end-tracing process from
291 // interfering with the process. 303 // interfering with the process.
292 base::Closure on_stop_tracing_done_callback = base::Bind( 304 base::Closure on_stop_tracing_done_callback = base::Bind(
293 &TracingControllerImpl::OnStopTracingDone, base::Unretained(this)); 305 &TracingControllerImpl::OnStopTracingDone, base::Unretained(this));
294 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 306 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
295 base::Bind(&TracingControllerImpl::SetDisabledOnFileThread, 307 base::Bind(&TracingControllerImpl::SetDisabledOnFileThread,
296 base::Unretained(this), 308 base::Unretained(this),
297 on_stop_tracing_done_callback)); 309 on_stop_tracing_done_callback));
298 return true;
299 } 310 }
300 311
301 void TracingControllerImpl::OnStopTracingDone() { 312 void TracingControllerImpl::OnStopTracingDone() {
302 DCHECK_CURRENTLY_ON(BrowserThread::UI); 313 DCHECK_CURRENTLY_ON(BrowserThread::UI);
303 314
304 #if defined(OS_ANDROID) 315 #if defined(OS_ANDROID)
305 if (pending_get_categories_done_callback_.is_null()) 316 if (pending_get_categories_done_callback_.is_null())
306 TraceLog::GetInstance()->AddClockSyncMetadataEvent(); 317 TraceLog::GetInstance()->AddClockSyncMetadataEvent();
307 #endif 318 #endif
308 319
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after
906 // Notify all child processes. 917 // Notify all child processes.
907 for (auto it : trace_message_filters_) { 918 for (auto it : trace_message_filters_) {
908 if (trace_data_sink_) 919 if (trace_data_sink_)
909 it->SendEndTracing(); 920 it->SendEndTracing();
910 else 921 else
911 it->SendCancelTracing(); 922 it->SendCancelTracing();
912 } 923 }
913 } 924 }
914 925
915 bool TracingControllerImpl::SupportsExplicitClockSync() { 926 bool TracingControllerImpl::SupportsExplicitClockSync() {
916 // TODO(zhenw): return true after implementing explicit clock sync. 927 return true;
917 return false;
918 } 928 }
919 929
920 void TracingControllerImpl::RecordClockSyncMarker( 930 void TracingControllerImpl::RecordClockSyncMarker(
921 int sync_id, 931 int sync_id,
922 const RecordClockSyncMarkerCallback& callback) { 932 const RecordClockSyncMarkerCallback& callback) {
923 DCHECK(SupportsExplicitClockSync()); 933 DCHECK(SupportsExplicitClockSync());
924 // TODO(zhenw): implement explicit clock sync. 934
935 TRACE_EVENT_CLOCK_SYNC_RECEIVER(sync_id);
936 }
937
938 int TracingControllerImpl::GetUniqueClockSyncID() {
939 DCHECK_CURRENTLY_ON(BrowserThread::UI);
940 // There is no need to lock because this function only runs on UI thread.
941 clock_sync_id_ += 1;
942 return clock_sync_id_;
oystein (OOO til 10th of July) 2015/12/16 02:10:05 nit: return ++clock_sync_id_;
Zhen Wang 2015/12/16 23:49:12 Done. Is there any reason to prefer combining thos
925 } 943 }
926 944
927 void TracingControllerImpl::IssueClockSyncMarker() { 945 void TracingControllerImpl::IssueClockSyncMarker() {
928 // TODO(zhenw): implement explicit clock sync. 946 DCHECK_CURRENTLY_ON(BrowserThread::UI);
947
948 pending_clock_sync_ack_count_ = 0;
oystein (OOO til 10th of July) 2015/12/16 02:10:05 Can this be != 0 at this point? Would we ever have
Zhen Wang 2015/12/16 23:49:12 Updated to CHECK. But how about the following scen
949 for (auto it : additional_tracing_agents_) {
oystein (OOO til 10th of July) 2015/12/16 02:10:05 nit: const auto& it
Zhen Wang 2015/12/16 23:49:12 Done.
950 if (it->SupportsExplicitClockSync()) {
951 it->RecordClockSyncMarker(
952 GetUniqueClockSyncID(),
953 base::Bind(&TracingControllerImpl::OnClockSyncMarkerRecordedByAgent,
954 base::Unretained(this)));
955 pending_clock_sync_ack_count_++;
956 }
957 }
958
959 // No clock sync is needed, stop tracing right away.
960 if (pending_clock_sync_ack_count_ == 0)
961 StopTracingAfterClockSync();
962 }
963
964 void TracingControllerImpl::OnClockSyncMarkerRecordedByAgent(
965 int sync_id,
966 const base::TimeTicks& issue_ts,
967 const base::TimeTicks& issue_end_ts) {
968 DCHECK_CURRENTLY_ON(BrowserThread::UI);
969
970 TRACE_EVENT_CLOCK_SYNC_ISSUER(sync_id, issue_ts, issue_end_ts);
971
972 pending_clock_sync_ack_count_--;
oystein (OOO til 10th of July) 2015/12/16 02:10:07 nit: if(--pending_clock_sync_ack_count_ == 0).
Zhen Wang 2015/12/16 23:49:12 Done.
973 if (pending_clock_sync_ack_count_ == 0)
oystein (OOO til 10th of July) 2015/12/16 02:10:05 I feel like this makes the API a little bit fragil
Zhen Wang 2015/12/16 23:49:12 Done.
974 StopTracingAfterClockSync();
929 } 975 }
930 976
931 void TracingControllerImpl::RequestGlobalMemoryDump( 977 void TracingControllerImpl::RequestGlobalMemoryDump(
932 const base::trace_event::MemoryDumpRequestArgs& args, 978 const base::trace_event::MemoryDumpRequestArgs& args,
933 const base::trace_event::MemoryDumpCallback& callback) { 979 const base::trace_event::MemoryDumpCallback& callback) {
934 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 980 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
935 BrowserThread::PostTask( 981 BrowserThread::PostTask(
936 BrowserThread::UI, FROM_HERE, 982 BrowserThread::UI, FROM_HERE,
937 base::Bind(&TracingControllerImpl::RequestGlobalMemoryDump, 983 base::Bind(&TracingControllerImpl::RequestGlobalMemoryDump,
938 base::Unretained(this), args, callback)); 984 base::Unretained(this), args, callback));
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
1057 is_monitoring_ = is_monitoring; 1103 is_monitoring_ = is_monitoring;
1058 #if !defined(OS_ANDROID) 1104 #if !defined(OS_ANDROID)
1059 for (std::set<TracingUI*>::iterator it = tracing_uis_.begin(); 1105 for (std::set<TracingUI*>::iterator it = tracing_uis_.begin();
1060 it != tracing_uis_.end(); it++) { 1106 it != tracing_uis_.end(); it++) {
1061 (*it)->OnMonitoringStateChanged(is_monitoring); 1107 (*it)->OnMonitoringStateChanged(is_monitoring);
1062 } 1108 }
1063 #endif 1109 #endif
1064 } 1110 }
1065 1111
1066 } // namespace content 1112 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698