| OLD | NEW |
| 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/debug/trace_event.h" | 7 #include "base/debug/trace_event.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 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 | 155 |
| 156 DISALLOW_COPY_AND_ASSIGN(StringTraceDataSink); | 156 DISALLOW_COPY_AND_ASSIGN(StringTraceDataSink); |
| 157 }; | 157 }; |
| 158 | 158 |
| 159 } // namespace | 159 } // namespace |
| 160 | 160 |
| 161 TracingController* TracingController::GetInstance() { | 161 TracingController* TracingController::GetInstance() { |
| 162 return TracingControllerImpl::GetInstance(); | 162 return TracingControllerImpl::GetInstance(); |
| 163 } | 163 } |
| 164 | 164 |
| 165 TracingControllerImpl::TracingControllerImpl() : | 165 TracingControllerImpl::TracingControllerImpl() |
| 166 pending_disable_recording_ack_count_(0), | 166 : pending_disable_recording_ack_count_(0), |
| 167 pending_capture_monitoring_snapshot_ack_count_(0), | 167 pending_capture_monitoring_snapshot_ack_count_(0), |
| 168 pending_trace_buffer_percent_full_ack_count_(0), | 168 pending_trace_buffer_percent_full_ack_count_(0), |
| 169 maximum_trace_buffer_percent_full_(0), | 169 maximum_trace_buffer_percent_full_(0), |
| 170 approximate_event_count_(0), |
| 170 // Tracing may have been enabled by ContentMainRunner if kTraceStartup | 171 // Tracing may have been enabled by ContentMainRunner if kTraceStartup |
| 171 // is specified in command line. | 172 // is specified in command line. |
| 172 #if defined(OS_CHROMEOS) || defined(OS_WIN) | 173 #if defined(OS_CHROMEOS) || defined(OS_WIN) |
| 173 is_system_tracing_(false), | 174 is_system_tracing_(false), |
| 174 #endif | 175 #endif |
| 175 is_recording_(TraceLog::GetInstance()->IsEnabled()), | 176 is_recording_(TraceLog::GetInstance()->IsEnabled()), |
| 176 is_monitoring_(false) { | 177 is_monitoring_(false) { |
| 177 } | 178 } |
| 178 | 179 |
| 179 TracingControllerImpl::~TracingControllerImpl() { | 180 TracingControllerImpl::~TracingControllerImpl() { |
| 180 // This is a Leaky instance. | 181 // This is a Leaky instance. |
| 181 NOTREACHED(); | 182 NOTREACHED(); |
| 182 } | 183 } |
| 183 | 184 |
| 184 TracingControllerImpl* TracingControllerImpl::GetInstance() { | 185 TracingControllerImpl* TracingControllerImpl::GetInstance() { |
| 185 return g_controller.Pointer(); | 186 return g_controller.Pointer(); |
| 186 } | 187 } |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 it->get()->SendCaptureMonitoringSnapshot(); | 493 it->get()->SendCaptureMonitoringSnapshot(); |
| 493 } | 494 } |
| 494 | 495 |
| 495 #if defined(OS_ANDROID) | 496 #if defined(OS_ANDROID) |
| 496 TraceLog::GetInstance()->AddClockSyncMetadataEvent(); | 497 TraceLog::GetInstance()->AddClockSyncMetadataEvent(); |
| 497 #endif | 498 #endif |
| 498 | 499 |
| 499 return true; | 500 return true; |
| 500 } | 501 } |
| 501 | 502 |
| 502 bool TracingControllerImpl::GetTraceBufferPercentFull( | 503 bool TracingControllerImpl::GetTraceBufferUsage( |
| 503 const GetTraceBufferPercentFullCallback& callback) { | 504 const GetTraceBufferUsageCallback& callback) { |
| 504 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 505 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 505 | 506 |
| 506 if (!can_get_trace_buffer_percent_full() || callback.is_null()) | 507 if (!can_get_trace_buffer_percent_full() || callback.is_null()) |
| 507 return false; | 508 return false; |
| 508 | 509 |
| 509 pending_trace_buffer_percent_full_callback_ = callback; | 510 pending_trace_buffer_percent_full_callback_ = callback; |
| 510 | 511 |
| 511 // Count myself in pending_trace_buffer_percent_full_ack_count_, acked below. | 512 // Count myself in pending_trace_buffer_percent_full_ack_count_, acked below. |
| 512 pending_trace_buffer_percent_full_ack_count_ = | 513 pending_trace_buffer_percent_full_ack_count_ = |
| 513 trace_message_filters_.size() + 1; | 514 trace_message_filters_.size() + 1; |
| 514 pending_trace_buffer_percent_full_filters_ = trace_message_filters_; | 515 pending_trace_buffer_percent_full_filters_ = trace_message_filters_; |
| 515 maximum_trace_buffer_percent_full_ = 0; | 516 maximum_trace_buffer_percent_full_ = 0; |
| 517 approximate_event_count_ = 0; |
| 516 | 518 |
| 517 // Call OnTraceBufferPercentFullReply unconditionally for the browser process. | 519 TraceLog::BufferUsage buffer_usage = |
| 520 TraceLog::GetInstance()->GetBufferUsage(); |
| 521 // Call OnTraceBufferUsageReply unconditionally for the browser process. |
| 518 // This will result in immediate execution of the callback if there are no | 522 // This will result in immediate execution of the callback if there are no |
| 519 // child processes. | 523 // child processes. |
| 520 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 524 BrowserThread::PostTask( |
| 521 base::Bind(&TracingControllerImpl::OnTraceBufferPercentFullReply, | 525 BrowserThread::UI, FROM_HERE, |
| 522 base::Unretained(this), | 526 base::Bind(&TracingControllerImpl::OnTraceBufferUsageReply, |
| 523 scoped_refptr<TraceMessageFilter>(), | 527 base::Unretained(this), scoped_refptr<TraceMessageFilter>(), |
| 524 TraceLog::GetInstance()->GetBufferPercentFull())); | 528 buffer_usage.percent_full, |
| 529 buffer_usage.approximate_event_count)); |
| 525 | 530 |
| 526 // Notify all child processes. | 531 // Notify all child processes. |
| 527 for (TraceMessageFilterSet::iterator it = trace_message_filters_.begin(); | 532 for (TraceMessageFilterSet::iterator it = trace_message_filters_.begin(); |
| 528 it != trace_message_filters_.end(); ++it) { | 533 it != trace_message_filters_.end(); ++it) { |
| 529 it->get()->SendGetTraceBufferPercentFull(); | 534 it->get()->SendGetTraceBufferUsage(); |
| 530 } | 535 } |
| 531 return true; | 536 return true; |
| 532 } | 537 } |
| 533 | 538 |
| 534 bool TracingControllerImpl::SetWatchEvent( | 539 bool TracingControllerImpl::SetWatchEvent( |
| 535 const std::string& category_name, | 540 const std::string& category_name, |
| 536 const std::string& event_name, | 541 const std::string& event_name, |
| 537 const WatchEventCallback& callback) { | 542 const WatchEventCallback& callback) { |
| 538 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 543 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 539 | 544 |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 629 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 634 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 630 base::Bind(&TracingControllerImpl::OnCaptureMonitoringSnapshotAcked, | 635 base::Bind(&TracingControllerImpl::OnCaptureMonitoringSnapshotAcked, |
| 631 base::Unretained(this), | 636 base::Unretained(this), |
| 632 make_scoped_refptr(trace_message_filter))); | 637 make_scoped_refptr(trace_message_filter))); |
| 633 } | 638 } |
| 634 } | 639 } |
| 635 if (pending_trace_buffer_percent_full_ack_count_ > 0) { | 640 if (pending_trace_buffer_percent_full_ack_count_ > 0) { |
| 636 TraceMessageFilterSet::const_iterator it = | 641 TraceMessageFilterSet::const_iterator it = |
| 637 pending_trace_buffer_percent_full_filters_.find(trace_message_filter); | 642 pending_trace_buffer_percent_full_filters_.find(trace_message_filter); |
| 638 if (it != pending_trace_buffer_percent_full_filters_.end()) { | 643 if (it != pending_trace_buffer_percent_full_filters_.end()) { |
| 639 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 644 BrowserThread::PostTask( |
| 640 base::Bind(&TracingControllerImpl::OnTraceBufferPercentFullReply, | 645 BrowserThread::UI, FROM_HERE, |
| 646 base::Bind(&TracingControllerImpl::OnTraceBufferUsageReply, |
| 641 base::Unretained(this), | 647 base::Unretained(this), |
| 642 make_scoped_refptr(trace_message_filter), | 648 make_scoped_refptr(trace_message_filter), 0, 0)); |
| 643 0)); | |
| 644 } | 649 } |
| 645 } | 650 } |
| 646 | 651 |
| 647 trace_message_filters_.erase(trace_message_filter); | 652 trace_message_filters_.erase(trace_message_filter); |
| 648 } | 653 } |
| 649 | 654 |
| 650 void TracingControllerImpl::OnDisableRecordingAcked( | 655 void TracingControllerImpl::OnDisableRecordingAcked( |
| 651 TraceMessageFilter* trace_message_filter, | 656 TraceMessageFilter* trace_message_filter, |
| 652 const std::vector<std::string>& known_category_groups) { | 657 const std::vector<std::string>& known_category_groups) { |
| 653 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 658 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 808 if (events_str_ptr->data().size()) | 813 if (events_str_ptr->data().size()) |
| 809 OnMonitoringTraceDataCollected(events_str_ptr); | 814 OnMonitoringTraceDataCollected(events_str_ptr); |
| 810 | 815 |
| 811 if (has_more_events) | 816 if (has_more_events) |
| 812 return; | 817 return; |
| 813 | 818 |
| 814 // Simulate an CaptureMonitoringSnapshotAcked for the local trace. | 819 // Simulate an CaptureMonitoringSnapshotAcked for the local trace. |
| 815 OnCaptureMonitoringSnapshotAcked(NULL); | 820 OnCaptureMonitoringSnapshotAcked(NULL); |
| 816 } | 821 } |
| 817 | 822 |
| 818 void TracingControllerImpl::OnTraceBufferPercentFullReply( | 823 void TracingControllerImpl::OnTraceBufferUsageReply( |
| 819 TraceMessageFilter* trace_message_filter, | 824 TraceMessageFilter* trace_message_filter, |
| 820 float percent_full) { | 825 float percent_full, |
| 826 size_t approximate_event_count) { |
| 821 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 827 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| 822 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 828 BrowserThread::PostTask( |
| 823 base::Bind(&TracingControllerImpl::OnTraceBufferPercentFullReply, | 829 BrowserThread::UI, FROM_HERE, |
| 830 base::Bind(&TracingControllerImpl::OnTraceBufferUsageReply, |
| 824 base::Unretained(this), | 831 base::Unretained(this), |
| 825 make_scoped_refptr(trace_message_filter), | 832 make_scoped_refptr(trace_message_filter), percent_full, |
| 826 percent_full)); | 833 approximate_event_count)); |
| 827 return; | 834 return; |
| 828 } | 835 } |
| 829 | 836 |
| 830 if (pending_trace_buffer_percent_full_ack_count_ == 0) | 837 if (pending_trace_buffer_percent_full_ack_count_ == 0) |
| 831 return; | 838 return; |
| 832 | 839 |
| 833 if (trace_message_filter && | 840 if (trace_message_filter && |
| 834 !pending_trace_buffer_percent_full_filters_.erase(trace_message_filter)) { | 841 !pending_trace_buffer_percent_full_filters_.erase(trace_message_filter)) { |
| 835 // The response from the specified message filter has already been received. | 842 // The response from the specified message filter has already been received. |
| 836 return; | 843 return; |
| 837 } | 844 } |
| 838 | 845 |
| 839 maximum_trace_buffer_percent_full_ = | 846 maximum_trace_buffer_percent_full_ = |
| 840 std::max(maximum_trace_buffer_percent_full_, percent_full); | 847 std::max(maximum_trace_buffer_percent_full_, percent_full); |
| 848 approximate_event_count_ += approximate_event_count; |
| 841 | 849 |
| 842 if (--pending_trace_buffer_percent_full_ack_count_ == 0) { | 850 if (--pending_trace_buffer_percent_full_ack_count_ == 0) { |
| 843 // Trigger callback if one is set. | 851 // Trigger callback if one is set. |
| 844 pending_trace_buffer_percent_full_callback_.Run( | 852 pending_trace_buffer_percent_full_callback_.Run( |
| 845 maximum_trace_buffer_percent_full_); | 853 maximum_trace_buffer_percent_full_, approximate_event_count_); |
| 846 pending_trace_buffer_percent_full_callback_.Reset(); | 854 pending_trace_buffer_percent_full_callback_.Reset(); |
| 847 } | 855 } |
| 848 } | 856 } |
| 849 | 857 |
| 850 void TracingControllerImpl::OnWatchEventMatched() { | 858 void TracingControllerImpl::OnWatchEventMatched() { |
| 851 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 859 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| 852 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 860 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 853 base::Bind(&TracingControllerImpl::OnWatchEventMatched, | 861 base::Bind(&TracingControllerImpl::OnWatchEventMatched, |
| 854 base::Unretained(this))); | 862 base::Unretained(this))); |
| 855 return; | 863 return; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 877 is_monitoring_ = is_monitoring; | 885 is_monitoring_ = is_monitoring; |
| 878 #if !defined(OS_ANDROID) | 886 #if !defined(OS_ANDROID) |
| 879 for (std::set<TracingUI*>::iterator it = tracing_uis_.begin(); | 887 for (std::set<TracingUI*>::iterator it = tracing_uis_.begin(); |
| 880 it != tracing_uis_.end(); it++) { | 888 it != tracing_uis_.end(); it++) { |
| 881 (*it)->OnMonitoringStateChanged(is_monitoring); | 889 (*it)->OnMonitoringStateChanged(is_monitoring); |
| 882 } | 890 } |
| 883 #endif | 891 #endif |
| 884 } | 892 } |
| 885 | 893 |
| 886 } // namespace content | 894 } // namespace content |
| OLD | NEW |