sdk: Make static track names default in Java SDK Add new APIs for dynamic names Static track names are stored in field 10 of the TrackDescriptor protobuf, which allows the trace processor to use them as stable identifiers for tracks. Adds the following Java SDK APIs - usingNamedTrackWithDynamicName - usingProcessNamedTrackWithDynamicName - usingThreadNamedTrackWithDynamicName - usingCounterTrackWithDynamicName - usingProcessCounterTrackWithDynamicName - usingThreadCounterTrackWithDynamicName Adds the following Rust SDK APIs - set_named_track_with_dynamic_name - register_named_track_with_dynamic_name - register_counter_track_with_dynamic_name
diff --git a/examples/shared_lib/example_shlib_track_event.c b/examples/shared_lib/example_shlib_track_event.c index 7937921..bdfb3af 100644 --- a/examples/shared_lib/example_shlib_track_event.c +++ b/examples/shared_lib/example_shlib_track_event.c
@@ -58,9 +58,9 @@ PerfettoTeInit(); PERFETTO_TE_REGISTER_CATEGORIES(EXAMPLE_CATEGORIES); PerfettoTeNamedTrackRegister(&mytrack, "mytrack", 0, - PerfettoTeProcessTrackUuid()); + PerfettoTeProcessTrackUuid(), true); PerfettoTeCounterTrackRegister(&mycounter, "mycounter", - PerfettoTeProcessTrackUuid()); + PerfettoTeProcessTrackUuid(), true); PerfettoTeCategorySetCallback(&physics, EnabledCb, PERFETTO_NULL); for (;;) { PERFETTO_TE(rendering, PERFETTO_TE_INSTANT("name1"));
diff --git a/include/perfetto/public/abi/track_event_hl_abi.h b/include/perfetto/public/abi/track_event_hl_abi.h index f040c05..2ae69d6 100644 --- a/include/perfetto/public/abi/track_event_hl_abi.h +++ b/include/perfetto/public/abi/track_event_hl_abi.h
@@ -175,6 +175,7 @@ const char* name; uint64_t id; uint64_t parent_uuid; + bool is_name_static; }; // PERFETTO_TE_HL_EXTRA_TYPE_TIMESTAMP
diff --git a/include/perfetto/public/te_macros.h b/include/perfetto/public/te_macros.h index efb1cec..19b94bf 100644 --- a/include/perfetto/public/te_macros.h +++ b/include/perfetto/public/te_macros.h
@@ -241,7 +241,7 @@ #define PERFETTO_TE_NAMED_TRACK(NAME, ID, PARENT_UUID) \ PERFETTO_I_TE_EXTRA( \ PerfettoTeHlExtraNamedTrack, \ - {{PERFETTO_TE_HL_EXTRA_TYPE_NAMED_TRACK}, NAME, ID, PARENT_UUID}) + {{PERFETTO_TE_HL_EXTRA_TYPE_NAMED_TRACK}, NAME, ID, PARENT_UUID, false}) // When PERFETTO_TE_DYNAMIC_CATEGORY is used, this is used to specify `const // char* S` as a category name.
diff --git a/include/perfetto/public/track_event.h b/include/perfetto/public/track_event.h index 5db77c6..fad90f4 100644 --- a/include/perfetto/public/track_event.h +++ b/include/perfetto/public/track_event.h
@@ -147,12 +147,17 @@ struct perfetto_protos_TrackDescriptor* desc, const char* name, uint64_t parent_track_uuid, - uint64_t track_uuid) { + uint64_t track_uuid, + bool is_name_static) { perfetto_protos_TrackDescriptor_set_uuid(desc, track_uuid); if (parent_track_uuid) { perfetto_protos_TrackDescriptor_set_parent_uuid(desc, parent_track_uuid); } - perfetto_protos_TrackDescriptor_set_cstr_name(desc, name); + if (is_name_static) { + perfetto_protos_TrackDescriptor_set_cstr_static_name(desc, name); + } else { + perfetto_protos_TrackDescriptor_set_cstr_name(desc, name); + } { struct perfetto_protos_CounterDescriptor counter; perfetto_protos_TrackDescriptor_begin_counter(desc, &counter); @@ -168,22 +173,45 @@ const char* track_name, uint64_t id, uint64_t parent_track_uuid, - uint64_t track_uuid) { + uint64_t track_uuid, + bool is_name_static) { (void)id; perfetto_protos_TrackDescriptor_set_uuid(desc, track_uuid); if (parent_track_uuid) { perfetto_protos_TrackDescriptor_set_parent_uuid(desc, parent_track_uuid); } - perfetto_protos_TrackDescriptor_set_cstr_name(desc, track_name); + if (is_name_static) { + perfetto_protos_TrackDescriptor_set_cstr_static_name(desc, track_name); + } else { + perfetto_protos_TrackDescriptor_set_cstr_name(desc, track_name); + } +} + +static inline void PerfettoTeRegisteredTrackFillImpl( + struct PerfettoTeRegisteredTrack* track, + struct PerfettoHeapBuffer* hb, + struct PerfettoPbMsgWriter* writer, + uint64_t uuid) { + track->impl.descriptor_size = + PerfettoStreamWriterGetWrittenSize(&writer->writer); + track->impl.descriptor = malloc(track->impl.descriptor_size); + track->impl.uuid = uuid; + PerfettoHeapBufferCopyInto(hb, &writer->writer, track->impl.descriptor, + track->impl.descriptor_size); + PerfettoHeapBufferDestroy(hb, &writer->writer); } // Registers a track named `name` with unique `id` and `parent_uuid` into // `track`. +// TODO(primiano): rather than calling this directly, we should create a macro +// which is a wrapper around this function, which internally uses +// __builtin_constant_p to populate is_name_static static inline void PerfettoTeNamedTrackRegister( struct PerfettoTeRegisteredTrack* track, const char* name, uint64_t id, - uint64_t parent_track_uuid) { + uint64_t parent_track_uuid, + bool is_name_static) { uint64_t uuid; // Build the TrackDescriptor protobuf message. struct PerfettoPbMsgWriter writer; @@ -193,39 +221,29 @@ uuid = PerfettoTeNamedTrackUuid(name, id, parent_track_uuid); - PerfettoTeNamedTrackFillDesc(&desc, name, id, parent_track_uuid, uuid); - - track->impl.descriptor_size = - PerfettoStreamWriterGetWrittenSize(&writer.writer); - track->impl.descriptor = malloc(track->impl.descriptor_size); - track->impl.uuid = uuid; - PerfettoHeapBufferCopyInto(hb, &writer.writer, track->impl.descriptor, - track->impl.descriptor_size); - PerfettoHeapBufferDestroy(hb, &writer.writer); + PerfettoTeNamedTrackFillDesc(&desc, name, id, parent_track_uuid, uuid, + is_name_static); + PerfettoTeRegisteredTrackFillImpl(track, hb, &writer, uuid); } // Registers a counter track named `name` with and `parent_uuid` into `track`. +// TODO(primiano): rather than calling this directly, we should create a macro +// which is a wrapper around this function, which internally uses +// __builtin_constant_p to populate is_name_static static inline void PerfettoTeCounterTrackRegister( struct PerfettoTeRegisteredTrack* track, const char* name, - uint64_t parent_track_uuid) { + uint64_t parent_track_uuid, + bool is_name_static) { uint64_t uuid; struct PerfettoPbMsgWriter writer; struct PerfettoHeapBuffer* hb = PerfettoHeapBufferCreate(&writer.writer); struct perfetto_protos_TrackDescriptor desc; PerfettoPbMsgInit(&desc.msg, &writer); - uuid = PerfettoTeCounterTrackUuid(name, parent_track_uuid); - - PerfettoTeCounterTrackFillDesc(&desc, name, parent_track_uuid, uuid); - - track->impl.descriptor_size = - PerfettoStreamWriterGetWrittenSize(&writer.writer); - track->impl.descriptor = malloc(track->impl.descriptor_size); - track->impl.uuid = uuid; - PerfettoHeapBufferCopyInto(hb, &writer.writer, track->impl.descriptor, - track->impl.descriptor_size); - PerfettoHeapBufferDestroy(hb, &writer.writer); + PerfettoTeCounterTrackFillDesc(&desc, name, parent_track_uuid, uuid, + is_name_static); + PerfettoTeRegisteredTrackFillImpl(track, hb, &writer, uuid); } // Unregisters the previously registered track `track`.
diff --git a/src/android_sdk/java/main/dev/perfetto/sdk/PerfettoTrackEventBuilder.java b/src/android_sdk/java/main/dev/perfetto/sdk/PerfettoTrackEventBuilder.java index d46991e..d062949 100644 --- a/src/android_sdk/java/main/dev/perfetto/sdk/PerfettoTrackEventBuilder.java +++ b/src/android_sdk/java/main/dev/perfetto/sdk/PerfettoTrackEventBuilder.java
@@ -357,6 +357,24 @@ /** Adds the events to a named track instead of the thread track where the event occurred. */ public PerfettoTrackEventBuilder usingNamedTrack(long id, String name, long parentUuid) { + return usingNamedTrack(id, name, parentUuid, /* isNameStatic = */ true); + } + + /** + * Adds the events to a named track with a dynamic name (populated in field 10 of + * TrackDescriptor). + */ + public PerfettoTrackEventBuilder usingNamedTrackWithDynamicName( + long id, String name, long parentUuid) { + return usingNamedTrack(id, name, parentUuid, /* isNameStatic = */ false); + } + + /** + * Adds the events to a named track with a static name (populated in field 10 of + * TrackDescriptor). + */ + private PerfettoTrackEventBuilder usingNamedTrack( + long id, String name, long parentUuid, boolean isNameStatic) { if (!mIsCategoryEnabled) { return this; } @@ -365,8 +383,8 @@ } NamedTrack track = mObjectsCache.mNamedTrackCache.get(name.hashCode()); - if (track == null || !track.getName().equals(name)) { - track = new NamedTrack(id, name, parentUuid, mNativeMemoryCleaner); + if (track == null || !track.getName().equals(name) || track.isNameStatic() != isNameStatic) { + track = new NamedTrack(id, name, parentUuid, isNameStatic, mNativeMemoryCleaner); mObjectsCache.mNamedTrackCache.put(name.hashCode(), track); } addPerfettoPointerToExtra(track); @@ -385,6 +403,18 @@ } /** + * Adds the events to a process scoped named track with a dynamic name instead of the thread track + * where the event occurred. + */ + public PerfettoTrackEventBuilder usingProcessNamedTrackWithDynamicName( + long id, String name) { + if (!mIsCategoryEnabled) { + return this; + } + return usingNamedTrackWithDynamicName(id, name, PerfettoTrace.getProcessTrackUuid()); + } + + /** * Adds the events to a thread scoped named track instead of the thread track where the event * occurred. */ @@ -395,8 +425,34 @@ return usingNamedTrack(id, name, PerfettoTrace.getThreadTrackUuid(tid)); } + /** + * Adds the events to a thread scoped named track with a dynamic name instead of the thread track + * where the event occurred. + */ + public PerfettoTrackEventBuilder usingThreadNamedTrackWithDynamicName( + long id, String name, long tid) { + if (!mIsCategoryEnabled) { + return this; + } + return usingNamedTrackWithDynamicName(id, name, PerfettoTrace.getThreadTrackUuid(tid)); + } + /** Adds the events to a counter track instead. This is required for setting counter values. */ public PerfettoTrackEventBuilder usingCounterTrack(long parentUuid, String name) { + return usingCounterTrack(parentUuid, name, /* isNameStatic = */ true); + } + + /** + * Adds the events to a counter track with a static name instead. This is required for setting + * counter values. + */ + public PerfettoTrackEventBuilder usingCounterTrackWithDynamicName( + long parentUuid, String name) { + return usingCounterTrack(parentUuid, name, /* isNameStatic = */ false); + } + + private PerfettoTrackEventBuilder usingCounterTrack( + long parentUuid, String name, boolean isNameStatic) { if (!mIsCategoryEnabled) { return this; } @@ -405,8 +461,8 @@ } CounterTrack track = mObjectsCache.mCounterTrackCache.get(name.hashCode()); - if (track == null || !track.getName().equals(name)) { - track = new CounterTrack(name, parentUuid, mNativeMemoryCleaner); + if (track == null || !track.getName().equals(name) || track.isNameStatic() != isNameStatic) { + track = new CounterTrack(name, parentUuid, isNameStatic, mNativeMemoryCleaner); mObjectsCache.mCounterTrackCache.put(name.hashCode(), track); } addPerfettoPointerToExtra(track); @@ -425,6 +481,18 @@ } /** + * Adds the events to a process scoped counter track with a static name instead. This is required + * for setting counter values. + */ + public PerfettoTrackEventBuilder usingProcessCounterTrackWithDynamicName( + String name) { + if (!mIsCategoryEnabled) { + return this; + } + return usingCounterTrackWithDynamicName(PerfettoTrace.getProcessTrackUuid(), name); + } + + /** * Adds the events to a thread scoped counter track instead. This is required for setting counter * values. */ @@ -435,6 +503,18 @@ return usingCounterTrack(PerfettoTrace.getThreadTrackUuid(tid), name); } + /** + * Adds the events to a thread scoped counter track with a static name instead. This is required for + * setting counter values. + */ + public PerfettoTrackEventBuilder usingThreadCounterTrackWithDynamicName( + long tid, String name) { + if (!mIsCategoryEnabled) { + return this; + } + return usingCounterTrackWithDynamicName(PerfettoTrace.getThreadTrackUuid(tid), name); + } + /** Sets a long counter value on the event. */ public PerfettoTrackEventBuilder setCounter(long val) { if (!mIsCategoryEnabled) {
diff --git a/src/android_sdk/java/main/dev/perfetto/sdk/PerfettoTrackEventExtra.java b/src/android_sdk/java/main/dev/perfetto/sdk/PerfettoTrackEventExtra.java index 38b5402..15d75bb 100644 --- a/src/android_sdk/java/main/dev/perfetto/sdk/PerfettoTrackEventExtra.java +++ b/src/android_sdk/java/main/dev/perfetto/sdk/PerfettoTrackEventExtra.java
@@ -119,12 +119,19 @@ private final long mExtraPtr; private final String mName; private final long mId; + private final boolean mIsNameStatic; - NamedTrack(long id, String name, long parentUuid, PerfettoNativeMemoryCleaner memoryCleaner) { - mPtr = native_init(id, name, parentUuid); + NamedTrack( + long id, + String name, + long parentUuid, + boolean isNameStatic, + PerfettoNativeMemoryCleaner memoryCleaner) { + mPtr = native_init(id, name, parentUuid, isNameStatic); mExtraPtr = native_get_extra_ptr(mPtr); mName = name; mId = id; + mIsNameStatic = isNameStatic; memoryCleaner.registerNativeAllocation(this, mPtr, native_delete()); } @@ -137,8 +144,12 @@ return mName; } + public boolean isNameStatic() { + return mIsNameStatic; + } + @FastNative - private static native long native_init(long id, String name, long parentUuid); + private static native long native_init(long id, String name, long parentUuid, boolean isNameStatic); @CriticalNative private static native long native_delete(); @@ -151,11 +162,17 @@ private final long mPtr; private final long mExtraPtr; private final String mName; + private final boolean mIsNameStatic; - CounterTrack(String name, long parentUuid, PerfettoNativeMemoryCleaner memoryCleaner) { - mPtr = native_init(name, parentUuid); + CounterTrack( + String name, + long parentUuid, + boolean isNameStatic, + PerfettoNativeMemoryCleaner memoryCleaner) { + mPtr = native_init(name, parentUuid, isNameStatic); mExtraPtr = native_get_extra_ptr(mPtr); mName = name; + mIsNameStatic = isNameStatic; memoryCleaner.registerNativeAllocation(this, mPtr, native_delete()); } @@ -168,8 +185,12 @@ return mName; } + public boolean isNameStatic() { + return mIsNameStatic; + } + @FastNative - private static native long native_init(String name, long parentUuid); + private static native long native_init(String name, long parentUuid, boolean isNameStatic); @CriticalNative private static native long native_delete();
diff --git a/src/android_sdk/java/test/dev/perfetto/sdk/test/PerfettoTraceTest.java b/src/android_sdk/java/test/dev/perfetto/sdk/test/PerfettoTraceTest.java index 01fd8fb..6b541c5 100644 --- a/src/android_sdk/java/test/dev/perfetto/sdk/test/PerfettoTraceTest.java +++ b/src/android_sdk/java/test/dev/perfetto/sdk/test/PerfettoTraceTest.java
@@ -299,6 +299,115 @@ } @Test + public void testStaticNamedTrack() throws Exception { + TraceConfig traceConfig = getTraceConfig(FOO); + + PerfettoTrace.Session session = new PerfettoTrace.Session(true, traceConfig.toByteArray()); + + PerfettoTrace.begin(FOO_CATEGORY, "event") + .usingProcessNamedTrack(123, "static_track") + .emit(); + + PerfettoTrace.end(FOO_CATEGORY) + .usingProcessNamedTrack(123, "static_track") + .emit(); + + Trace trace = Trace.parseFrom(session.close()); + + boolean foundStaticName = false; + for (TracePacket packet : trace.getPacketList()) { + if (packet.hasTrackDescriptor()) { + TrackDescriptor td = packet.getTrackDescriptor(); + if ("static_track".equals(td.getStaticName())) { + foundStaticName = true; + } + } + } + + assertThat(foundStaticName).isTrue(); + } + + @Test + public void testDynamicNamedTrack() throws Exception { + TraceConfig traceConfig = getTraceConfig(FOO); + + PerfettoTrace.Session session = new PerfettoTrace.Session(true, traceConfig.toByteArray()); + + PerfettoTrace.begin(FOO_CATEGORY, "event") + .usingProcessNamedTrackWithDynamicName(123, "dynamic_track") + .emit(); + + PerfettoTrace.end(FOO_CATEGORY) + .usingProcessNamedTrackWithDynamicName(123, "dynamic_track") + .emit(); + + Trace trace = Trace.parseFrom(session.close()); + + boolean foundDynamicName = false; + for (TracePacket packet : trace.getPacketList()) { + if (packet.hasTrackDescriptor()) { + TrackDescriptor td = packet.getTrackDescriptor(); + if ("dynamic_track".equals(td.getName())) { + foundDynamicName = true; + } + } + } + + assertThat(foundDynamicName).isTrue(); + } + + @Test + public void testStaticCounterTrack() throws Exception { + TraceConfig traceConfig = getTraceConfig(FOO); + + PerfettoTrace.Session session = new PerfettoTrace.Session(true, traceConfig.toByteArray()); + + PerfettoTrace.counter(FOO_CATEGORY, 42) + .usingProcessCounterTrack("static_counter") + .emit(); + + Trace trace = Trace.parseFrom(session.close()); + + boolean foundStaticName = false; + for (TracePacket packet : trace.getPacketList()) { + if (packet.hasTrackDescriptor()) { + TrackDescriptor td = packet.getTrackDescriptor(); + if ("static_counter".equals(td.getStaticName())) { + foundStaticName = true; + } + } + } + + assertThat(foundStaticName).isTrue(); + } + + @Test + public void testDynamicCounterTrack() throws Exception { + TraceConfig traceConfig = getTraceConfig(FOO); + + PerfettoTrace.Session session = new PerfettoTrace.Session(true, traceConfig.toByteArray()); + + PerfettoTrace.counter(FOO_CATEGORY, 42) + .usingProcessCounterTrack("dynamic_counter") + .emit(); + + Trace trace = Trace.parseFrom(session.close()); + + boolean foundDynamicName = false; + for (TracePacket packet : trace.getPacketList()) { + if (packet.hasTrackDescriptor()) { + TrackDescriptor td = packet.getTrackDescriptor(); + if ("dynamic_counter".equals(td.getName())) { + foundDynamicName = true; + } + } + } + + assertThat(foundDynamicName).isTrue(); + } + + + @Test public void testCounterSimple() throws Exception { TraceConfig traceConfig = getTraceConfig(FOO);
diff --git a/src/android_sdk/jni/dev_perfetto_sdk_PerfettoTrackEventExtra.cc b/src/android_sdk/jni/dev_perfetto_sdk_PerfettoTrackEventExtra.cc index 7cc4dda..6c929c6 100644 --- a/src/android_sdk/jni/dev_perfetto_sdk_PerfettoTrackEventExtra.cc +++ b/src/android_sdk/jni/dev_perfetto_sdk_PerfettoTrackEventExtra.cc
@@ -355,9 +355,11 @@ jclass, jlong id, jstring name, - jlong parent_uuid) { + jlong parent_uuid, + jboolean is_name_static) { return toJLong(new sdk_for_jni::NamedTrack( - id, parent_uuid, StringBuffer::utf16_to_ascii(env, name).data())); + id, parent_uuid, StringBuffer::utf16_to_ascii(env, name).data(), + is_name_static)); } static jlong dev_perfetto_sdk_PerfettoTrackEventExtraNamedTrack_delete() { @@ -374,9 +376,11 @@ JNIEnv* env, jclass, jstring name, - jlong parent_uuid) { + jlong parent_uuid, + jboolean is_name_static) { return toJLong(new sdk_for_jni::RegisteredTrack( - 1, parent_uuid, StringBuffer::utf16_to_ascii(env, name).data(), true)); + 1, parent_uuid, StringBuffer::utf16_to_ascii(env, name).data(), true, + is_name_static)); } static jlong dev_perfetto_sdk_PerfettoTrackEventExtraCounterTrack_delete() { @@ -567,7 +571,7 @@ }; static const JNINativeMethod gNamedTrackMethods[] = { - {"native_init", "(JLjava/lang/String;J)J", + {"native_init", "(JLjava/lang/String;JZ)J", (void*)dev_perfetto_sdk_PerfettoTrackEventExtraNamedTrack_init}, {"native_delete", "()J", (void*)dev_perfetto_sdk_PerfettoTrackEventExtraNamedTrack_delete}, @@ -576,7 +580,7 @@ }; static const JNINativeMethod gCounterTrackMethods[] = { - {"native_init", "(Ljava/lang/String;J)J", + {"native_init", "(Ljava/lang/String;JZ)J", (void*)dev_perfetto_sdk_PerfettoTrackEventExtraCounterTrack_init}, {"native_delete", "()J", (void*)dev_perfetto_sdk_PerfettoTrackEventExtraCounterTrack_delete},
diff --git a/src/android_sdk/perfetto_sdk_for_jni/tracing_sdk.cc b/src/android_sdk/perfetto_sdk_for_jni/tracing_sdk.cc index dd65fb1..65374a6 100644 --- a/src/android_sdk/perfetto_sdk_for_jni/tracing_sdk.cc +++ b/src/android_sdk/perfetto_sdk_for_jni/tracing_sdk.cc
@@ -144,12 +144,14 @@ NamedTrack::NamedTrack(uint64_t id, uint64_t parent_uuid, - const std::string& name) + const std::string& name, + bool is_name_static) : name_(name), track_{{PERFETTO_TE_HL_EXTRA_TYPE_NAMED_TRACK}, name_.data(), id, - parent_uuid} {} + parent_uuid, + is_name_static} {} void NamedTrack::delete_track(NamedTrack* ptr) { delete ptr; @@ -158,14 +160,16 @@ RegisteredTrack::RegisteredTrack(uint64_t id, uint64_t parent_uuid, const std::string& name, - bool is_counter) + bool is_counter, + bool is_name_static) : registered_track_{}, track_{{PERFETTO_TE_HL_EXTRA_TYPE_REGISTERED_TRACK}, - &(registered_track_.impl)}, + ®istered_track_.impl}, name_(name), id_(id), parent_uuid_(parent_uuid), - is_counter_(is_counter) { + is_counter_(is_counter), + is_name_static_(is_name_static) { register_track(); } @@ -178,11 +182,21 @@ return; if (is_counter_) { - PerfettoTeCounterTrackRegister(®istered_track_, name_.data(), - parent_uuid_); + if (is_name_static_) { + PerfettoTeCounterTrackRegisterWithStaticName(®istered_track_, + name_.data(), parent_uuid_); + } else { + PerfettoTeCounterTrackRegister(®istered_track_, name_.data(), + parent_uuid_); + } } else { - PerfettoTeNamedTrackRegister(®istered_track_, name_.data(), id_, - parent_uuid_); + if (is_name_static_) { + PerfettoTeNamedTrackRegisterWithStaticName( + ®istered_track_, name_.data(), id_, parent_uuid_); + } else { + PerfettoTeNamedTrackRegister(®istered_track_, name_.data(), id_, + parent_uuid_); + } } }
diff --git a/src/android_sdk/perfetto_sdk_for_jni/tracing_sdk.h b/src/android_sdk/perfetto_sdk_for_jni/tracing_sdk.h index f723843..5d06d9e 100644 --- a/src/android_sdk/perfetto_sdk_for_jni/tracing_sdk.h +++ b/src/android_sdk/perfetto_sdk_for_jni/tracing_sdk.h
@@ -164,7 +164,10 @@ */ class NamedTrack { public: - NamedTrack(uint64_t id, uint64_t parent_uuid, const std::string& name); + NamedTrack(uint64_t id, + uint64_t parent_uuid, + const std::string& name, + bool is_name_static); static void delete_track(NamedTrack* track); @@ -184,7 +187,9 @@ RegisteredTrack(uint64_t id, uint64_t parent_uuid, const std::string& name, - bool is_counter); + bool is_counter, + bool is_name_static_); + ~RegisteredTrack(); void register_track(); @@ -201,6 +206,7 @@ const uint64_t id_; const uint64_t parent_uuid_; const bool is_counter_; + const bool is_name_static_; }; /**
diff --git a/src/shared_lib/test/api_integrationtest.cc b/src/shared_lib/test/api_integrationtest.cc index bd1f4f0..f77ce32 100644 --- a/src/shared_lib/test/api_integrationtest.cc +++ b/src/shared_lib/test/api_integrationtest.cc
@@ -1952,7 +1952,7 @@ PerfettoTeRegisteredTrack my_counter_track; PerfettoTeCounterTrackRegister(&my_counter_track, "MyCounter", - PerfettoTeProcessTrackUuid()); + PerfettoTeProcessTrackUuid(), true); PERFETTO_TE(cat1, PERFETTO_TE_COUNTER(), PERFETTO_TE_REGISTERED_TRACK(&my_counter_track), @@ -1975,8 +1975,9 @@ ElementsAre(MsgField(UnorderedElementsAre( PbField(perfetto_protos_TrackDescriptor_uuid_field_number, VarIntField(kExpectedUuid)), - PbField(perfetto_protos_TrackDescriptor_name_field_number, - StringField("MyCounter")), + PbField( + perfetto_protos_TrackDescriptor_static_name_field_number, + StringField("MyCounter")), PbField( perfetto_protos_TrackDescriptor_parent_uuid_field_number, VarIntField(PerfettoTeProcessTrackUuid())), @@ -2391,7 +2392,7 @@ PerfettoTeRegisteredTrack my_named_track; PerfettoTeNamedTrackRegister(&my_named_track, "registered_track1", 0, - PerfettoTeProcessTrackUuid()); + PerfettoTeProcessTrackUuid(), false); PERFETTO_TE(cat1, PERFETTO_TE_INSTANT("event1"), PERFETTO_TE_NESTED_TRACKS( @@ -2463,6 +2464,9 @@ packet_field, perfetto_protos_TrackDescriptor_counter_field_number); IdFieldView name_field( packet_field, perfetto_protos_TrackDescriptor_name_field_number); + IdFieldView static_name_field( + packet_field, + perfetto_protos_TrackDescriptor_static_name_field_number); IdFieldView parent_uuid_field( packet_field, perfetto_protos_TrackDescriptor_parent_uuid_field_number); @@ -2474,13 +2478,14 @@ counter_uuid = uuid_field.front().value.integer64; counter_parent_uuid = parent_uuid_field.front().value.integer64; - } else if (name_field.size() == 1) { + } else if (name_field.size() == 1 || static_name_field.size() == 1) { + auto& field = name_field.size() == 1 ? name_field : static_name_field; ASSERT_THAT(parent_uuid_field, ElementsAre(VarIntField(_))); - ASSERT_THAT(name_field.front(), StringField(_)); + ASSERT_THAT(field.front(), StringField(_)); std::string_view name(reinterpret_cast<const char*>( - name_field.front().value.delimited.start), - name_field.front().value.delimited.len); + field.front().value.delimited.start), + field.front().value.delimited.len); if (name == "track_name1") { track_name1_uuid = uuid_field.front().value.integer64; track_name1_parent_uuid = parent_uuid_field.front().value.integer64;
diff --git a/src/shared_lib/track_event/hl.cc b/src/shared_lib/track_event/hl.cc index ee978dc..889c411 100644 --- a/src/shared_lib/track_event/hl.cc +++ b/src/shared_lib/track_event/hl.cc
@@ -281,6 +281,7 @@ uint64_t EmitNamedTrack(uint64_t parent_uuid, const char* name, uint64_t id, + bool is_name_static, perfetto::shlib::TrackEventIncrementalState* incr_state, perfetto::TraceWriterBase* trace_writer) { uint64_t uuid = parent_uuid; @@ -293,7 +294,11 @@ if (parent_uuid) { track_descriptor->set_parent_uuid(parent_uuid); } - track_descriptor->set_name(name); + if (is_name_static) { + track_descriptor->set_static_name(name); + } else { + track_descriptor->set_name(name); + } } return uuid; } @@ -460,7 +465,8 @@ track)) { auto* named_track = std::get<const PerfettoTeHlExtraNamedTrack*>(track); track_uuid = EmitNamedTrack(named_track->parent_uuid, named_track->name, - named_track->id, incr_state, trace_writer); + named_track->id, named_track->is_name_static, + incr_state, trace_writer); } else if (std::holds_alternative<const PerfettoTeHlExtraProtoTrack*>( track)) { auto* proto_track = std::get<const PerfettoTeHlExtraProtoTrack*>(track); @@ -481,8 +487,10 @@ case PERFETTO_TE_HL_NESTED_TRACK_TYPE_NAMED: { auto* named_track = reinterpret_cast<PerfettoTeHlNestedTrackNamed*>(*tp); + // Currently static names for nested tracks is not supported. uuid = EmitNamedTrack(uuid, named_track->name, named_track->id, - incr_state, trace_writer); + /*is_name_static_=*/false, incr_state, + trace_writer); } break; case PERFETTO_TE_HL_NESTED_TRACK_TYPE_PROCESS: { uuid = perfetto_te_process_track_uuid;