Skip to content

Commit 18a87b4

Browse files
committed
update: migrate tracing demos to M120
1 parent 7ac9056 commit 18a87b4

File tree

6 files changed

+155
-94
lines changed

6 files changed

+155
-94
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,5 +73,5 @@ cscope.po.out
7373
# Ignore Mac Files
7474
.DS_Store
7575

76-
.json
76+
/*.json
7777

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ Demo list:
3636
1. [M110] `demo_ipc`: Demonstrate the use of IPC interface based on `mojo`;
3737
1. [M91] `demo_mojo_v8`: Demonstrate the use of js to access the mojo interface;
3838
1. [M110] `demo_memory`: Demonstrate the use of SharedMemory;
39-
1. [M110] `demo_tracing_perfetto`: Demonstrate the output of Trace as Json format (used to interface with perfetto);
40-
1. [M110] `demo_tracing_perfetto_content`: Demonstrate how the content module is connected to perfetto;
39+
1. [M120] `demo_tracing_perfetto`: Demonstrate the output of Trace as Json format (used to interface with perfetto);
40+
1. [M120] `demo_tracing_perfetto_content`: Demonstrate how the content module is connected to perfetto;
4141
1. [M110] `demo_resources`: Demo resources related content, including grit, l10n, pak, etc.;
4242
1. [M110] `demo_gl`: Demonstrate using `//ui/gl` for GPU rendering;
4343
1. [M110] `demo_viz_gui`: Demonstrate using `viz` to display the GUI interface;
@@ -108,7 +108,7 @@ Public documents are in the [docs](./docs) directory, and other documents are in
108108
109109
### 2023.12.23
110110
111-
- Migrate the flowing demo to chromium M120: demo_exe,demo_log,demo_tracing_console,demo_task_thread_pool,demo_task_executor,demo_callback_*,demo_linktest.
111+
- Migrate the flowing demo to chromium M120: demo_exe,demo_log,demo_tracing_console,demo_task_thread_pool,demo_task_executor,demo_callback_*,demo_linktest,demo_tracing_perfetto,demo_tracing_perfetto_content.
112112
113113
### 2023.8.24
114114

README_zh.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ Demo 列表:
2929
1. [M110] `demo_ipc`: 演示使用基于 `mojo` 的 IPC 接口;
3030
1. [M91] `demo_mojo_v8`: 演示使用 js 访问 mojo 接口;
3131
1. [M110] `demo_memory`: 演示使用 SharedMemory;
32-
1. [M110] `demo_tracing_perfetto`: 演示将 Trace 输出为 Json 格式(用来对接 perfetto);
33-
1. [M110] `demo_tracing_perfetto_content`: 演示 content 模块是如何对接 perfetto 的;
32+
1. [M120] `demo_tracing_perfetto`: 演示将 Trace 输出为 Json 格式(用来对接 perfetto);
33+
1. [M120] `demo_tracing_perfetto_content`: 演示 content 模块是如何对接 perfetto 的;
3434
1. [M110] `demo_resources`: 演示 resources 相关内容,包括 grit,l10n,pak 等;
3535
1. [M110] `demo_gl`: 演示使用 `//ui/gl` 进行 GPU 渲染;
3636
1. [M110] `demo_viz_gui`: 演示使用 `viz` 显示 GUI 界面;
@@ -100,7 +100,7 @@ Demo 列表:
100100
101101
### 2023.12.23
102102
103-
- 升级以下 demo 到 chromium 120: demo_exe,demo_log,demo_tracing_console,demo_task_thread_pool,demo_task_executor,demo_callback_*,demo_linktest。
103+
- 升级以下 demo 到 chromium 120: demo_exe,demo_log,demo_tracing_console,demo_task_thread_pool,demo_task_executor,demo_callback_*,demo_linktest,demo_tracing_perfetto,demo_tracing_perfetto_content
104104
105105
### 2023.8.24
106106

demo_tracing/demo_tracing_console.cc

Lines changed: 136 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
#include "base/at_exit.h"
22
#include "base/command_line.h"
3-
#include "base/debug/stack_trace.h"
43
#include "base/logging.h"
54
#include "base/memory/ref_counted_memory.h"
65
#include "base/memory/scoped_refptr.h"
7-
#include "base/task/single_thread_task_executor.h"
86
#include "base/run_loop.h"
9-
#include "base/trace_event/common/trace_event_common.h"
7+
#include "base/task/single_thread_task_executor.h"
108
#include "base/trace_event/trace_event.h"
119
#include "base/trace_event/trace_log.h"
1210

1311
void TraceMe() {
14-
TRACE_EVENT0("test", "TraceMe");
15-
TRACE_EVENT1("test", "TraceMe", "value", 1);
16-
TRACE_EVENT2("test", "TraceMe", "value", 1, "value2", 2);
12+
TRACE_EVENT0("test", "TraceMe1");
13+
TRACE_EVENT1("test", "TraceMe2", "value", 1);
14+
TRACE_EVENT2("test", "TraceMe3", "value", 1, "value2", 2);
1715
}
1816

1917
void TraceCount(int times) {
@@ -27,9 +25,12 @@ int main(int argc, char** argv) {
2725
// 1. 创建配置文件对象;
2826
base::trace_event::TraceConfig trace_config;
2927
// 手动创建TraceConfig
30-
trace_config =
31-
base::trace_event::TraceConfig("test,testxxx", "trace-to-console");
32-
28+
// M120 在 Linux/Android 已经默认启用 perfetto client,这种模式下
29+
// trace-to-console 和运行时捕获 trace 不兼容,所以这里改为
30+
// record-as-much-as-possible.
31+
trace_config = base::trace_event::TraceConfig("test,testxxx",
32+
"record-as-much-as-possible");
33+
3334
// 也可以使用component模块的方法来获取TraceConfig
3435
// 方法1 获取用于输出到控制台的TraceConfig
3536
// trace_config = tracing::GetConfigForTraceToConsole();
@@ -50,48 +51,133 @@ int main(int argc, char** argv) {
5051
TRACE_EVENT0("testxxx,", "main");
5152
//==============================================================
5253
// 以上宏展开后等价于下面的代码
53-
static_assert(
54-
base::trace_event::BuiltinCategories::IsAllowedCategory("testxxx,"),
55-
"Unknown tracing category is used. Please register your "
56-
"category in base/trace_event/builtin_categories.h");
57-
constexpr const unsigned char* trace_event_unique_k_category_group_enabled31 =
58-
base::trace_event::TraceLog::GetBuiltinCategoryEnabled("testxxx,");
59-
const unsigned char* trace_event_unique_category_group_enabled31;
60-
if (trace_event_unique_k_category_group_enabled31) {
61-
trace_event_unique_category_group_enabled31 =
62-
trace_event_unique_k_category_group_enabled31;
63-
} else {
64-
static base::subtle::AtomicWord trace_event_unique_atomic31 = 0;
65-
trace_event_unique_category_group_enabled31 =
66-
reinterpret_cast<const unsigned char*>(
67-
base::subtle::NoBarrier_Load(&(trace_event_unique_atomic31)));
68-
// __builtin_expect 用于编译优化
69-
if (__builtin_expect(!!(!trace_event_unique_category_group_enabled31), 0)) {
70-
trace_event_unique_category_group_enabled31 =
71-
base::trace_event::TraceLog::GetCategoryGroupEnabled("testxxx,");
72-
base::subtle::NoBarrier_Store(
73-
&(trace_event_unique_atomic31),
74-
(reinterpret_cast<base::subtle::AtomicWord>(
75-
trace_event_unique_category_group_enabled31)));
54+
{
55+
#if !BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
56+
// 旧版本不使用 perfetto client
57+
static_assert(
58+
base::trace_event::BuiltinCategories::IsAllowedCategory("testxxx,"),
59+
"Unknown tracing category is used. Please register your "
60+
"category in base/trace_event/builtin_categories.h");
61+
constexpr const unsigned char*
62+
trace_event_unique_k_category_group_enabled50 =
63+
base::trace_event::TraceLog::GetBuiltinCategoryEnabled("testxxx,");
64+
const unsigned char* trace_event_unique_category_group_enabled50;
65+
if (trace_event_unique_k_category_group_enabled50) {
66+
trace_event_unique_category_group_enabled50 =
67+
trace_event_unique_k_category_group_enabled50;
68+
} else {
69+
static base::subtle::AtomicWord trace_event_unique_atomic50 = 0;
70+
trace_event_unique_category_group_enabled50 =
71+
reinterpret_cast<const unsigned char*>(
72+
base::subtle::Acquire_Load(&(trace_event_unique_atomic50)));
73+
if (__builtin_expect(!!(!trace_event_unique_category_group_enabled50),
74+
0)) {
75+
trace_event_unique_category_group_enabled50 =
76+
base::trace_event::TraceLog::GetCategoryGroupEnabled("testxxx,");
77+
base::subtle::Release_Store(
78+
&(trace_event_unique_atomic50),
79+
(reinterpret_cast<base::subtle::AtomicWord>(
80+
trace_event_unique_category_group_enabled50)));
81+
};
7682
};
77-
};
78-
;
79-
trace_event_internal::ScopedTracer trace_event_unique_tracer31;
80-
if (__builtin_expect(
81-
!!(*trace_event_unique_category_group_enabled31 &
82-
(base::trace_event::TraceCategory::ENABLED_FOR_RECORDING |
83-
base::trace_event::TraceCategory::ENABLED_FOR_ETW_EXPORT |
84-
base::trace_event::TraceCategory::ENABLED_FOR_FILTERING)),
85-
0)) {
86-
// 在这里输出trace日志
87-
base::trace_event::TraceEventHandle h = trace_event_internal::AddTraceEvent(
88-
('X'), trace_event_unique_category_group_enabled31, "main",
89-
trace_event_internal::kGlobalScope, trace_event_internal::kNoId,
90-
(static_cast<unsigned int>(0)), trace_event_internal::kNoId);
91-
trace_event_unique_tracer31.Initialize(
92-
trace_event_unique_category_group_enabled31, "main", h);
93-
};
94-
//==============================================================
83+
;
84+
trace_event_internal::ScopedTracer trace_event_unique_tracer50;
85+
if (__builtin_expect(
86+
!!(*trace_event_unique_category_group_enabled50 &
87+
(base::trace_event::TraceCategory::ENABLED_FOR_RECORDING |
88+
base::trace_event::TraceCategory::ENABLED_FOR_ETW_EXPORT |
89+
base::trace_event::TraceCategory::ENABLED_FOR_FILTERING)),
90+
0)) {
91+
base::trace_event::TraceEventHandle trace_event_unique_h50 =
92+
trace_event_internal::AddTraceEvent(
93+
('X'), trace_event_unique_category_group_enabled50, "main",
94+
trace_event_internal::kGlobalScope, trace_event_internal::kNoId,
95+
(static_cast<unsigned int>(0)), trace_event_internal::kNoId);
96+
trace_event_unique_tracer50.Initialize(
97+
trace_event_unique_category_group_enabled50, "main",
98+
trace_event_unique_h50);
99+
};
100+
#else // BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
101+
// 新版本使用 perfetto client
102+
struct ScopedEvent50 {
103+
struct EventFinalizer {
104+
EventFinalizer(...) {}
105+
~EventFinalizer() {
106+
do {
107+
::perfetto::internal::ValidateEventNameType<decltype(nullptr)>();
108+
namespace tns = perfetto_track_event;
109+
constexpr auto
110+
kCatIndex_ADD_TO_PERFETTO_DEFINE_CATEGORIES_IF_FAILS_50 =
111+
perfetto_track_event::internal::kConstExprCategoryRegistry
112+
.Find(
113+
"testxxx,",
114+
::perfetto_track_event::internal::IsDynamicCategory(
115+
"testxxx,"));
116+
if (::perfetto_track_event::internal ::IsDynamicCategory(
117+
"testxxx,")) {
118+
tns::TrackEvent::CallIfEnabled([&](
119+
uint32_t
120+
instances) __attribute__((no_thread_safety_analysis)) {
121+
tns::TrackEvent::TraceForCategory(
122+
instances, "testxxx,", nullptr,
123+
::perfetto::protos::pbzero::TrackEvent::TYPE_SLICE_END);
124+
});
125+
} else {
126+
tns::TrackEvent::CallIfCategoryEnabled(
127+
kCatIndex_ADD_TO_PERFETTO_DEFINE_CATEGORIES_IF_FAILS_50,
128+
[&](uint32_t instances) __attribute__((
129+
no_thread_safety_analysis)) {
130+
tns::TrackEvent::TraceForCategory(
131+
instances,
132+
kCatIndex_ADD_TO_PERFETTO_DEFINE_CATEGORIES_IF_FAILS_50,
133+
nullptr,
134+
::perfetto::protos::pbzero::TrackEvent::TYPE_SLICE_END);
135+
});
136+
}
137+
} while (false);
138+
}
139+
EventFinalizer(const EventFinalizer&) = delete;
140+
inline EventFinalizer& operator=(const EventFinalizer&) = delete;
141+
EventFinalizer(EventFinalizer&&) = delete;
142+
EventFinalizer& operator=(EventFinalizer&&) = delete;
143+
} finalizer;
144+
} scoped_event50{[&]() {
145+
do {
146+
::perfetto::internal::ValidateEventNameType<
147+
decltype(::perfetto::internal::DecayEventNameType(
148+
::perfetto::internal::DecayEventNameType("main")))>();
149+
namespace tns = perfetto_track_event;
150+
constexpr auto kCatIndex_ADD_TO_PERFETTO_DEFINE_CATEGORIES_IF_FAILS_50 =
151+
perfetto_track_event::internal::kConstExprCategoryRegistry.Find(
152+
"testxxx,", ::perfetto_track_event::internal::IsDynamicCategory(
153+
"testxxx,"));
154+
if (::perfetto_track_event::internal::IsDynamicCategory("testxxx,")) {
155+
tns::TrackEvent::CallIfEnabled([&](
156+
uint32_t instances) __attribute__((no_thread_safety_analysis)) {
157+
tns::TrackEvent::TraceForCategory(
158+
instances, "testxxx,",
159+
::perfetto::internal::DecayEventNameType(
160+
::perfetto::internal::DecayEventNameType("main")),
161+
::perfetto::protos::pbzero::TrackEvent::TYPE_SLICE_BEGIN);
162+
});
163+
} else {
164+
tns::TrackEvent::CallIfCategoryEnabled(
165+
kCatIndex_ADD_TO_PERFETTO_DEFINE_CATEGORIES_IF_FAILS_50,
166+
[&](uint32_t instances) __attribute__((
167+
no_thread_safety_analysis)) {
168+
tns::TrackEvent::TraceForCategory(
169+
instances,
170+
kCatIndex_ADD_TO_PERFETTO_DEFINE_CATEGORIES_IF_FAILS_50,
171+
::perfetto::internal::DecayEventNameType(
172+
::perfetto::internal::DecayEventNameType("main")),
173+
::perfetto::protos::pbzero::TrackEvent::TYPE_SLICE_BEGIN);
174+
});
175+
}
176+
} while (false);
177+
return 0;
178+
}()};
179+
#endif // BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
180+
} //==============================================================
95181

96182
TraceMe();
97183
int i = 0;

demo_tracing/demo_tracing_perfetto.cc

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,19 @@
1+
#include <memory>
2+
13
#include "base/at_exit.h"
2-
#include "base/callback_forward.h"
34
#include "base/command_line.h"
4-
#include "base/debug/stack_trace.h"
55
#include "base/feature_list.h"
66
#include "base/logging.h"
7-
#include "base/memory/ref_counted.h"
7+
#include "base/run_loop.h"
88
#include "base/task/single_thread_task_executor.h"
9-
#include "base/process/process.h"
10-
#include "base/task/task_traits.h"
119
#include "base/task/thread_pool/thread_pool_instance.h"
12-
#include "base/test/task_environment.h"
13-
#include "base/test/test_timeouts.h"
1410
#include "base/threading/thread.h"
15-
#include "base/timer/timer.h"
16-
#include "base/threading/platform_thread.h"
17-
#include "base/trace_event/common/trace_event_common.h"
18-
#include "base/trace_event/trace_event.h"
1911
#include "components/tracing/common/trace_startup_config.h"
20-
#include "components/tracing/common/trace_to_console.h"
21-
#include "components/tracing/common/tracing_switches.h"
2212
#include "mojo/core/embedder/embedder.h"
2313
#include "mojo/core/embedder/scoped_ipc_support.h"
2414
#include "mojo/public/cpp/bindings/receiver.h"
2515
#include "mojo/public/cpp/bindings/remote.h"
2616
#include "mojo/public/cpp/system/data_pipe_drainer.h"
27-
#include "services/tracing/perfetto/consumer_host.h"
2817
#include "services/tracing/public/cpp/perfetto/perfetto_config.h"
2918
#include "services/tracing/public/cpp/trace_startup.h"
3019
#include "services/tracing/public/cpp/traced_process.h"
@@ -43,7 +32,7 @@ class TracingController : public mojo::DataPipeDrainer::Client,
4332
return &controller;
4433
}
4534

46-
TracingController() {}
35+
TracingController() = default;
4736

4837
bool StartTracing(base::trace_event::TraceConfig trace_config,
4938
base::OnceClosure start_callback) {
@@ -91,7 +80,8 @@ class TracingController : public mojo::DataPipeDrainer::Client,
9180
return true;
9281
}
9382

94-
drainer_.reset(new mojo::DataPipeDrainer(this, std::move(consumer_handle)));
83+
drainer_ = std::make_unique<mojo::DataPipeDrainer>(
84+
this, std::move(consumer_handle));
9585

9686
tracing_session_host_->DisableTracingAndEmitJson(
9787
"", std::move(producer_handle), false, std::move(stop_callback));

demo_tracing/demo_tracing_perfetto_content.cc

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,18 @@
1-
#include <base/threading/thread.h>
2-
#include <mojo/core/embedder/embedder.h>
3-
#include <mojo/core/embedder/scoped_ipc_support.h>
4-
51
#include "base/at_exit.h"
6-
#include "base/callback_forward.h"
72
#include "base/command_line.h"
8-
#include "base/debug/stack_trace.h"
93
#include "base/feature_list.h"
10-
#include "base/files/file_util.h"
4+
#include "base/i18n/icu_util.h"
115
#include "base/logging.h"
12-
#include "base/memory/ref_counted.h"
136
#include "base/path_service.h"
14-
#include "base/task/single_thread_task_executor.h"
15-
#include "base/task/task_traits.h"
167
#include "base/test/test_timeouts.h"
17-
#include "base/timer/timer.h"
18-
#include "base/trace_event/common/trace_event_common.h"
19-
#include "base/trace_event/trace_event.h"
20-
#include "components/tracing/common/trace_startup_config.h"
21-
#include "components/tracing/common/trace_to_console.h"
22-
#include "components/tracing/common/tracing_switches.h"
23-
#include "content/browser/browser_thread_impl.h"
8+
#include "base/threading/thread.h"
249
#include "content/browser/tracing/tracing_controller_impl.h"
25-
#include "content/common/content_export.h"
2610
#include "content/public/browser/content_browser_client.h"
2711
#include "content/public/browser/tracing_controller.h"
2812
#include "content/public/common/content_client.h"
2913
#include "content/public/test/browser_task_environment.h"
30-
#include "mojo/public/cpp/bindings/receiver.h"
31-
#include "mojo/public/cpp/bindings/remote.h"
14+
#include "mojo/core/embedder/embedder.h"
15+
#include "mojo/core/embedder/scoped_ipc_support.h"
3216
#include "mojo/public/cpp/system/data_pipe_drainer.h"
3317
#include "services/tracing/public/cpp/trace_startup.h"
3418
#include "services/tracing/public/cpp/tracing_features.h"
@@ -69,6 +53,7 @@ void TraceCount(int times) {
6953
int main(int argc, char** argv) {
7054
base::AtExitManager at_exit;
7155
base::CommandLine::Init(argc, argv);
56+
base::i18n::InitializeICU();
7257

7358
// Trace 的 perfetto 后端依赖 mojo
7459
mojo::core::Init();
@@ -87,7 +72,7 @@ int main(int argc, char** argv) {
8772
// 在 Chromium 中 Startup 的Trace需要特殊处理,因为 TracingService 启动的比较晚
8873
tracing::EnableStartupTracingIfNeeded();
8974

90-
TRACE_EVENT0("toplevel,startup,test", "This trace can not be record.");
75+
TRACE_EVENT0("test", "This trace can not be record.");
9176

9277
// 测试环境的超时参数初始化
9378
TestTimeouts::Initialize();

0 commit comments

Comments
 (0)