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 = [
"+base/time/time.h",
"+base/timer/elapsed_timer.h",
"+base/timer/timer.h",
"+base/trace_event/memory_dump_manager.h",
"+base/trace_event/memory_dump_provider.h",
"+base/trace_event/trace_event.h",
"+base/trace_event",
"+base/util/type_safety/pass_key.h",
"+base/util/type_safety/strong_alias.h",
"+build",
......
......@@ -5,6 +5,10 @@
#ifndef 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"
namespace blink {
......@@ -24,8 +28,13 @@ class CORE_EXPORT AsyncTaskId {
void SetAdTask() { ad_task_ = true; }
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:
bool ad_task_ = false;
base::Optional<uint64_t> trace_id_;
};
} // namespace probe
......
......@@ -30,6 +30,7 @@
#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/core/core_probes_inl.h"
#include "third_party/blink/renderer/core/inspector/inspector_trace_events.h"
......@@ -83,9 +84,16 @@ AsyncTask::AsyncTask(ExecutionContext* context,
: nullptr),
task_(task),
recurring_(step),
tracing_(!!task->GetTraceId()),
ad_tracker_(enabled && ad_tracking_type == AdTrackingType::kReport
? AdTracker::FromExecutionContext(context)
: nullptr) {
if (tracing_) {
TRACE_EVENT_BEGIN("blink", "AsyncTask Run",
[&](perfetto::EventContext ctx) {
ctx.event()->add_flow_ids(task->GetTraceId().value());
});
}
if (recurring_) {
TRACE_EVENT_FLOW_STEP0("devtools.timeline.async", "AsyncTask",
TRACE_ID_LOCAL(reinterpret_cast<uintptr_t>(task)),
......@@ -110,6 +118,10 @@ AsyncTask::~AsyncTask() {
if (ad_tracker_)
ad_tracker_->DidFinishAsyncTask(task_);
if (tracing_) {
TRACE_EVENT_END("blink"); // "AsyncTask Run"
}
}
void AsyncTaskScheduled(ExecutionContext* context,
......@@ -118,6 +130,12 @@ void AsyncTaskScheduled(ExecutionContext* context,
TRACE_EVENT_FLOW_BEGIN1("devtools.timeline.async", "AsyncTask",
TRACE_ID_LOCAL(reinterpret_cast<uintptr_t>(task)),
"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)
return;
......
......@@ -103,6 +103,7 @@ class CORE_EXPORT AsyncTask {
ThreadDebugger* debugger_;
AsyncTaskId* task_;
bool recurring_;
bool tracing_ = false;
// This persistent is safe since the class is STACK_ALLOCATED.
Persistent<AdTracker> ad_tracker_;
......
......@@ -68,11 +68,7 @@ _CONFIG = [
'base::TimeDelta',
'base::TimeTicks',
'base::ThreadTicks',
'base::trace_event::MemoryAllocatorDump',
'base::trace_event::MemoryDumpArgs',
'base::trace_event::MemoryDumpManager',
'base::trace_event::MemoryDumpProvider',
'base::trace_event::ProcessMemoryDump',
'base::trace_event::.*',
'base::UnguessableToken',
'base::UnguessableTokenHash',
'base::UnsafeSharedMemoryRegion',
......@@ -410,6 +406,7 @@ _CONFIG = [
# Third-party libraries that don't depend on non-Blink Chrome code
# are OK.
'icu::.+',
'perfetto::.+', # tracing
'testing::.+', # googlemock / googletest
'v8::.+',
'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