Commit 5bd1d1e4 authored by Alexander Timin's avatar Alexander Timin Committed by Commit Bot

[blink] Add flow events to blink AsyncTask.

Add flow events to blink::AsyncTask to be able to see the connection
between the place requesting task execution and the task execution
itself for tasks like requestAnimationFrame.

This patch also adds TRACE_EVENT_{BEGIN,END}_WITH_FLOW{0,1,2}, which are
needed to implemented trace events for AsyncTask.

This patch also adds a helper GetGlobalUniqueFlowId(), which helps to
generate a unique flow id for tasks like these.

Note that a similar set of events exists in devtools categories, but
it uses different of set events, which are displayed in devtools UI, but
not in chrome://tracing.

R=eseckler@chromium.org,haraken@chromium.org
BUG=1142207

Change-Id: Id87bdb574a52752c4735a2a056d3d0a3d23ec342
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2494877
Commit-Queue: Alexander Timin <altimin@chromium.org>
Reviewed-by: default avatarStephen Nusko <nuskos@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Cr-Commit-Position: refs/heads/master@{#823762}
parent e206bc1a
...@@ -56,9 +56,7 @@ include_rules = [ ...@@ -56,9 +56,7 @@ include_rules = [
"+base/time/time.h", "+base/time/time.h",
"+base/timer/elapsed_timer.h", "+base/timer/elapsed_timer.h",
"+base/timer/timer.h", "+base/timer/timer.h",
"+base/trace_event/memory_dump_manager.h", "+base/trace_event",
"+base/trace_event/memory_dump_provider.h",
"+base/trace_event/trace_event.h",
"+base/util/type_safety/pass_key.h", "+base/util/type_safety/pass_key.h",
"+base/util/type_safety/strong_alias.h", "+base/util/type_safety/strong_alias.h",
"+build", "+build",
......
...@@ -5,6 +5,10 @@ ...@@ -5,6 +5,10 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PROBE_ASYNC_TASK_ID_H_ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PROBE_ASYNC_TASK_ID_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_PROBE_ASYNC_TASK_ID_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_PROBE_ASYNC_TASK_ID_H_
#include <cstdint>
#include "base/optional.h"
#include "base/trace_event/trace_id_helper.h"
#include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/core_export.h"
namespace blink { namespace blink {
...@@ -24,8 +28,13 @@ class CORE_EXPORT AsyncTaskId { ...@@ -24,8 +28,13 @@ class CORE_EXPORT AsyncTaskId {
void SetAdTask() { ad_task_ = true; } void SetAdTask() { ad_task_ = true; }
bool IsAdTask() const { return ad_task_; } bool IsAdTask() const { return ad_task_; }
// Trace id for this task.
base::Optional<uint64_t> GetTraceId() const { return trace_id_; }
void SetTraceId(uint64_t trace_id) { trace_id_ = trace_id; }
private: private:
bool ad_task_ = false; bool ad_task_ = false;
base::Optional<uint64_t> trace_id_;
}; };
} // namespace probe } // namespace probe
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/core/probe/core_probes.h"
#include "base/trace_event/typed_macros.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
#include "third_party/blink/renderer/core/core_probes_inl.h" #include "third_party/blink/renderer/core/core_probes_inl.h"
#include "third_party/blink/renderer/core/inspector/inspector_trace_events.h" #include "third_party/blink/renderer/core/inspector/inspector_trace_events.h"
...@@ -83,9 +84,16 @@ AsyncTask::AsyncTask(ExecutionContext* context, ...@@ -83,9 +84,16 @@ AsyncTask::AsyncTask(ExecutionContext* context,
: nullptr), : nullptr),
task_(task), task_(task),
recurring_(step), recurring_(step),
tracing_(!!task->GetTraceId()),
ad_tracker_(enabled && ad_tracking_type == AdTrackingType::kReport ad_tracker_(enabled && ad_tracking_type == AdTrackingType::kReport
? AdTracker::FromExecutionContext(context) ? AdTracker::FromExecutionContext(context)
: nullptr) { : nullptr) {
if (tracing_) {
TRACE_EVENT_BEGIN("blink", "AsyncTask Run",
[&](perfetto::EventContext ctx) {
ctx.event()->add_flow_ids(task->GetTraceId().value());
});
}
if (recurring_) { if (recurring_) {
TRACE_EVENT_FLOW_STEP0("devtools.timeline.async", "AsyncTask", TRACE_EVENT_FLOW_STEP0("devtools.timeline.async", "AsyncTask",
TRACE_ID_LOCAL(reinterpret_cast<uintptr_t>(task)), TRACE_ID_LOCAL(reinterpret_cast<uintptr_t>(task)),
...@@ -110,6 +118,10 @@ AsyncTask::~AsyncTask() { ...@@ -110,6 +118,10 @@ AsyncTask::~AsyncTask() {
if (ad_tracker_) if (ad_tracker_)
ad_tracker_->DidFinishAsyncTask(task_); ad_tracker_->DidFinishAsyncTask(task_);
if (tracing_) {
TRACE_EVENT_END("blink"); // "AsyncTask Run"
}
} }
void AsyncTaskScheduled(ExecutionContext* context, void AsyncTaskScheduled(ExecutionContext* context,
...@@ -118,6 +130,12 @@ void AsyncTaskScheduled(ExecutionContext* context, ...@@ -118,6 +130,12 @@ void AsyncTaskScheduled(ExecutionContext* context,
TRACE_EVENT_FLOW_BEGIN1("devtools.timeline.async", "AsyncTask", TRACE_EVENT_FLOW_BEGIN1("devtools.timeline.async", "AsyncTask",
TRACE_ID_LOCAL(reinterpret_cast<uintptr_t>(task)), TRACE_ID_LOCAL(reinterpret_cast<uintptr_t>(task)),
"data", inspector_async_task::Data(name)); "data", inspector_async_task::Data(name));
uint64_t trace_id = base::trace_event::GetNextGlobalTraceId();
task->SetTraceId(trace_id);
TRACE_EVENT("blink", "AsyncTask Scheduled", [&](perfetto::EventContext ctx) {
ctx.event()->add_flow_ids(trace_id);
});
if (!context) if (!context)
return; return;
......
...@@ -103,6 +103,7 @@ class CORE_EXPORT AsyncTask { ...@@ -103,6 +103,7 @@ class CORE_EXPORT AsyncTask {
ThreadDebugger* debugger_; ThreadDebugger* debugger_;
AsyncTaskId* task_; AsyncTaskId* task_;
bool recurring_; bool recurring_;
bool tracing_ = false;
// This persistent is safe since the class is STACK_ALLOCATED. // This persistent is safe since the class is STACK_ALLOCATED.
Persistent<AdTracker> ad_tracker_; Persistent<AdTracker> ad_tracker_;
......
...@@ -68,11 +68,7 @@ _CONFIG = [ ...@@ -68,11 +68,7 @@ _CONFIG = [
'base::TimeDelta', 'base::TimeDelta',
'base::TimeTicks', 'base::TimeTicks',
'base::ThreadTicks', 'base::ThreadTicks',
'base::trace_event::MemoryAllocatorDump', 'base::trace_event::.*',
'base::trace_event::MemoryDumpArgs',
'base::trace_event::MemoryDumpManager',
'base::trace_event::MemoryDumpProvider',
'base::trace_event::ProcessMemoryDump',
'base::UnguessableToken', 'base::UnguessableToken',
'base::UnguessableTokenHash', 'base::UnguessableTokenHash',
'base::UnsafeSharedMemoryRegion', 'base::UnsafeSharedMemoryRegion',
...@@ -410,6 +406,7 @@ _CONFIG = [ ...@@ -410,6 +406,7 @@ _CONFIG = [
# Third-party libraries that don't depend on non-Blink Chrome code # Third-party libraries that don't depend on non-Blink Chrome code
# are OK. # are OK.
'icu::.+', 'icu::.+',
'perfetto::.+', # tracing
'testing::.+', # googlemock / googletest 'testing::.+', # googlemock / googletest
'v8::.+', 'v8::.+',
'v8_inspector::.+', 'v8_inspector::.+',
......
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