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: Alex Moshchuk <alexmos@chromium.org> Reviewed-by: Ken Rockot <rockot@google.com> Cr-Commit-Position: refs/heads/master@{#730120}
This commit is contained in:
content/browser/renderer_host
gpu/ipc/client
ipc
@ -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"
|
||||
@ -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);
|
||||
|
||||
|
@ -13,7 +13,6 @@
|
||||
#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"
|
||||
@ -21,6 +20,7 @@
|
||||
#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"
|
||||
|
||||
@ -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);
|
||||
|
||||
|
@ -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") {
|
||||
|
2
ipc/DEPS
2
ipc/DEPS
@ -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 = {
|
||||
|
@ -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 {
|
||||
@ -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()),
|
||||
|
129
ipc/trace_ipc_message.cc
Normal file
129
ipc/trace_ipc_message.cc
Normal file
@ -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
ipc/trace_ipc_message.h
Normal file
33
ipc/trace_ipc_message.h
Normal file
@ -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_
|
Reference in New Issue
Block a user