Commit 502a8b4d authored by Eric Seckler's avatar Eric Seckler Committed by Commit Bot

ipc/tracing: Use typed trace events for IPC message sends

Replaces SyncChannel::Send, RenderProcessHostImpl::Send, and
GpuChannelHost::Send trace events with typed trace events. Also adds a
utility to convert the IPC class ID to a corresponding protobuf enum.

Corresponding proto buffer definitions for these events were added in
aosp/1180211.

Typed trace events will allow inclusion of the event arguments in slow
reports data in the future. The trace format is protocol-buffer based
under the hood already (see docs.perfetto.dev for details), this patch
adds strong typing for the arguments of the respective events only.

TBR: sunnyps@chromium.org
Bug: 644264
Change-Id: I91c71230e62161b08faec889bf9eb70639ae0b5e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1950986
Commit-Queue: Eric Seckler <eseckler@chromium.org>
Reviewed-by: default avatarAlex Moshchuk <alexmos@chromium.org>
Reviewed-by: default avatarKen Rockot <rockot@google.com>
Cr-Commit-Position: refs/heads/master@{#730120}
parent 29e499dc
...@@ -193,6 +193,7 @@ ...@@ -193,6 +193,7 @@
#include "ipc/ipc_channel.h" #include "ipc/ipc_channel.h"
#include "ipc/ipc_channel_mojo.h" #include "ipc/ipc_channel_mojo.h"
#include "ipc/ipc_logging.h" #include "ipc/ipc_logging.h"
#include "ipc/trace_ipc_message.h"
#include "media/audio/audio_manager.h" #include "media/audio/audio_manager.h"
#include "media/base/media_switches.h" #include "media/base/media_switches.h"
#include "media/capture/capture_switches.h" #include "media/capture/capture_switches.h"
...@@ -3370,9 +3371,7 @@ bool RenderProcessHostImpl::FastShutdownIfPossible(size_t page_count, ...@@ -3370,9 +3371,7 @@ bool RenderProcessHostImpl::FastShutdownIfPossible(size_t page_count,
} }
bool RenderProcessHostImpl::Send(IPC::Message* msg) { bool RenderProcessHostImpl::Send(IPC::Message* msg) {
TRACE_EVENT2("renderer_host", "RenderProcessHostImpl::Send", "class", TRACE_IPC_MESSAGE_SEND("renderer_host", "RenderProcessHostImpl::Send", msg);
IPC_MESSAGE_ID_CLASS(msg->type()), "line",
IPC_MESSAGE_ID_LINE(msg->type()));
std::unique_ptr<IPC::Message> message(msg); std::unique_ptr<IPC::Message> message(msg);
......
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
#include "base/single_thread_task_runner.h" #include "base/single_thread_task_runner.h"
#include "base/threading/thread_restrictions.h" #include "base/threading/thread_restrictions.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "gpu/ipc/common/command_buffer_id.h" #include "gpu/ipc/common/command_buffer_id.h"
#include "gpu/ipc/common/gpu_messages.h" #include "gpu/ipc/common/gpu_messages.h"
...@@ -21,6 +20,7 @@ ...@@ -21,6 +20,7 @@
#include "gpu/ipc/common/gpu_watchdog_timeout.h" #include "gpu/ipc/common/gpu_watchdog_timeout.h"
#include "ipc/ipc_channel_mojo.h" #include "ipc/ipc_channel_mojo.h"
#include "ipc/ipc_sync_message.h" #include "ipc/ipc_sync_message.h"
#include "ipc/trace_ipc_message.h"
#include "mojo/public/cpp/bindings/lib/message_quota_checker.h" #include "mojo/public/cpp/bindings/lib/message_quota_checker.h"
#include "url/gurl.h" #include "url/gurl.h"
...@@ -53,9 +53,7 @@ GpuChannelHost::GpuChannelHost(int channel_id, ...@@ -53,9 +53,7 @@ GpuChannelHost::GpuChannelHost(int channel_id,
} }
bool GpuChannelHost::Send(IPC::Message* msg) { bool GpuChannelHost::Send(IPC::Message* msg) {
TRACE_EVENT2("ipc", "GpuChannelHost::Send", "class", TRACE_IPC_MESSAGE_SEND("ipc", "GpuChannelHost::Send", msg);
IPC_MESSAGE_ID_CLASS(msg->type()), "line",
IPC_MESSAGE_ID_LINE(msg->type()));
auto message = base::WrapUnique(msg); auto message = base::WrapUnique(msg);
......
...@@ -107,6 +107,14 @@ component("ipc") { ...@@ -107,6 +107,14 @@ component("ipc") {
if (enable_ipc_fuzzer) { if (enable_ipc_fuzzer) {
public_configs = [ "//tools/ipc_fuzzer:ipc_fuzzer_config" ] public_configs = [ "//tools/ipc_fuzzer:ipc_fuzzer_config" ]
} }
if (!is_nacl && !is_ios) {
sources += [
"trace_ipc_message.cc",
"trace_ipc_message.h",
]
public_deps += [ "//services/tracing/public/cpp" ]
}
} }
component("message_support") { component("message_support") {
......
...@@ -4,6 +4,8 @@ include_rules = [ ...@@ -4,6 +4,8 @@ include_rules = [
# For ipc_channel_nacl.cc: # For ipc_channel_nacl.cc:
"+native_client/src/public", "+native_client/src/public",
"+sandbox/mac/seatbelt.h", "+sandbox/mac/seatbelt.h",
"+services/tracing/public/cpp",
"+third_party/perfetto/protos/perfetto/trace/track_event",
] ]
specific_include_rules = { specific_include_rules = {
......
...@@ -21,12 +21,17 @@ ...@@ -21,12 +21,17 @@
#include "base/threading/thread_local.h" #include "base/threading/thread_local.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h" #include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "ipc/ipc_channel_factory.h" #include "ipc/ipc_channel_factory.h"
#include "ipc/ipc_logging.h" #include "ipc/ipc_logging.h"
#include "ipc/ipc_message_macros.h" #include "ipc/ipc_message_macros.h"
#include "ipc/ipc_sync_message.h" #include "ipc/ipc_sync_message.h"
#include "mojo/public/cpp/bindings/sync_event_watcher.h" #include "mojo/public/cpp/bindings/sync_event_watcher.h"
#if !defined(OS_NACL) && !BUILDFLAG(IPC_MESSAGE_LOG_ENABLED)
#include "ipc/trace_ipc_message.h"
#endif
using base::WaitableEvent; using base::WaitableEvent;
namespace IPC { namespace IPC {
...@@ -609,6 +614,8 @@ bool SyncChannel::Send(Message* message) { ...@@ -609,6 +614,8 @@ bool SyncChannel::Send(Message* message) {
Logging::GetInstance()->GetMessageText( Logging::GetInstance()->GetMessageText(
message->type(), &name, message, nullptr); message->type(), &name, message, nullptr);
TRACE_EVENT1("ipc", "SyncChannel::Send", "name", name); TRACE_EVENT1("ipc", "SyncChannel::Send", "name", name);
#elif !defined(OS_NACL)
TRACE_IPC_MESSAGE_SEND("ipc", "SyncChannel::Send", message);
#else #else
TRACE_EVENT2("ipc", "SyncChannel::Send", TRACE_EVENT2("ipc", "SyncChannel::Send",
"class", IPC_MESSAGE_ID_CLASS(message->type()), "class", IPC_MESSAGE_ID_CLASS(message->type()),
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ipc/trace_ipc_message.h"
#include <stdint.h>
#include "ipc/ipc_message_macros.h"
#include "ipc/ipc_message_start.h"
#include "third_party/perfetto/protos/perfetto/trace/track_event/chrome_legacy_ipc.pbzero.h"
namespace IPC {
using perfetto::protos::pbzero::ChromeLegacyIpc;
void WriteIpcMessageIdAsProtozero(uint32_t message_id,
ChromeLegacyIpc* legacy_ipc) {
ChromeLegacyIpc::MessageClass message_class =
ChromeLegacyIpc::CLASS_UNSPECIFIED;
switch (IPC_MESSAGE_ID_CLASS(message_id)) {
case AutomationMsgStart:
message_class = ChromeLegacyIpc::CLASS_AUTOMATION;
break;
case FrameMsgStart:
message_class = ChromeLegacyIpc::CLASS_FRAME;
break;
case PageMsgStart:
message_class = ChromeLegacyIpc::CLASS_PAGE;
break;
case ViewMsgStart:
message_class = ChromeLegacyIpc::CLASS_VIEW;
break;
case WidgetMsgStart:
message_class = ChromeLegacyIpc::CLASS_WIDGET;
break;
case InputMsgStart:
message_class = ChromeLegacyIpc::CLASS_INPUT;
break;
case TestMsgStart:
message_class = ChromeLegacyIpc::CLASS_TEST;
break;
case WorkerMsgStart:
message_class = ChromeLegacyIpc::CLASS_WORKER;
break;
case NaClMsgStart:
message_class = ChromeLegacyIpc::CLASS_NACL;
break;
case GpuChannelMsgStart:
message_class = ChromeLegacyIpc::CLASS_GPU_CHANNEL;
break;
case MediaMsgStart:
message_class = ChromeLegacyIpc::CLASS_MEDIA;
break;
case PpapiMsgStart:
message_class = ChromeLegacyIpc::CLASS_PPAPI;
break;
case ChromeMsgStart:
message_class = ChromeLegacyIpc::CLASS_CHROME;
break;
case DragMsgStart:
message_class = ChromeLegacyIpc::CLASS_DRAG;
break;
case PrintMsgStart:
message_class = ChromeLegacyIpc::CLASS_PRINT;
break;
case ExtensionMsgStart:
message_class = ChromeLegacyIpc::CLASS_EXTENSION;
break;
case TextInputClientMsgStart:
message_class = ChromeLegacyIpc::CLASS_TEXT_INPUT_CLIENT;
break;
case BlinkTestMsgStart:
message_class = ChromeLegacyIpc::CLASS_BLINK_TEST;
break;
case AccessibilityMsgStart:
message_class = ChromeLegacyIpc::CLASS_ACCESSIBILITY;
break;
case PrerenderMsgStart:
message_class = ChromeLegacyIpc::CLASS_PRERENDER;
break;
case ChromotingMsgStart:
message_class = ChromeLegacyIpc::CLASS_CHROMOTING;
break;
case AndroidWebViewMsgStart:
message_class = ChromeLegacyIpc::CLASS_ANDROID_WEB_VIEW;
break;
case NaClHostMsgStart:
message_class = ChromeLegacyIpc::CLASS_NACL_HOST;
break;
case EncryptedMediaMsgStart:
message_class = ChromeLegacyIpc::CLASS_ENCRYPTED_MEDIA;
break;
case CastMsgStart:
message_class = ChromeLegacyIpc::CLASS_CAST;
break;
case GinJavaBridgeMsgStart:
message_class = ChromeLegacyIpc::CLASS_GIN_JAVA_BRIDGE;
break;
case ChromeUtilityPrintingMsgStart:
message_class = ChromeLegacyIpc::CLASS_CHROME_UTILITY_PRINTING;
break;
case OzoneGpuMsgStart:
message_class = ChromeLegacyIpc::CLASS_OZONE_GPU;
break;
case WebTestMsgStart:
message_class = ChromeLegacyIpc::CLASS_WEB_TEST;
break;
case ExtensionsGuestViewMsgStart:
message_class = ChromeLegacyIpc::CLASS_EXTENSIONS_GUEST_VIEW;
break;
case GuestViewMsgStart:
message_class = ChromeLegacyIpc::CLASS_GUEST_VIEW;
break;
case MediaPlayerDelegateMsgStart:
message_class = ChromeLegacyIpc::CLASS_MEDIA_PLAYER_DELEGATE;
break;
case ExtensionWorkerMsgStart:
message_class = ChromeLegacyIpc::CLASS_EXTENSION_WORKER;
break;
case UnfreezableFrameMsgStart:
message_class = ChromeLegacyIpc::CLASS_UNFREEZABLE_FRAME;
break;
}
legacy_ipc->set_message_class(message_class);
legacy_ipc->set_message_line(IPC_MESSAGE_ID_LINE(message_id));
}
} // namespace IPC
\ No newline at end of file
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IPC_TRACE_IPC_MESSAGE_H_
#define IPC_TRACE_IPC_MESSAGE_H_
#include <stdint.h>
#include "base/component_export.h"
#include "services/tracing/public/cpp/perfetto/macros.h"
#include "third_party/perfetto/protos/perfetto/trace/track_event/chrome_legacy_ipc.pbzero.h"
// When tracing is enabled, emits a trace event with the given category and
// event name and typed arguments for the message's type (message class and line
// number).
#define TRACE_IPC_MESSAGE_SEND(category, name, msg) \
TRACE_EVENT(category, name, [msg](perfetto::EventContext ctx) { \
IPC::WriteIpcMessageIdAsProtozero(msg->type(), \
ctx.event()->set_chrome_legacy_ipc()); \
});
namespace IPC {
// Converts |message_id| into its message class and line number parts and writes
// them to the protozero message |ChromeLegacyIpc| for trace events.
void COMPONENT_EXPORT(IPC)
WriteIpcMessageIdAsProtozero(uint32_t message_id,
perfetto::protos::pbzero::ChromeLegacyIpc*);
} // namespace IPC
#endif // IPC_TRACE_IPC_MESSAGE_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment