Skip to content

Commit

Permalink
ipc/tracing: Use typed trace events for IPC message sends
Browse files Browse the repository at this point in the history
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: Alex Moshchuk <alexmos@chromium.org>
Reviewed-by: Ken Rockot <rockot@google.com>
Cr-Commit-Position: refs/heads/master@{#730120}
  • Loading branch information
betasheet authored and Commit Bot committed Jan 10, 2020
1 parent 29e499d commit 502a8b4
Show file tree
Hide file tree
Showing 7 changed files with 183 additions and 7 deletions.
5 changes: 2 additions & 3 deletions content/browser/renderer_host/render_process_host_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@
#include "ipc/ipc_channel.h"
#include "ipc/ipc_channel_mojo.h"
#include "ipc/ipc_logging.h"
#include "ipc/trace_ipc_message.h"
#include "media/audio/audio_manager.h"
#include "media/base/media_switches.h"
#include "media/capture/capture_switches.h"
Expand Down Expand Up @@ -3370,9 +3371,7 @@ bool RenderProcessHostImpl::FastShutdownIfPossible(size_t page_count,
}

bool RenderProcessHostImpl::Send(IPC::Message* msg) {
TRACE_EVENT2("renderer_host", "RenderProcessHostImpl::Send", "class",
IPC_MESSAGE_ID_CLASS(msg->type()), "line",
IPC_MESSAGE_ID_LINE(msg->type()));
TRACE_IPC_MESSAGE_SEND("renderer_host", "RenderProcessHostImpl::Send", msg);

std::unique_ptr<IPC::Message> message(msg);

Expand Down
6 changes: 2 additions & 4 deletions gpu/ipc/client/gpu_channel_host.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_restrictions.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "gpu/ipc/common/command_buffer_id.h"
#include "gpu/ipc/common/gpu_messages.h"
#include "gpu/ipc/common/gpu_param_traits_macros.h"
#include "gpu/ipc/common/gpu_watchdog_timeout.h"
#include "ipc/ipc_channel_mojo.h"
#include "ipc/ipc_sync_message.h"
#include "ipc/trace_ipc_message.h"
#include "mojo/public/cpp/bindings/lib/message_quota_checker.h"
#include "url/gurl.h"

Expand Down Expand Up @@ -53,9 +53,7 @@ GpuChannelHost::GpuChannelHost(int channel_id,
}

bool GpuChannelHost::Send(IPC::Message* msg) {
TRACE_EVENT2("ipc", "GpuChannelHost::Send", "class",
IPC_MESSAGE_ID_CLASS(msg->type()), "line",
IPC_MESSAGE_ID_LINE(msg->type()));
TRACE_IPC_MESSAGE_SEND("ipc", "GpuChannelHost::Send", msg);

auto message = base::WrapUnique(msg);

Expand Down
8 changes: 8 additions & 0 deletions ipc/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,14 @@ component("ipc") {
if (enable_ipc_fuzzer) {
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") {
Expand Down
2 changes: 2 additions & 0 deletions ipc/DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ include_rules = [
# For ipc_channel_nacl.cc:
"+native_client/src/public",
"+sandbox/mac/seatbelt.h",
"+services/tracing/public/cpp",
"+third_party/perfetto/protos/perfetto/trace/track_event",
]

specific_include_rules = {
Expand Down
7 changes: 7 additions & 0 deletions ipc/ipc_sync_channel.cc
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,17 @@
#include "base/threading/thread_local.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "ipc/ipc_channel_factory.h"
#include "ipc/ipc_logging.h"
#include "ipc/ipc_message_macros.h"
#include "ipc/ipc_sync_message.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;

namespace IPC {
Expand Down Expand Up @@ -609,6 +614,8 @@ bool SyncChannel::Send(Message* message) {
Logging::GetInstance()->GetMessageText(
message->type(), &name, message, nullptr);
TRACE_EVENT1("ipc", "SyncChannel::Send", "name", name);
#elif !defined(OS_NACL)
TRACE_IPC_MESSAGE_SEND("ipc", "SyncChannel::Send", message);
#else
TRACE_EVENT2("ipc", "SyncChannel::Send",
"class", IPC_MESSAGE_ID_CLASS(message->type()),
Expand Down
129 changes: 129 additions & 0 deletions ipc/trace_ipc_message.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
// 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
33 changes: 33 additions & 0 deletions ipc/trace_ipc_message.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// 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_

0 comments on commit 502a8b4

Please sign in to comment.