| Index: content/browser/tracing/tracing_controller_impl.cc
|
| diff --git a/content/browser/tracing/tracing_controller_impl.cc b/content/browser/tracing/tracing_controller_impl.cc
|
| index 6bb6c06093d1ad4693309042aad0a22bc148ba9a..9b2e4466c4bc085c1624fef123707db9a4518b58 100644
|
| --- a/content/browser/tracing/tracing_controller_impl.cc
|
| +++ b/content/browser/tracing/tracing_controller_impl.cc
|
| @@ -94,6 +94,8 @@ void TracingControllerImpl::ResultFile::Close() {
|
| TracingControllerImpl::TracingControllerImpl() :
|
| pending_disable_recording_ack_count_(0),
|
| pending_capture_monitoring_snapshot_ack_count_(0),
|
| + pending_trace_buffer_percent_full_ack_count_(0),
|
| + maximum_trace_buffer_percent_full_(0),
|
| // Tracing may have been enabled by ContentMainRunner if kTraceStartup
|
| // is specified in command line.
|
| is_recording_(TraceLog::GetInstance()->IsEnabled()),
|
| @@ -139,9 +141,15 @@ bool TracingControllerImpl::EnableRecording(
|
| TraceLog::GetInstance()->AddClockSyncMetadataEvent();
|
| #endif
|
|
|
| - TraceLog::Options trace_options = TraceLog::GetInstance()->trace_options();
|
| - TraceLog::GetInstance()->SetEnabled(filter, trace_options);
|
| + TraceLog::Options trace_options = (options & RECORD_CONTINUOUSLY) ?
|
| + TraceLog::RECORD_CONTINUOUSLY : TraceLog::RECORD_UNTIL_FULL;
|
| + if (options & ENABLE_SAMPLING) {
|
| + trace_options = static_cast<TraceLog::Options>(
|
| + trace_options | TraceLog::ENABLE_SAMPLING);
|
| + }
|
| + // TODO(haraken): How to handle ENABLE_SYSTRACE?
|
|
|
| + TraceLog::GetInstance()->SetEnabled(filter, trace_options);
|
| is_recording_ = true;
|
| category_filter_ = TraceLog::GetInstance()->GetCurrentCategoryFilter();
|
|
|
| @@ -295,6 +303,33 @@ void TracingControllerImpl::CaptureMonitoringSnapshot(
|
| #endif
|
| }
|
|
|
| +bool TracingControllerImpl::GetTraceBufferPercentFull(
|
| + const GetTraceBufferPercentFullCallback& callback) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + if (!can_get_trace_buffer_percent_full() || callback.is_null())
|
| + return false;
|
| +
|
| + pending_trace_buffer_percent_full_callback_ = callback;
|
| +
|
| + // Count myself in pending_trace_buffer_percent_full_ack_count_, acked below.
|
| + pending_trace_buffer_percent_full_ack_count_ = filters_.size() + 1;
|
| +
|
| + // Handle special case of zero child processes.
|
| + if (pending_trace_buffer_percent_full_ack_count_ == 1) {
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&TracingControllerImpl::OnTraceBufferPercentFullReply,
|
| + base::Unretained(this),
|
| + TraceLog::GetInstance()->GetBufferPercentFull()));
|
| + }
|
| +
|
| + // Notify all child processes.
|
| + for (FilterMap::iterator it = filters_.begin(); it != filters_.end(); ++it) {
|
| + it->get()->SendGetTraceBufferPercentFull();
|
| + }
|
| + return true;
|
| +}
|
| +
|
| void TracingControllerImpl::AddFilter(TraceMessageFilter* filter) {
|
| if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
|
| BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| @@ -457,4 +492,35 @@ void TracingControllerImpl::OnLocalMonitoringTraceDataCollected(
|
| OnCaptureMonitoringSnapshotAcked();
|
| }
|
|
|
| +void TracingControllerImpl::OnTraceBufferPercentFullReply(float percent_full) {
|
| + if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&TracingControllerImpl::OnTraceBufferPercentFullReply,
|
| + base::Unretained(this), percent_full));
|
| + return;
|
| + }
|
| +
|
| + if (pending_trace_buffer_percent_full_ack_count_ == 0)
|
| + return;
|
| +
|
| + maximum_trace_buffer_percent_full_ =
|
| + std::max(maximum_trace_buffer_percent_full_, percent_full);
|
| +
|
| + if (--pending_trace_buffer_percent_full_ack_count_ == 0) {
|
| + // Trigger callback if one is set.
|
| + pending_trace_buffer_percent_full_callback_.Run(
|
| + maximum_trace_buffer_percent_full_);
|
| + pending_trace_buffer_percent_full_callback_.Reset();
|
| + }
|
| +
|
| + if (pending_trace_buffer_percent_full_ack_count_ == 1) {
|
| + // The last ack represents local trace, so we need to ack it now. Note that
|
| + // this code only executes if there were child processes.
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&TracingControllerImpl::OnTraceBufferPercentFullReply,
|
| + base::Unretained(this),
|
| + TraceLog::GetInstance()->GetBufferPercentFull()));
|
| + }
|
| +}
|
| +
|
| } // namespace content
|
|
|