diff options
-rw-r--r-- | content/browser/trace_message_filter.cc | 22 | ||||
-rw-r--r-- | content/browser/trace_message_filter.h | 4 | ||||
-rw-r--r-- | content/common/child_process_messages.h | 3 | ||||
-rw-r--r-- | content/common/child_trace_message_filter.cc | 1 |
4 files changed, 23 insertions, 7 deletions
diff --git a/content/browser/trace_message_filter.cc b/content/browser/trace_message_filter.cc index fcefc94..6345888 100644 --- a/content/browser/trace_message_filter.cc +++ b/content/browser/trace_message_filter.cc @@ -9,6 +9,7 @@ TraceMessageFilter::TraceMessageFilter() : + has_child_(false), is_awaiting_end_ack_(false), is_awaiting_bpf_ack_(false) { } @@ -19,21 +20,21 @@ TraceMessageFilter::~TraceMessageFilter() { void TraceMessageFilter::OnFilterAdded(IPC::Channel* channel) { // Always on IO thread (BrowserMessageFilter guarantee). BrowserMessageFilter::OnFilterAdded(channel); - - TraceController::GetInstance()->AddFilter(this); } void TraceMessageFilter::OnChannelClosing() { // Always on IO thread (BrowserMessageFilter guarantee). BrowserMessageFilter::OnChannelClosing(); - if (is_awaiting_bpf_ack_) - OnEndTracingAck(std::vector<std::string>()); + if (has_child_) { + if (is_awaiting_bpf_ack_) + OnEndTracingAck(std::vector<std::string>()); - if (is_awaiting_end_ack_) - OnTraceBufferPercentFullReply(0.0f); + if (is_awaiting_end_ack_) + OnTraceBufferPercentFullReply(0.0f); - TraceController::GetInstance()->RemoveFilter(this); + TraceController::GetInstance()->RemoveFilter(this); + } } bool TraceMessageFilter::OnMessageReceived(const IPC::Message& message, @@ -41,6 +42,8 @@ bool TraceMessageFilter::OnMessageReceived(const IPC::Message& message, // Always on IO thread (BrowserMessageFilter guarantee). bool handled = true; IPC_BEGIN_MESSAGE_MAP_EX(TraceMessageFilter, message, *message_was_ok) + IPC_MESSAGE_HANDLER(ChildProcessHostMsg_ChildSupportsTracing, + OnChildSupportsTracing) IPC_MESSAGE_HANDLER(ChildProcessHostMsg_EndTracingAck, OnEndTracingAck) IPC_MESSAGE_HANDLER(ChildProcessHostMsg_TraceDataCollected, OnTraceDataCollected) @@ -75,6 +78,11 @@ void TraceMessageFilter::SendGetTraceBufferPercentFull() { Send(new ChildProcessMsg_GetTraceBufferPercentFull); } +void TraceMessageFilter::OnChildSupportsTracing() { + has_child_ = true; + TraceController::GetInstance()->AddFilter(this); +} + void TraceMessageFilter::OnEndTracingAck( const std::vector<std::string>& known_categories) { // is_awaiting_end_ack_ should always be true here, but check in case the diff --git a/content/browser/trace_message_filter.h b/content/browser/trace_message_filter.h index c2d5d93..8317efd 100644 --- a/content/browser/trace_message_filter.h +++ b/content/browser/trace_message_filter.h @@ -33,11 +33,15 @@ class TraceMessageFilter : public BrowserMessageFilter { private: // Message handlers. + void OnChildSupportsTracing(); void OnEndTracingAck(const std::vector<std::string>& known_categories); void OnTraceBufferFull(); void OnTraceBufferPercentFullReply(float percent_full); void OnTraceDataCollected(const std::string& data); + // ChildTraceMessageFilter exists: + bool has_child_; + // Awaiting ack for previously sent SendEndTracing bool is_awaiting_end_ack_; bool is_awaiting_bpf_ack_; diff --git a/content/common/child_process_messages.h b/content/common/child_process_messages.h index b1a8b33..e465b59 100644 --- a/content/common/child_process_messages.h +++ b/content/common/child_process_messages.h @@ -48,6 +48,9 @@ IPC_MESSAGE_CONTROL0(ChildProcessMsg_DumpHandles) IPC_MESSAGE_CONTROL0(ChildProcessHostMsg_ShutdownRequest) +// Notify the browser that this child process supports tracing. +IPC_MESSAGE_CONTROL0(ChildProcessHostMsg_ChildSupportsTracing) + // Reply from child processes acking ChildProcessMsg_TraceChangeStatus(false). IPC_MESSAGE_CONTROL1(ChildProcessHostMsg_EndTracingAck, std::vector<std::string> /* known_categories */) diff --git a/content/common/child_trace_message_filter.cc b/content/common/child_trace_message_filter.cc index 4a04ac1..2af2ab1 100644 --- a/content/common/child_trace_message_filter.cc +++ b/content/common/child_trace_message_filter.cc @@ -23,6 +23,7 @@ void ChildTraceMessageFilter::OnFilterAdded(IPC::Channel* channel) { base::Bind(&ChildTraceMessageFilter::OnTraceDataCollected, this)); base::debug::TraceLog::GetInstance()->SetBufferFullCallback( base::Bind(&ChildTraceMessageFilter::OnTraceBufferFull, this)); + channel_->Send(new ChildProcessHostMsg_ChildSupportsTracing()); } void ChildTraceMessageFilter::OnFilterRemoved() { |