summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/browser/trace_message_filter.cc22
-rw-r--r--content/browser/trace_message_filter.h4
-rw-r--r--content/common/child_process_messages.h3
-rw-r--r--content/common/child_trace_message_filter.cc1
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() {