summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjbates@chromium.org <jbates@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-04 00:05:02 +0000
committerjbates@chromium.org <jbates@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-04 00:05:02 +0000
commit86ba3f7f335bdc5632d9b531cec22e7a1ed06ddf (patch)
treec8cdca41939cee914e1d84983e3c75b5720faf67
parentd04353ee390607f2f7674a417057428a710d4dda (diff)
downloadchromium_src-86ba3f7f335bdc5632d9b531cec22e7a1ed06ddf.zip
chromium_src-86ba3f7f335bdc5632d9b531cec22e7a1ed06ddf.tar.gz
chromium_src-86ba3f7f335bdc5632d9b531cec22e7a1ed06ddf.tar.bz2
Remove TraceMessageFilter for NACL_LOADER_PROCESS types that do not support tracing.
BUG=95949 TEST=start and stop trace in about:tracing while nacl app is running; verify it does not hang with "Processing trace" Review URL: http://codereview.chromium.org/8118013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@103823 0039d316-1c4b-4281-b951-d872f2087c98
-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() {