Commit 1e37b704 authored by Karel Král's avatar Karel Král Committed by Commit Bot

Add support for tracing mojo structs

Add helper to trace mojo autogenerated struct parameters. Thus provide
more information for local debugging.

Bug: 1103623
Change-Id: I4729a92dff39670f1d88136fb0c2f7887b2d334b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2302892
Commit-Queue: Karel Král <karelkral@google.com>
Reviewed-by: default avatarAlexander Timin <altimin@chromium.org>
Reviewed-by: default avatarOksana Zhuravlova <oksamyt@chromium.org>
Cr-Commit-Position: refs/heads/master@{#790289}
parent a5162b22
...@@ -120,7 +120,7 @@ bool {{proxy_name}}::{{method.name}}( ...@@ -120,7 +120,7 @@ bool {{proxy_name}}::{{method.name}}(
{{interface_macros.declare_sync_method_params("param_", method)}}) { {{interface_macros.declare_sync_method_params("param_", method)}}) {
#if BUILDFLAG(MOJO_TRACE_ENABLED) #if BUILDFLAG(MOJO_TRACE_ENABLED)
{%- set qualified_method_name = "%s::%s::%s" % (namespace_as_string, {%- set qualified_method_name = "%s::%s::%s" % (namespace_as_string,
class_name, method_name) %} class_name, method.name) %}
{{interface_macros.trace_event("param_", method.parameters, {{interface_macros.trace_event("param_", method.parameters,
qualified_method_name)}} qualified_method_name)}}
#endif #endif
...@@ -163,7 +163,7 @@ void {{proxy_name}}::{{method.name}}( ...@@ -163,7 +163,7 @@ void {{proxy_name}}::{{method.name}}(
{{interface_macros.declare_request_params("in_", method)}}) { {{interface_macros.declare_request_params("in_", method)}}) {
#if BUILDFLAG(MOJO_TRACE_ENABLED) #if BUILDFLAG(MOJO_TRACE_ENABLED)
{%- set qualified_method_name = "%s::%s::%s" % (namespace_as_string, class_name, {%- set qualified_method_name = "%s::%s::%s" % (namespace_as_string, class_name,
method_name) %} method.name) %}
{{interface_macros.trace_event("in_", method.parameters, {{interface_macros.trace_event("in_", method.parameters,
qualified_method_name)}} qualified_method_name)}}
#endif #endif
......
...@@ -24,8 +24,7 @@ base::OnceCallback<void( ...@@ -24,8 +24,7 @@ base::OnceCallback<void(
{%- endif -%} {%- endif -%}
{%- endmacro -%} {%- endmacro -%}
{%- macro trace_event(prefix, method_parameters, qualified_method_name, {%- macro trace_event(prefix, method_parameters, qualified_method_name) -%}
value="input_params_for_tracing") -%}
{#- This macro assumes that the argument names are the ones declared by -#} {#- This macro assumes that the argument names are the ones declared by -#}
{#- |declare_request_params|. Namely the |prefix| should be the same here as -#} {#- |declare_request_params|. Namely the |prefix| should be the same here as -#}
{#- in |declare_request_params|. -#} {#- in |declare_request_params|. -#}
...@@ -33,15 +32,17 @@ base::OnceCallback<void( ...@@ -33,15 +32,17 @@ base::OnceCallback<void(
TRACE_EVENT1( TRACE_EVENT1(
"mojom", "{{qualified_method_name}}", "input_parameters", "mojom", "{{qualified_method_name}}", "input_parameters",
[&](){ [&](){
auto {{value}} = std::make_unique<base::trace_event::TracedValue>(); auto value = std::make_unique<base::trace_event::TracedValue>();
base::trace_event::TracedValue* raw_value = value.get();
{%- for param in method_parameters %} {%- for param in method_parameters %}
{%- for line in param.kind|write_input_param_for_tracing(prefix, {%- for line in param.kind|write_input_param_for_tracing(
param.name, parameter_name=param.name,
value) %} cpp_parameter_name=prefix+param.name,
value='raw_value') %}
{{line}} {{line}}
{%- endfor -%} {%- endfor -%}
{%- endfor %} {%- endfor %}
return {{value}}; return value;
}()); }());
{%- else -%} {%- else -%}
TRACE_EVENT0("mojom", "{{qualified_method_name}}"); TRACE_EVENT0("mojom", "{{qualified_method_name}}");
......
...@@ -128,6 +128,19 @@ class {{export_attribute}} {{struct.name}} { ...@@ -128,6 +128,19 @@ class {{export_attribute}} {{struct.name}} {
{{type}} {{name}}; {{type}} {{name}};
{%- endfor %} {%- endfor %}
#if BUILDFLAG(MOJO_TRACE_ENABLED)
// Write this structure into |value|. The members are represented as a
// dictionary |member name|: |member value|.
//
// |value| The TracedValue to be written into.
// |parameter_name| Name of the variable holding this structure,
// used as the name of the dictionary representing this structure.
// If nullptr, then the dictionary representing this structure has no name
// (used in arrays of structures).
void ToTracedValue(base::trace_event::TracedValue* value,
const char* parameter_name = nullptr);
#endif // BUILDFLAG(MOJO_TRACE_ENABLED)
private: private:
static bool Validate(const void* data, static bool Validate(const void* data,
mojo::internal::ValidationContext* validation_context); mojo::internal::ValidationContext* validation_context);
......
...@@ -32,6 +32,26 @@ size_t {{struct.name}}::Hash(size_t seed) const { ...@@ -32,6 +32,26 @@ size_t {{struct.name}}::Hash(size_t seed) const {
} }
{%- endif %} {%- endif %}
#if BUILDFLAG(MOJO_TRACE_ENABLED)
void {{struct.name}}::ToTracedValue(base::trace_event::TracedValue* value,
const char* parameter_name) {
if (parameter_name) {
value->BeginDictionary(parameter_name);
} else {
value->BeginDictionary();
}
{%- for field in struct.fields %}
{%- for line in field.kind|write_input_param_for_tracing(
parameter_name=field.name,
cpp_parameter_name='this->'+field.name,
value='value') %}
{{line}}
{%- endfor -%}
{%- endfor %}
value->EndDictionary();
}
#endif // BUILDFLAG(MOJO_TRACE_ENABLED)
bool {{struct.name}}::Validate( bool {{struct.name}}::Validate(
const void* data, const void* data,
mojo::internal::ValidationContext* validation_context) { mojo::internal::ValidationContext* validation_context) {
......
...@@ -670,22 +670,21 @@ class Generator(generator.Generator): ...@@ -670,22 +670,21 @@ class Generator(generator.Generator):
GetCppPodType(constant.kind), constant.name, GetCppPodType(constant.kind), constant.name,
self._ConstantValue(constant)) self._ConstantValue(constant))
def _WriteInputParamForTracing(self, kind, mojo_prefix, parameter_name, def _WriteInputParamForTracing(self, kind, parameter_name, cpp_parameter_name,
value): value):
"""Generates lines of C++ to log parameter |parameter_name| into TracedValue """Generates lines of C++ to log parameter |parameter_name| into TracedValue
|value|. |value|.
Args: Args:
kind: {Kind} The kind of the parameter (corresponds to its C++ type). kind: {Kind} The kind of the parameter (corresponds to its C++ type).
mojo_prefix: {string} The prefix of the auto-generated parameter. parameter_name: {string} The name of the mojom parameter to be logged.
parameter_name: {string} The mojom parameter name to be logged cpp_parameter_name: {string} The actual C++ variable name corresponding to
(auto-generated C++ parameter name is |mojo_prefix+parameter_name|). the mojom parameter |parameter_name|.
value: {string} The C++ TracedValue* variable name to be logged into. value: {string} The C++ TracedValue* variable name to be logged into.
Yields: Yields:
{string} C++ lines of code that trace |parameter_name| into |value|. {string} C++ lines of code that trace |parameter_name| into |value|.
""" """
cpp_parameter_name = mojo_prefix + parameter_name
value_name_cppname = (value, parameter_name, cpp_parameter_name) value_name_cppname = (value, parameter_name, cpp_parameter_name)
# TODO(crbug.com/1103623): Support more involved types. # TODO(crbug.com/1103623): Support more involved types.
if mojom.IsEnumKind(kind): if mojom.IsEnumKind(kind):
...@@ -729,6 +728,15 @@ class Generator(generator.Generator): ...@@ -729,6 +728,15 @@ class Generator(generator.Generator):
if mojom.IsFloatKind(kind) or mojom.IsDoubleKind(kind): if mojom.IsFloatKind(kind) or mojom.IsDoubleKind(kind):
yield '%s->SetDouble("%s", %s);' % value_name_cppname yield '%s->SetDouble("%s", %s);' % value_name_cppname
return return
if (mojom.IsStructKind(kind) and not self._IsTypemappedKind(kind)
and not IsNativeOnlyKind(kind)):
yield 'if (%s.is_null()) {' % cpp_parameter_name
yield ' %s->SetString("%s", "nullptr");' % (value, parameter_name)
yield '} else {'
yield ' %s->ToTracedValue(%s, "%s");' % (cpp_parameter_name, value,
parameter_name)
yield '}'
return
yield '%s->SetString("%s", "<value of type %s>");' % ( yield '%s->SetString("%s", "<value of type %s>");' % (
value, parameter_name, self._GetCppWrapperParamType(kind)) value, parameter_name, self._GetCppWrapperParamType(kind))
......
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