| // Copyright 2017 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. |
| |
| {% from 'macros.tmpl' import source_files_for_generated_file %} |
| {{source_files_for_generated_file(template_file, input_files)}} |
| |
| {% set sink_class = (name | to_singular) + "Sink" %} |
| {% set sink_class_header = (header | to_singular) + "_sink" %} |
| {% for file in files %} |
| #include "{{output_path_in_gen_dir}}{{file.name}}_inl.h" |
| {% endfor %} |
| #include "{{output_path_in_gen_dir}}{{sink_class_header}}.h" |
| {% for agent in agents %} |
| #include "{{agent | agent_name_to_include}}" |
| {% endfor %} |
| #include "third_party/blink/renderer/platform/wtf/threading_primitives.h" |
| |
| namespace blink { |
| |
| namespace { |
| |
| Mutex& AgentCountMutex() { |
| DEFINE_THREAD_SAFE_STATIC_LOCAL(Mutex, mutex, ()); |
| return mutex; |
| } |
| |
| } // namespace |
| |
| // static |
| std::atomic<unsigned> {{sink_class}}::s_existingAgents; |
| |
| {{sink_class}}::{{sink_class}}() {} |
| |
| {{sink_class}}::~{{sink_class}}() { |
| MutexLocker lock(AgentCountMutex()); |
| {% for agent in agents %} |
| if (Has{{agent}}s() && --s_numSinksWith{{agent}} == 0) |
| s_existingAgents &= ~k{{agent}}; |
| {% endfor %} |
| } |
| |
| {% for agent in agents %} |
| {% set class_name = agent | agent_name_to_class %} |
| {% set getter_name = agent | to_snake_case %} |
| |
| // static |
| unsigned {{sink_class}}::s_numSinksWith{{agent}} = 0; |
| |
| void {{sink_class}}::Add{{agent}}({{class_name}}* agent) { |
| bool already_had_agent = Has{{agent}}s(); |
| {{getter_name}}s_.insert(agent); |
| |
| if (!already_had_agent) { |
| MutexLocker lock(AgentCountMutex()); |
| if (++s_numSinksWith{{agent}} == 1) |
| s_existingAgents |= k{{agent}}; |
| } |
| |
| DCHECK(HasAgentsGlobal(k{{agent}})); |
| } |
| |
| void {{sink_class}}::Remove{{agent}}({{class_name}}* agent) { |
| if (!Has{{agent}}s()) |
| return; |
| |
| {{getter_name}}s_.erase(agent); |
| |
| if (!Has{{agent}}s()) { |
| MutexLocker lock(AgentCountMutex()); |
| if (--s_numSinksWith{{agent}} == 0) |
| s_existingAgents &= ~k{{agent}}; |
| } |
| |
| if (Has{{agent}}s()) |
| DCHECK(HasAgentsGlobal(k{{agent}})); |
| } |
| |
| {% endfor -%} |
| |
| void {{sink_class}}::Trace(Visitor* visitor) const |
| { |
| {% for agent in agents %} |
| {% set getter_name = agent | to_snake_case %} |
| visitor->Trace({{getter_name}}s_); |
| {% endfor %} |
| } |
| |
| namespace probe { |
| {% macro params_list(probe) -%} |
| {%- for param in probe.params %} |
| {{param.type}} {{param.name}} |
| {%- if not loop.last %}, {% endif -%} |
| {%- endfor -%} |
| {%- endmacro %} |
| |
| {% macro probe_body(probe, common_name) %} |
| {% set agent_probe_name = method_name(common_name or probe.name) %} |
| if (!probe_sink) |
| return; |
| {% for agent in probe.agents %} |
| {% set class_name = agent | agent_name_to_class %} |
| if (probe_sink->Has{{agent}}s()) { |
| for ({{class_name}}* agent : probe_sink->{{class_name}}s()) |
| agent->{{agent_probe_name}}({{caller()}}); |
| } |
| {% endfor %} |
| {% endmacro -%} |
| |
| {% for file in files %} |
| {% for probe in file.declarations %} |
| {% if probe.is_scoped %} |
| {{probe.name}}::{{probe.name}}({{ params_list(probe) }}) : |
| {% for param in probe.params %} |
| {{param.name}}({{param.name}}) |
| {%- if not loop.last %}, |
| {% endif %} |
| {% endfor %} { |
| probe_sink = To{{sink_class}}({{probe.params[0].name}}); |
| {% call probe_body(probe, "Will") %}*this{% endcall %} |
| } |
| |
| {{probe.name}}::~{{probe.name}}() { |
| {% call probe_body(probe, "Did") %}*this{% endcall %} |
| } |
| |
| {% else -%} |
| |
| void {{probe.name}}Impl({{ params_list(probe) }}) { |
| {{sink_class}}* probe_sink = To{{sink_class}}({{probe.params[0].name}}); |
| {% call probe_body(probe, "") %} |
| {%- for param in probe.params %} |
| {%- if not loop.first or "Keep" in param.options -%} |
| {{param.name}} |
| {%- if not loop.last %}, {% endif -%} |
| {%- endif -%} |
| {%- endfor %} |
| {%- endcall %} |
| } |
| |
| {% endif %} |
| {% endfor %} |
| {% endfor %} |
| |
| } // namespace probe |
| } // namespace blink |