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 WorkerThreadTrack 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 Workervoid 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