xref: /aosp_15_r20/external/perfetto/src/tracing/track_event_legacy.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker  * Copyright (C) 2020 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker  *
4*6dbdd20aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker  *
8*6dbdd20aSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker  *
10*6dbdd20aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker  * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker  */
16*6dbdd20aSAndroid Build Coastguard Worker 
17*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/tracing/track_event_legacy.h"
18*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/hash.h"
19*6dbdd20aSAndroid Build Coastguard Worker 
20*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/tracing/track.h"
21*6dbdd20aSAndroid Build Coastguard Worker 
22*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
23*6dbdd20aSAndroid Build Coastguard Worker namespace legacy {
24*6dbdd20aSAndroid Build Coastguard Worker 
25*6dbdd20aSAndroid Build Coastguard Worker template <>
ConvertThreadId(const PerfettoLegacyCurrentThreadId &)26*6dbdd20aSAndroid Build Coastguard Worker ThreadTrack ConvertThreadId(const PerfettoLegacyCurrentThreadId&) {
27*6dbdd20aSAndroid Build Coastguard Worker   // Because of the short-circuit in PERFETTO_INTERNAL_LEGACY_EVENT, we should
28*6dbdd20aSAndroid Build Coastguard Worker   // never get here.
29*6dbdd20aSAndroid Build Coastguard Worker   PERFETTO_DCHECK(false);
30*6dbdd20aSAndroid Build Coastguard Worker   return ThreadTrack::Current();
31*6dbdd20aSAndroid Build Coastguard Worker }
32*6dbdd20aSAndroid Build Coastguard Worker 
33*6dbdd20aSAndroid Build Coastguard Worker }  // namespace legacy
34*6dbdd20aSAndroid Build Coastguard Worker 
35*6dbdd20aSAndroid Build Coastguard Worker namespace internal {
36*6dbdd20aSAndroid Build Coastguard Worker 
Write(protos::pbzero::TrackEvent::LegacyEvent * event,uint32_t event_flags) const37*6dbdd20aSAndroid Build Coastguard Worker void LegacyTraceId::Write(protos::pbzero::TrackEvent::LegacyEvent* event,
38*6dbdd20aSAndroid Build Coastguard Worker                           uint32_t event_flags) const {
39*6dbdd20aSAndroid Build Coastguard Worker   // Legacy flow events always use bind_id.
40*6dbdd20aSAndroid Build Coastguard Worker   if (event_flags &
41*6dbdd20aSAndroid Build Coastguard Worker       (legacy::kTraceEventFlagFlowOut | legacy::kTraceEventFlagFlowIn)) {
42*6dbdd20aSAndroid Build Coastguard Worker     // Flow bind_ids don't have scopes, so we need to mangle in-process ones to
43*6dbdd20aSAndroid Build Coastguard Worker     // avoid collisions.
44*6dbdd20aSAndroid Build Coastguard Worker     if (id_flags_ & legacy::kTraceEventFlagHasLocalId) {
45*6dbdd20aSAndroid Build Coastguard Worker       event->set_bind_id(raw_id_ ^ ProcessTrack::Current().uuid);
46*6dbdd20aSAndroid Build Coastguard Worker     } else {
47*6dbdd20aSAndroid Build Coastguard Worker       event->set_bind_id(raw_id_);
48*6dbdd20aSAndroid Build Coastguard Worker     }
49*6dbdd20aSAndroid Build Coastguard Worker     return;
50*6dbdd20aSAndroid Build Coastguard Worker   }
51*6dbdd20aSAndroid Build Coastguard Worker 
52*6dbdd20aSAndroid Build Coastguard Worker   uint32_t scope_flags = id_flags_ & (legacy::kTraceEventFlagHasId |
53*6dbdd20aSAndroid Build Coastguard Worker                                       legacy::kTraceEventFlagHasLocalId |
54*6dbdd20aSAndroid Build Coastguard Worker                                       legacy::kTraceEventFlagHasGlobalId);
55*6dbdd20aSAndroid Build Coastguard Worker   uint64_t id = raw_id_;
56*6dbdd20aSAndroid Build Coastguard Worker   if (scope_ && scope_flags != legacy::kTraceEventFlagHasGlobalId) {
57*6dbdd20aSAndroid Build Coastguard Worker     id = base::Hasher::Combine(id, scope_);
58*6dbdd20aSAndroid Build Coastguard Worker   }
59*6dbdd20aSAndroid Build Coastguard Worker 
60*6dbdd20aSAndroid Build Coastguard Worker   switch (scope_flags) {
61*6dbdd20aSAndroid Build Coastguard Worker     case legacy::kTraceEventFlagHasId:
62*6dbdd20aSAndroid Build Coastguard Worker       event->set_unscoped_id(id);
63*6dbdd20aSAndroid Build Coastguard Worker       break;
64*6dbdd20aSAndroid Build Coastguard Worker     case legacy::kTraceEventFlagHasLocalId:
65*6dbdd20aSAndroid Build Coastguard Worker       event->set_local_id(id);
66*6dbdd20aSAndroid Build Coastguard Worker       break;
67*6dbdd20aSAndroid Build Coastguard Worker     case legacy::kTraceEventFlagHasGlobalId:
68*6dbdd20aSAndroid Build Coastguard Worker       event->set_global_id(id);
69*6dbdd20aSAndroid Build Coastguard Worker       break;
70*6dbdd20aSAndroid Build Coastguard Worker   }
71*6dbdd20aSAndroid Build Coastguard Worker   if (scope_)
72*6dbdd20aSAndroid Build Coastguard Worker     event->set_id_scope(scope_);
73*6dbdd20aSAndroid Build Coastguard Worker }
74*6dbdd20aSAndroid Build Coastguard Worker 
75*6dbdd20aSAndroid Build Coastguard Worker }  // namespace internal
76*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
77