| /* |
| * Copyright (C) 2020 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "perfetto/tracing/track_event_legacy.h" |
| #include "perfetto/ext/base/hash.h" |
| |
| #include "perfetto/tracing/track.h" |
| |
| namespace perfetto { |
| namespace legacy { |
| |
| template <> |
| ThreadTrack ConvertThreadId(const PerfettoLegacyCurrentThreadId&) { |
| // Because of the short-circuit in PERFETTO_INTERNAL_LEGACY_EVENT, we should |
| // never get here. |
| PERFETTO_DCHECK(false); |
| return ThreadTrack::Current(); |
| } |
| |
| } // namespace legacy |
| |
| namespace internal { |
| |
| void LegacyTraceId::Write(protos::pbzero::TrackEvent::LegacyEvent* event, |
| uint32_t event_flags) const { |
| // Legacy flow events always use bind_id. |
| if (event_flags & |
| (legacy::kTraceEventFlagFlowOut | legacy::kTraceEventFlagFlowIn)) { |
| // Flow bind_ids don't have scopes, so we need to mangle in-process ones to |
| // avoid collisions. |
| if (id_flags_ & legacy::kTraceEventFlagHasLocalId) { |
| event->set_bind_id(raw_id_ ^ ProcessTrack::Current().uuid); |
| } else { |
| event->set_bind_id(raw_id_); |
| } |
| return; |
| } |
| |
| uint32_t scope_flags = id_flags_ & (legacy::kTraceEventFlagHasId | |
| legacy::kTraceEventFlagHasLocalId | |
| legacy::kTraceEventFlagHasGlobalId); |
| uint64_t id = raw_id_; |
| if (scope_ && scope_flags != legacy::kTraceEventFlagHasGlobalId) { |
| id = base::Hasher::Combine(id, scope_); |
| } |
| |
| switch (scope_flags) { |
| case legacy::kTraceEventFlagHasId: |
| event->set_unscoped_id(id); |
| break; |
| case legacy::kTraceEventFlagHasLocalId: |
| event->set_local_id(id); |
| break; |
| case legacy::kTraceEventFlagHasGlobalId: |
| event->set_global_id(id); |
| break; |
| } |
| if (scope_) |
| event->set_id_scope(scope_); |
| } |
| |
| } // namespace internal |
| } // namespace perfetto |