/* * Copyright (C) 2019 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. */ #ifndef INCLUDE_PERFETTO_TRACING_TRACK_H_ #define INCLUDE_PERFETTO_TRACING_TRACK_H_ #include "perfetto/base/export.h" #include "perfetto/base/proc_utils.h" #include "perfetto/base/thread_utils.h" #include "perfetto/protozero/message_handle.h" #include "perfetto/protozero/scattered_heap_buffer.h" #include "perfetto/tracing/internal/fnv1a.h" #include "perfetto/tracing/internal/tracing_muxer.h" #include "perfetto/tracing/platform.h" #include "perfetto/tracing/string_helpers.h" #include "protos/perfetto/trace/trace_packet.pbzero.h" #include "protos/perfetto/trace/track_event/counter_descriptor.gen.h" #include "protos/perfetto/trace/track_event/counter_descriptor.pbzero.h" #include "protos/perfetto/trace/track_event/track_descriptor.gen.h" #include "protos/perfetto/trace/track_event/track_descriptor.pbzero.h" #include <stdint.h> #include <map> #include <mutex> namespace perfetto { namespace internal { class TrackRegistry; } class Flow; class TerminatingFlow; // Track events are recorded on a timeline track, which maintains the relative // time ordering of all events on that track. Each thread has its own default // track (ThreadTrack), which is by default where all track events are written. // Thread tracks are grouped under their hosting process (ProcessTrack). // Events which aren't strictly scoped to a thread or a process, or don't // correspond to synchronous code execution on a thread can use a custom // track (Track, ThreadTrack or ProcessTrack). A Track object can also // optionally be parented to a thread or a process. // // A track is represented by a uuid, which must be unique across the entire // recorded trace. // // For example, to record an event that begins and ends on different threads, // use a matching id to tie the begin and end events together: // // TRACE_EVENT_BEGIN("category", "AsyncEvent", perfetto::Track(8086)); // ... // TRACE_EVENT_END("category", perfetto::Track(8086)); // // Tracks can also be annotated with metadata: // // auto desc = track.Serialize(); // desc.set_name("MyTrack"); // perfetto::TrackEvent::SetTrackDescriptor(track, desc); // // Threads and processes can also be named in a similar way, e.g.: // // auto desc = perfetto::ProcessTrack::Current().Serialize(); // desc.mutable_process()->set_process_name("MyProcess"); // perfetto::TrackEvent::SetTrackDescriptor( // perfetto::ProcessTrack::Current(), desc); // // The metadata remains valid between tracing sessions. To free up data for a // track, call EraseTrackDescriptor: // // perfetto::TrackEvent::EraseTrackDescriptor(track); // struct PERFETTO_EXPORT_COMPONENT Track { … }; // A process track represents events that describe the state of the entire // application (e.g., counter events). Currently a ProcessTrack can only // represent the current process. struct PERFETTO_EXPORT_COMPONENT ProcessTrack : public Track { … }; // A thread track is associated with a specific thread of execution. Currently // only threads in the current process can be referenced. struct PERFETTO_EXPORT_COMPONENT ThreadTrack : public Track { … }; // A track for recording counter values with the TRACE_COUNTER macro. Counter // tracks can optionally be given units and other metadata. See // /protos/perfetto/trace/track_event/counter_descriptor.proto for details. class PERFETTO_EXPORT_COMPONENT CounterTrack : public Track { … }; namespace internal { // Keeps a map of uuids to serialized track descriptors and provides a // thread-safe way to read and write them. Each trace writer keeps a TLS set of // the tracks it has seen (see TrackEventIncrementalState). In the common case, // this registry is not consulted (and no locks are taken). However when a new // track is seen, this registry is used to write either 1) the default // descriptor for that track (see *Track::Serialize) or 2) a serialized // descriptor stored in the registry which may have additional metadata (e.g., // track name). // TODO(eseckler): Remove PERFETTO_EXPORT_COMPONENT once Chromium no longer // calls TrackRegistry::InitializeInstance() directly. class PERFETTO_EXPORT_COMPONENT TrackRegistry { … }; } // namespace internal } // namespace perfetto #endif // INCLUDE_PERFETTO_TRACING_TRACK_H_