Commit 7a9cb369 authored by Chris Hamilton's avatar Chris Hamilton Committed by Commit Bot

Add IPC program counter decoration to all IPC handlers.

This integrates the recently added TaskAnnotator IPC message
decoration into Mojo and legacy IPC handlers. This causes all
PendingTask objects to be decorated with a program counter that
uniquely identifies the IPC message that was being handled when
that task was posted.

This work is discussed in the following design doc:

https://docs.google.com/document/d/1soCnDaQUug_Q4oadX1YxynjzookCh9Aj1fL-HOCwnEY/edit?pli=1#

The net binary size impact is O(50kB) across platforms, which after
much discussion was deemed a reasonable trade off.

BUG=950668

Change-Id: Ibf36cf177b09f8ed8919fd19caebce137249c4c6
Binary-Size: Increase due to new instrumentation.
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1586318
Commit-Queue: Chris Hamilton <chrisha@chromium.org>
Reviewed-by: default avatarKen Rockot <rockot@google.com>
Cr-Commit-Position: refs/heads/master@{#654837}
parent e0099330
......@@ -199,6 +199,8 @@
#include <tuple>
#include "base/export_template.h"
#include "base/location.h"
#include "base/task/common/task_annotator.h"
#include "ipc/ipc_message_templates.h"
#include "ipc/ipc_message_utils.h"
#include "ipc/param_traits_macros.h"
......@@ -323,6 +325,12 @@
// return handled;
// }
// A macro to be used from within the IPC_MESSAGE_FORWARD macros, for providing
// the IPC message context to the TaskAnnotator. This allows posted tasks to be
// associated with the incoming IPC message that caused them to be posted.
#define IPC_TASK_ANNOTATOR_CONTEXT(msg_class) \
base::TaskAnnotator::ScopedSetIpcProgramCounter scoped_ipc_pc( \
base::GetProgramCounter());
#define IPC_BEGIN_MESSAGE_MAP(class_name, msg) \
{ \
......@@ -338,48 +346,46 @@
decltype(param) param__ = param; \
const IPC::Message& ipc_message__ = msg; \
switch (ipc_message__.type()) {
#define IPC_MESSAGE_FORWARD(msg_class, obj, member_func) \
case msg_class::ID: { \
if (!msg_class::Dispatch(&ipc_message__, obj, this, param__, \
&member_func)) \
ipc_message__.set_dispatch_error(); \
} \
break;
#define IPC_MESSAGE_FORWARD(msg_class, obj, member_func) \
case msg_class::ID: { \
IPC_TASK_ANNOTATOR_CONTEXT(msg_class) \
if (!msg_class::Dispatch(&ipc_message__, obj, this, param__, \
&member_func)) \
ipc_message__.set_dispatch_error(); \
} break;
#define IPC_MESSAGE_HANDLER(msg_class, member_func) \
IPC_MESSAGE_FORWARD(msg_class, this, _IpcMessageHandlerClass::member_func)
#define IPC_MESSAGE_FORWARD_DELAY_REPLY(msg_class, obj, member_func) \
case msg_class::ID: { \
if (!msg_class::DispatchDelayReply(&ipc_message__, obj, param__, \
&member_func)) \
ipc_message__.set_dispatch_error(); \
} \
break;
#define IPC_MESSAGE_FORWARD_DELAY_REPLY(msg_class, obj, member_func) \
case msg_class::ID: { \
IPC_TASK_ANNOTATOR_CONTEXT(msg_class) \
if (!msg_class::DispatchDelayReply(&ipc_message__, obj, param__, \
&member_func)) \
ipc_message__.set_dispatch_error(); \
} break;
#define IPC_MESSAGE_HANDLER_DELAY_REPLY(msg_class, member_func) \
IPC_MESSAGE_FORWARD_DELAY_REPLY(msg_class, this, \
_IpcMessageHandlerClass::member_func)
#define IPC_MESSAGE_FORWARD_WITH_PARAM_DELAY_REPLY(msg_class, obj, \
member_func) \
case msg_class::ID: { \
if (!msg_class::DispatchWithParamDelayReply(&ipc_message__, obj, param__, \
&member_func)) \
ipc_message__.set_dispatch_error(); \
} \
break;
#define IPC_MESSAGE_FORWARD_WITH_PARAM_DELAY_REPLY(msg_class, obj, \
member_func) \
case msg_class::ID: { \
IPC_TASK_ANNOTATOR_CONTEXT(msg_class) \
if (!msg_class::DispatchWithParamDelayReply(&ipc_message__, obj, \
param__, \ & member_func)) \
ipc_message__.set_dispatch_error(); \
} break;
#define IPC_MESSAGE_HANDLER_WITH_PARAM_DELAY_REPLY(msg_class, member_func) \
IPC_MESSAGE_FORWARD_WITH_PARAM_DELAY_REPLY( \
msg_class, this, _IpcMessageHandlerClass::member_func)
#define IPC_MESSAGE_HANDLER_GENERIC(msg_class, code) \
case msg_class::ID: { \
code; \
} \
break;
#define IPC_MESSAGE_HANDLER_GENERIC(msg_class, code) \
case msg_class::ID: { \
IPC_TASK_ANNOTATOR_CONTEXT(msg_class) { code; } \
} break;
#define IPC_REPLY_HANDLER(func) \
case IPC_REPLY_ID: { \
......
......@@ -400,11 +400,15 @@ bool {{class_name}}StubDispatch::Accept(
switch (message->header()->name) {
{%- for method in interface.methods %}
case internal::k{{class_name}}_{{method.name}}_Name: {
{%- if method.response_parameters == None %}
#if BUILDFLAG(MOJO_TRACE_ENABLED)
TRACE_EVENT1("mojom", "(Impl){{namespace_as_string}}::{{class_name}}::{{method.name}}",
"message", message->name());
TRACE_EVENT1(
"mojom",
"(Impl){{namespace_as_string}}::{{class_name}}::{{method.name}}",
"message", message->name());
#endif
{%- if method.response_parameters == None %}
base::TaskAnnotator::ScopedSetIpcProgramCounter scoped_ipc_pc(
base::GetProgramCounter());
mojo::internal::MessageDispatchContext context(message);
{%- if method|method_supports_lazy_serialization %}
if (!message->is_serialized()) {
......@@ -453,11 +457,15 @@ bool {{class_name}}StubDispatch::AcceptWithResponder(
switch (message->header()->name) {
{%- for method in interface.methods %}
case internal::k{{class_name}}_{{method.name}}_Name: {
{%- if method.response_parameters != None %}
#if BUILDFLAG(MOJO_TRACE_ENABLED)
TRACE_EVENT1("mojom", "(Impl){{namespace_as_string}}::{{class_name}}::{{method.name}}",
"message", message->name());
TRACE_EVENT1(
"mojom",
"(Impl){{namespace_as_string}}::{{class_name}}::{{method.name}}",
"message", message->name());
#endif
{%- if method.response_parameters != None %}
base::TaskAnnotator::ScopedSetIpcProgramCounter scoped_ipc_pc(
base::GetProgramCounter());
mojo::internal::MessageDispatchContext context(message);
{%- if method|method_supports_lazy_serialization %}
if (!message->is_serialized()) {
......
......@@ -28,8 +28,10 @@
#include <stdint.h>
#include <utility>
#include "base/location.h"
#include "base/logging.h"
#include "base/run_loop.h"
#include "base/task/common/task_annotator.h"
#include "mojo/public/cpp/bindings/lib/message_internal.h"
#include "mojo/public/cpp/bindings/lib/serialization_util.h"
#include "mojo/public/cpp/bindings/lib/unserialized_message_context.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