Chromium Code Reviews| Index: content/browser/tracing/trace_controller_impl.cc |
| diff --git a/content/browser/tracing/trace_controller_impl.cc b/content/browser/tracing/trace_controller_impl.cc |
| index 53e4ea5cae05fb44b09f45c02cda83f42f08acf9..25eb21fab2cf6ac0ac7ecee22be92d8899a22313 100644 |
| --- a/content/browser/tracing/trace_controller_impl.cc |
| +++ b/content/browser/tracing/trace_controller_impl.cc |
| @@ -148,6 +148,10 @@ bool TraceControllerImpl::EndTracingAsync(TraceSubscriber* subscriber) { |
| if (!can_end_tracing() || subscriber != subscriber_) |
| return false; |
| + // Disable local trace early to avoid traces during end-tracing process from |
| + // interfering with the process. |
| + TraceLog::GetInstance()->SetDisabled(); |
| + |
| // There could be a case where there are no child processes and filters_ |
| // is empty. In that case we can immediately tell the subscriber that tracing |
| // has ended. To avoid recursive calls back to the subscriber, we will just |
| @@ -301,20 +305,20 @@ void TraceControllerImpl::OnEndTracingAck( |
| if (pending_end_ack_count_ == 0) |
| return; |
| - if (--pending_end_ack_count_ == 0) { |
| - // All acks have been received. |
| - is_tracing_ = false; |
| - |
| - // Disable local trace. |
| - TraceLog::GetInstance()->SetDisabled(); |
| - // During this call, our OnTraceDataCollected will be |
| - // called with the last of the local trace data. Since we are on the UI |
| - // thread, the call to OnTraceDataCollected will be synchronous, so we can |
| - // immediately call OnEndTracingComplete below. |
| + if (--pending_end_ack_count_ == 1) { |
| + // All acks from subprocesses have been received. Now flush the local trace. |
| + // During or after this call, our OnLocalTraceDataCollected will be |
| + // called with the last of the local trace data. |
| TraceLog::GetInstance()->Flush( |
| - base::Bind(&TraceControllerImpl::OnTraceDataCollected, |
| + base::Bind(&TraceControllerImpl::OnLocalTraceDataCollected, |
| base::Unretained(this))); |
| + } |
| + |
| + if (pending_end_ack_count_ == 0) { |
| + // All acks (including from the subprocesses and local trace have been |
| + // received. |
|
dsinclair
2013/08/29 14:24:32
nit: missing )
Xianzhu
2013/08/29 17:42:12
Done.
|
| + is_tracing_ = false; |
| // Trigger callback if one is set. |
| if (subscriber_) { |
| @@ -328,16 +332,6 @@ void TraceControllerImpl::OnEndTracingAck( |
| is_get_category_groups_ = false; |
| } |
| - |
| - if (pending_end_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. |
| - std::vector<std::string> category_groups; |
| - TraceLog::GetInstance()->GetKnownCategoryGroups(&category_groups); |
| - BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| - base::Bind(&TraceControllerImpl::OnEndTracingAck, |
| - base::Unretained(this), category_groups)); |
| - } |
| } |
| void TraceControllerImpl::OnTraceDataCollected( |
| @@ -356,6 +350,20 @@ void TraceControllerImpl::OnTraceDataCollected( |
| subscriber_->OnTraceDataCollected(events_str_ptr); |
| } |
| +void TraceControllerImpl::OnLocalTraceDataCollected( |
| + const scoped_refptr<base::RefCountedString>& events_str_ptr, |
| + bool has_more_events) { |
| + if (events_str_ptr->data().size()) |
| + OnTraceDataCollected(events_str_ptr); |
| + |
| + if (!has_more_events) { |
| + // Simulate an EndTrackingAck for the local trace. |
| + std::vector<std::string> category_groups; |
| + TraceLog::GetInstance()->GetKnownCategoryGroups(&category_groups); |
| + OnEndTracingAck(category_groups); |
| + } |
| +} |
| + |
| void TraceControllerImpl::OnTraceNotification(int notification) { |
| // OnTraceNotification may be called from any browser thread, either by the |
| // local event trace system or from child processes via TraceMessageFilter. |