blob: 4eab33eb03b001e6bf9425d81fab4a67d74af7cb [file] [log] [blame] [edit]
/*
* 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