1*288bf522SAndroid Build Coastguard Worker // Copyright (C) 2023 The Android Open Source Project
2*288bf522SAndroid Build Coastguard Worker //
3*288bf522SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*288bf522SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*288bf522SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*288bf522SAndroid Build Coastguard Worker //
7*288bf522SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
8*288bf522SAndroid Build Coastguard Worker //
9*288bf522SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*288bf522SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*288bf522SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*288bf522SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*288bf522SAndroid Build Coastguard Worker // limitations under the License.
14*288bf522SAndroid Build Coastguard Worker
15*288bf522SAndroid Build Coastguard Worker //! Usage sample for libatrace_rust.
16*288bf522SAndroid Build Coastguard Worker
17*288bf522SAndroid Build Coastguard Worker use std::thread::JoinHandle;
18*288bf522SAndroid Build Coastguard Worker
19*288bf522SAndroid Build Coastguard Worker use atrace::AtraceTag;
20*288bf522SAndroid Build Coastguard Worker
spawn_async_event() -> JoinHandle<()>21*288bf522SAndroid Build Coastguard Worker fn spawn_async_event() -> JoinHandle<()> {
22*288bf522SAndroid Build Coastguard Worker // Unlike normal events, async events don't need to be nested.
23*288bf522SAndroid Build Coastguard Worker // You need to use the same name and cookie (the last arg) to close the event.
24*288bf522SAndroid Build Coastguard Worker // The cookie must be unique on the name level.
25*288bf522SAndroid Build Coastguard Worker let unique_cookie = 12345;
26*288bf522SAndroid Build Coastguard Worker atrace::atrace_async_begin(AtraceTag::App, "Async task", unique_cookie);
27*288bf522SAndroid Build Coastguard Worker std::thread::spawn(move || {
28*288bf522SAndroid Build Coastguard Worker std::thread::sleep(std::time::Duration::from_millis(500));
29*288bf522SAndroid Build Coastguard Worker atrace::atrace_async_end(AtraceTag::App, "Async task", unique_cookie);
30*288bf522SAndroid Build Coastguard Worker })
31*288bf522SAndroid Build Coastguard Worker }
32*288bf522SAndroid Build Coastguard Worker
spawn_async_event_with_track() -> JoinHandle<()>33*288bf522SAndroid Build Coastguard Worker fn spawn_async_event_with_track() -> JoinHandle<()> {
34*288bf522SAndroid Build Coastguard Worker // Same as `atrace_async_begin` but per track.
35*288bf522SAndroid Build Coastguard Worker // Track name (not event name) and cookie are used to close the event.
36*288bf522SAndroid Build Coastguard Worker // The cookie must be unique on the track level.
37*288bf522SAndroid Build Coastguard Worker let unique_cookie = 12345;
38*288bf522SAndroid Build Coastguard Worker atrace::atrace_async_for_track_begin(
39*288bf522SAndroid Build Coastguard Worker AtraceTag::App,
40*288bf522SAndroid Build Coastguard Worker "Async track",
41*288bf522SAndroid Build Coastguard Worker "Task with track",
42*288bf522SAndroid Build Coastguard Worker unique_cookie,
43*288bf522SAndroid Build Coastguard Worker );
44*288bf522SAndroid Build Coastguard Worker std::thread::spawn(move || {
45*288bf522SAndroid Build Coastguard Worker std::thread::sleep(std::time::Duration::from_millis(600));
46*288bf522SAndroid Build Coastguard Worker atrace::atrace_async_for_track_end(AtraceTag::App, "Async track", unique_cookie);
47*288bf522SAndroid Build Coastguard Worker })
48*288bf522SAndroid Build Coastguard Worker }
49*288bf522SAndroid Build Coastguard Worker
spawn_counter_thread() -> JoinHandle<()>50*288bf522SAndroid Build Coastguard Worker fn spawn_counter_thread() -> JoinHandle<()> {
51*288bf522SAndroid Build Coastguard Worker std::thread::spawn(|| {
52*288bf522SAndroid Build Coastguard Worker for i in 1..=10 {
53*288bf522SAndroid Build Coastguard Worker std::thread::sleep(std::time::Duration::from_millis(100));
54*288bf522SAndroid Build Coastguard Worker // Counter events are available for int and int64 to trace values.
55*288bf522SAndroid Build Coastguard Worker atrace::atrace_int(AtraceTag::App, "Count of i", i);
56*288bf522SAndroid Build Coastguard Worker }
57*288bf522SAndroid Build Coastguard Worker })
58*288bf522SAndroid Build Coastguard Worker }
59*288bf522SAndroid Build Coastguard Worker
main()60*288bf522SAndroid Build Coastguard Worker fn main() {
61*288bf522SAndroid Build Coastguard Worker // This macro will create a scoped event with the function name used as the event name.
62*288bf522SAndroid Build Coastguard Worker atrace::trace_method!(AtraceTag::App);
63*288bf522SAndroid Build Coastguard Worker
64*288bf522SAndroid Build Coastguard Worker // The scoped event will be ended when the returned guard is dropped.
65*288bf522SAndroid Build Coastguard Worker let _scoped_event = atrace::begin_scoped_event(AtraceTag::App, "Example main");
66*288bf522SAndroid Build Coastguard Worker
67*288bf522SAndroid Build Coastguard Worker // Methods starting with atrace_* are direct wrappers of libcutils methods.
68*288bf522SAndroid Build Coastguard Worker let enabled_tags = atrace::atrace_get_enabled_tags();
69*288bf522SAndroid Build Coastguard Worker println!("Enabled tags: {:?}", enabled_tags);
70*288bf522SAndroid Build Coastguard Worker
71*288bf522SAndroid Build Coastguard Worker println!("Spawning async trace events");
72*288bf522SAndroid Build Coastguard Worker let async_event_handler = spawn_async_event();
73*288bf522SAndroid Build Coastguard Worker let async_event_with_track_handler = spawn_async_event_with_track();
74*288bf522SAndroid Build Coastguard Worker let counter_thread_handler = spawn_counter_thread();
75*288bf522SAndroid Build Coastguard Worker
76*288bf522SAndroid Build Coastguard Worker // Instant events have no duration and don't need to be closed.
77*288bf522SAndroid Build Coastguard Worker atrace::atrace_instant(AtraceTag::App, "Instant event");
78*288bf522SAndroid Build Coastguard Worker
79*288bf522SAndroid Build Coastguard Worker println!("Calling atrace_begin and sleeping for 1 sec...");
80*288bf522SAndroid Build Coastguard Worker // If you begin an event you need to close it with the same tag. If you're calling begin
81*288bf522SAndroid Build Coastguard Worker // manually make sure you have a matching end. Or just use a scoped event.
82*288bf522SAndroid Build Coastguard Worker atrace::atrace_begin(AtraceTag::App, "Hello tracing!");
83*288bf522SAndroid Build Coastguard Worker std::thread::sleep(std::time::Duration::from_secs(1));
84*288bf522SAndroid Build Coastguard Worker atrace::atrace_end(AtraceTag::App);
85*288bf522SAndroid Build Coastguard Worker
86*288bf522SAndroid Build Coastguard Worker println!("Joining async events...");
87*288bf522SAndroid Build Coastguard Worker async_event_handler.join().unwrap();
88*288bf522SAndroid Build Coastguard Worker async_event_with_track_handler.join().unwrap();
89*288bf522SAndroid Build Coastguard Worker counter_thread_handler.join().unwrap();
90*288bf522SAndroid Build Coastguard Worker
91*288bf522SAndroid Build Coastguard Worker println!("Done!");
92*288bf522SAndroid Build Coastguard Worker }
93