Loading core/java/android/tracing/perfetto/DataSource.java +15 −3 Original line number Diff line number Diff line Loading @@ -16,8 +16,8 @@ package android.tracing.perfetto; import android.annotation.Nullable; import android.annotation.NonNull; import android.annotation.Nullable; import android.util.proto.ProtoInputStream; /** Loading Loading @@ -135,7 +135,7 @@ public abstract class DataSource<DataSourceInstanceType extends DataSourceInstan */ public void register(DataSourceParams params) { nativeRegisterDataSource(this.mNativeObj, params.bufferExhaustedPolicy, params.willNotifyOnStop, params.noFlush); params.willNotifyOnStop, params.noFlush, params.postponeStop); } /** Loading Loading @@ -170,8 +170,17 @@ public abstract class DataSource<DataSourceInstanceType extends DataSourceInstan return this.createInstance(inputStream, instanceIndex); } /** * Stop the datasource instance at the specified index (whose stop operation was previously * postponed with DataSourceParams#postponeStop). */ protected void stopDoneDataSourceInstance(int instanceIndex) { nativeStopDonePerfettoInstanceLocked(mNativeObj, instanceIndex); } private static native void nativeRegisterDataSource(long dataSourcePtr, int bufferExhaustedPolicy, boolean willNotifyOnStop, boolean noFlush); int bufferExhaustedPolicy, boolean willNotifyOnStop, boolean noFlush, boolean postponeStop); private static native long nativeCreate(DataSource thiz, String name); private static native void nativeFlushAll(long nativeDataSourcePointer); Loading @@ -182,6 +191,9 @@ public abstract class DataSource<DataSourceInstanceType extends DataSourceInstan private static native void nativeReleasePerfettoInstanceLocked( long dataSourcePtr, int dsInstanceIdx); private static native void nativeStopDonePerfettoInstanceLocked( long dataSourcePtr, int dsInstanceIdx); private static native boolean nativePerfettoDsTraceIterateBegin(long dataSourcePtr); private static native boolean nativePerfettoDsTraceIterateNext(long dataSourcePtr); private static native void nativePerfettoDsTraceIterateBreak(long dataSourcePtr); Loading core/java/android/tracing/perfetto/DataSourceInstance.java +8 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,14 @@ public abstract class DataSourceInstance implements AutoCloseable { */ protected void onStop(StopCallbackArguments args) {} /** * Stop the data source instance (whose stop operation was previously postponed * with DataSourceParams#postponeStop). */ public void stopDone() { mDataSource.stopDoneDataSourceInstance(mInstanceIndex); } @Override public final void close() { this.release(); Loading core/java/android/tracing/perfetto/DataSourceParams.java +17 −3 Original line number Diff line number Diff line Loading @@ -49,15 +49,17 @@ public class DataSourceParams { public static DataSourceParams DEFAULTS = new DataSourceParams.Builder().build(); private DataSourceParams(@PerfettoDsBufferExhausted int bufferExhaustedPolicy, boolean willNotifyOnStop, boolean noFlush) { boolean willNotifyOnStop, boolean noFlush, boolean postponeStop) { this.bufferExhaustedPolicy = bufferExhaustedPolicy; this.willNotifyOnStop = willNotifyOnStop; this.noFlush = noFlush; this.postponeStop = postponeStop; } public final @PerfettoDsBufferExhausted int bufferExhaustedPolicy; public final boolean willNotifyOnStop; public final boolean noFlush; public final boolean postponeStop; /** * DataSource Parameters builder Loading Loading @@ -96,17 +98,29 @@ public class DataSourceParams { return this; } /** * Tells the tracing service to postpone the stopping of a data source instance. * * The client is then responsible to finalize the data source stop by calling * DataSourceInstance#stopDone(). */ public Builder setPostponeStop(boolean value) { this.mPostponeStop = value; return this; } /** * Build the DataSource parameters. */ public DataSourceParams build() { return new DataSourceParams( this.mBufferExhaustedPolicy, this.mWillNotifyOnStop, this.mNoFlush); return new DataSourceParams(this.mBufferExhaustedPolicy, this.mWillNotifyOnStop, this.mNoFlush, this.mPostponeStop); } private @PerfettoDsBufferExhausted int mBufferExhaustedPolicy = PERFETTO_DS_BUFFER_EXHAUSTED_POLICY_DROP; private boolean mWillNotifyOnStop = true; private boolean mNoFlush = false; private boolean mPostponeStop = false; } } core/java/android/tracing/perfetto/TracingContext.java +8 −0 Original line number Diff line number Diff line Loading @@ -96,6 +96,14 @@ public class TracingContext<DataSourceInstanceType extends DataSourceInstance, T return incrementalState; } /** * Stop the data source instance (whose stop operation was previously postponed * with DataSourceParams#postponeStop). */ public void stopDone() { mDataSource.stopDoneDataSourceInstance(mInstanceIndex); } protected byte[][] getAndClearAllPendingTracePackets() { byte[][] res = new byte[mTracePackets.size()][]; for (int i = 0; i < mTracePackets.size(); i++) { Loading core/jni/android_tracing_PerfettoDataSource.cpp +38 −20 Original line number Diff line number Diff line Loading @@ -258,20 +258,9 @@ void nativeFlushAll(JNIEnv* env, jclass clazz, jlong ptr) { datasource->flushAll(); } void nativeRegisterDataSource(JNIEnv* env, jclass clazz, jlong datasource_ptr, jint buffer_exhausted_policy, jboolean will_notify_on_stop, jboolean no_flush) { sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(datasource_ptr); struct PerfettoDsParams params = PerfettoDsParamsDefault(); params.will_notify_on_stop = will_notify_on_stop; params.buffer_exhausted_policy = (PerfettoDsBufferExhaustedPolicy)buffer_exhausted_policy; params.user_arg = reinterpret_cast<void*>(datasource.get()); params.on_setup_cb = [](struct PerfettoDsImpl*, PerfettoDsInstanceIndex inst_id, void* ds_config, size_t ds_config_size, void* user_arg, struct PerfettoDsOnSetupArgs*) -> void* { template <bool PostponeStop> void* onSetupCb(struct PerfettoDsImpl*, PerfettoDsInstanceIndex inst_id, void* ds_config, size_t ds_config_size, void* user_arg, struct PerfettoDsOnSetupArgs*) { JNIEnv* env = GetOrAttachJNIEnvironment(gVm, JNI_VERSION_1_6); auto* datasource = reinterpret_cast<PerfettoDataSource*>(user_arg); Loading @@ -281,11 +270,28 @@ void nativeRegisterDataSource(JNIEnv* env, jclass clazz, jlong datasource_ptr, ds_config_size, inst_id)); auto* datasource_instance = new PerfettoDataSourceInstance(env, java_data_source_instance.get(), inst_id); auto* datasource_instance = new PerfettoDataSourceInstance(env, java_data_source_instance.get(), inst_id, PostponeStop); return static_cast<void*>(datasource_instance); }; void nativeRegisterDataSource(JNIEnv* env, jclass clazz, jlong datasource_ptr, jint buffer_exhausted_policy, jboolean will_notify_on_stop, jboolean no_flush, jboolean postpone_stop) { sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(datasource_ptr); struct PerfettoDsParams params = PerfettoDsParamsDefault(); params.will_notify_on_stop = will_notify_on_stop; params.buffer_exhausted_policy = (PerfettoDsBufferExhaustedPolicy)buffer_exhausted_policy; params.user_arg = reinterpret_cast<void*>(datasource.get()); if (postpone_stop == JNI_TRUE) { params.on_setup_cb = onSetupCb<true>; } else { params.on_setup_cb = onSetupCb<false>; } params.on_create_tls_cb = [](struct PerfettoDsImpl* ds_impl, PerfettoDsInstanceIndex inst_id, struct PerfettoDsTracerImpl* tracer, void* user_arg) -> void* { // Populated later and only if required by the java side Loading Loading @@ -341,11 +347,11 @@ void nativeRegisterDataSource(JNIEnv* env, jclass clazz, jlong datasource_ptr, } params.on_stop_cb = [](struct PerfettoDsImpl*, PerfettoDsInstanceIndex inst_id, void* user_arg, void* inst_ctx, struct PerfettoDsOnStopArgs*) { void* inst_ctx, struct PerfettoDsOnStopArgs* args) { JNIEnv* env = GetOrAttachJNIEnvironment(gVm, JNI_VERSION_1_6); auto* datasource_instance = static_cast<PerfettoDataSourceInstance*>(inst_ctx); datasource_instance->onStop(env); datasource_instance->onStop(env, args); }; params.on_destroy_cb = [](struct PerfettoDsImpl* ds_impl, void* user_arg, Loading Loading @@ -380,6 +386,16 @@ void nativeReleasePerfettoInstanceLocked(JNIEnv* /* env */, jclass /* clazz */, PerfettoDsImplReleaseInstanceLocked(datasource->dataSource.impl, instance_idx); } void nativeStopDonePerfettoInstanceLocked(JNIEnv* /* env */, jclass /* clazz */, jlong dataSourcePtr, PerfettoDsInstanceIndex instance_idx) { sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(dataSourcePtr); auto* datasource_instance = static_cast<PerfettoDataSourceInstance*>( PerfettoDsImplGetInstanceLocked(datasource->dataSource.impl, instance_idx)); datasource_instance->stopDone(); PerfettoDsImplReleaseInstanceLocked(datasource->dataSource.impl, instance_idx); } bool nativePerfettoDsTraceIterateBegin(JNIEnv* /* env */, jclass /* clazz */, jlong dataSourcePtr) { sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(dataSourcePtr); return datasource->TraceIterateBegin(); Loading Loading @@ -429,11 +445,13 @@ const JNINativeMethod gMethods[] = { (void*)nativeCreate}, {"nativeFlushAll", "(J)V", (void*)nativeFlushAll}, {"nativeGetFinalizer", "()J", (void*)nativeGetFinalizer}, {"nativeRegisterDataSource", "(JIZZ)V", (void*)nativeRegisterDataSource}, {"nativeRegisterDataSource", "(JIZZZ)V", (void*)nativeRegisterDataSource}, {"nativeGetPerfettoInstanceLocked", "(JI)Landroid/tracing/perfetto/DataSourceInstance;", (void*)nativeGetPerfettoInstanceLocked}, {"nativeReleasePerfettoInstanceLocked", "(JI)V", (void*)nativeReleasePerfettoInstanceLocked}, {"nativeStopDonePerfettoInstanceLocked", "(JI)V", (void*)nativeStopDonePerfettoInstanceLocked}, {"nativePerfettoDsTraceIterateBegin", "(J)Z", (void*)nativePerfettoDsTraceIterateBegin}, {"nativePerfettoDsTraceIterateNext", "(J)Z", (void*)nativePerfettoDsTraceIterateNext}, Loading Loading
core/java/android/tracing/perfetto/DataSource.java +15 −3 Original line number Diff line number Diff line Loading @@ -16,8 +16,8 @@ package android.tracing.perfetto; import android.annotation.Nullable; import android.annotation.NonNull; import android.annotation.Nullable; import android.util.proto.ProtoInputStream; /** Loading Loading @@ -135,7 +135,7 @@ public abstract class DataSource<DataSourceInstanceType extends DataSourceInstan */ public void register(DataSourceParams params) { nativeRegisterDataSource(this.mNativeObj, params.bufferExhaustedPolicy, params.willNotifyOnStop, params.noFlush); params.willNotifyOnStop, params.noFlush, params.postponeStop); } /** Loading Loading @@ -170,8 +170,17 @@ public abstract class DataSource<DataSourceInstanceType extends DataSourceInstan return this.createInstance(inputStream, instanceIndex); } /** * Stop the datasource instance at the specified index (whose stop operation was previously * postponed with DataSourceParams#postponeStop). */ protected void stopDoneDataSourceInstance(int instanceIndex) { nativeStopDonePerfettoInstanceLocked(mNativeObj, instanceIndex); } private static native void nativeRegisterDataSource(long dataSourcePtr, int bufferExhaustedPolicy, boolean willNotifyOnStop, boolean noFlush); int bufferExhaustedPolicy, boolean willNotifyOnStop, boolean noFlush, boolean postponeStop); private static native long nativeCreate(DataSource thiz, String name); private static native void nativeFlushAll(long nativeDataSourcePointer); Loading @@ -182,6 +191,9 @@ public abstract class DataSource<DataSourceInstanceType extends DataSourceInstan private static native void nativeReleasePerfettoInstanceLocked( long dataSourcePtr, int dsInstanceIdx); private static native void nativeStopDonePerfettoInstanceLocked( long dataSourcePtr, int dsInstanceIdx); private static native boolean nativePerfettoDsTraceIterateBegin(long dataSourcePtr); private static native boolean nativePerfettoDsTraceIterateNext(long dataSourcePtr); private static native void nativePerfettoDsTraceIterateBreak(long dataSourcePtr); Loading
core/java/android/tracing/perfetto/DataSourceInstance.java +8 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,14 @@ public abstract class DataSourceInstance implements AutoCloseable { */ protected void onStop(StopCallbackArguments args) {} /** * Stop the data source instance (whose stop operation was previously postponed * with DataSourceParams#postponeStop). */ public void stopDone() { mDataSource.stopDoneDataSourceInstance(mInstanceIndex); } @Override public final void close() { this.release(); Loading
core/java/android/tracing/perfetto/DataSourceParams.java +17 −3 Original line number Diff line number Diff line Loading @@ -49,15 +49,17 @@ public class DataSourceParams { public static DataSourceParams DEFAULTS = new DataSourceParams.Builder().build(); private DataSourceParams(@PerfettoDsBufferExhausted int bufferExhaustedPolicy, boolean willNotifyOnStop, boolean noFlush) { boolean willNotifyOnStop, boolean noFlush, boolean postponeStop) { this.bufferExhaustedPolicy = bufferExhaustedPolicy; this.willNotifyOnStop = willNotifyOnStop; this.noFlush = noFlush; this.postponeStop = postponeStop; } public final @PerfettoDsBufferExhausted int bufferExhaustedPolicy; public final boolean willNotifyOnStop; public final boolean noFlush; public final boolean postponeStop; /** * DataSource Parameters builder Loading Loading @@ -96,17 +98,29 @@ public class DataSourceParams { return this; } /** * Tells the tracing service to postpone the stopping of a data source instance. * * The client is then responsible to finalize the data source stop by calling * DataSourceInstance#stopDone(). */ public Builder setPostponeStop(boolean value) { this.mPostponeStop = value; return this; } /** * Build the DataSource parameters. */ public DataSourceParams build() { return new DataSourceParams( this.mBufferExhaustedPolicy, this.mWillNotifyOnStop, this.mNoFlush); return new DataSourceParams(this.mBufferExhaustedPolicy, this.mWillNotifyOnStop, this.mNoFlush, this.mPostponeStop); } private @PerfettoDsBufferExhausted int mBufferExhaustedPolicy = PERFETTO_DS_BUFFER_EXHAUSTED_POLICY_DROP; private boolean mWillNotifyOnStop = true; private boolean mNoFlush = false; private boolean mPostponeStop = false; } }
core/java/android/tracing/perfetto/TracingContext.java +8 −0 Original line number Diff line number Diff line Loading @@ -96,6 +96,14 @@ public class TracingContext<DataSourceInstanceType extends DataSourceInstance, T return incrementalState; } /** * Stop the data source instance (whose stop operation was previously postponed * with DataSourceParams#postponeStop). */ public void stopDone() { mDataSource.stopDoneDataSourceInstance(mInstanceIndex); } protected byte[][] getAndClearAllPendingTracePackets() { byte[][] res = new byte[mTracePackets.size()][]; for (int i = 0; i < mTracePackets.size(); i++) { Loading
core/jni/android_tracing_PerfettoDataSource.cpp +38 −20 Original line number Diff line number Diff line Loading @@ -258,20 +258,9 @@ void nativeFlushAll(JNIEnv* env, jclass clazz, jlong ptr) { datasource->flushAll(); } void nativeRegisterDataSource(JNIEnv* env, jclass clazz, jlong datasource_ptr, jint buffer_exhausted_policy, jboolean will_notify_on_stop, jboolean no_flush) { sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(datasource_ptr); struct PerfettoDsParams params = PerfettoDsParamsDefault(); params.will_notify_on_stop = will_notify_on_stop; params.buffer_exhausted_policy = (PerfettoDsBufferExhaustedPolicy)buffer_exhausted_policy; params.user_arg = reinterpret_cast<void*>(datasource.get()); params.on_setup_cb = [](struct PerfettoDsImpl*, PerfettoDsInstanceIndex inst_id, void* ds_config, size_t ds_config_size, void* user_arg, struct PerfettoDsOnSetupArgs*) -> void* { template <bool PostponeStop> void* onSetupCb(struct PerfettoDsImpl*, PerfettoDsInstanceIndex inst_id, void* ds_config, size_t ds_config_size, void* user_arg, struct PerfettoDsOnSetupArgs*) { JNIEnv* env = GetOrAttachJNIEnvironment(gVm, JNI_VERSION_1_6); auto* datasource = reinterpret_cast<PerfettoDataSource*>(user_arg); Loading @@ -281,11 +270,28 @@ void nativeRegisterDataSource(JNIEnv* env, jclass clazz, jlong datasource_ptr, ds_config_size, inst_id)); auto* datasource_instance = new PerfettoDataSourceInstance(env, java_data_source_instance.get(), inst_id); auto* datasource_instance = new PerfettoDataSourceInstance(env, java_data_source_instance.get(), inst_id, PostponeStop); return static_cast<void*>(datasource_instance); }; void nativeRegisterDataSource(JNIEnv* env, jclass clazz, jlong datasource_ptr, jint buffer_exhausted_policy, jboolean will_notify_on_stop, jboolean no_flush, jboolean postpone_stop) { sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(datasource_ptr); struct PerfettoDsParams params = PerfettoDsParamsDefault(); params.will_notify_on_stop = will_notify_on_stop; params.buffer_exhausted_policy = (PerfettoDsBufferExhaustedPolicy)buffer_exhausted_policy; params.user_arg = reinterpret_cast<void*>(datasource.get()); if (postpone_stop == JNI_TRUE) { params.on_setup_cb = onSetupCb<true>; } else { params.on_setup_cb = onSetupCb<false>; } params.on_create_tls_cb = [](struct PerfettoDsImpl* ds_impl, PerfettoDsInstanceIndex inst_id, struct PerfettoDsTracerImpl* tracer, void* user_arg) -> void* { // Populated later and only if required by the java side Loading Loading @@ -341,11 +347,11 @@ void nativeRegisterDataSource(JNIEnv* env, jclass clazz, jlong datasource_ptr, } params.on_stop_cb = [](struct PerfettoDsImpl*, PerfettoDsInstanceIndex inst_id, void* user_arg, void* inst_ctx, struct PerfettoDsOnStopArgs*) { void* inst_ctx, struct PerfettoDsOnStopArgs* args) { JNIEnv* env = GetOrAttachJNIEnvironment(gVm, JNI_VERSION_1_6); auto* datasource_instance = static_cast<PerfettoDataSourceInstance*>(inst_ctx); datasource_instance->onStop(env); datasource_instance->onStop(env, args); }; params.on_destroy_cb = [](struct PerfettoDsImpl* ds_impl, void* user_arg, Loading Loading @@ -380,6 +386,16 @@ void nativeReleasePerfettoInstanceLocked(JNIEnv* /* env */, jclass /* clazz */, PerfettoDsImplReleaseInstanceLocked(datasource->dataSource.impl, instance_idx); } void nativeStopDonePerfettoInstanceLocked(JNIEnv* /* env */, jclass /* clazz */, jlong dataSourcePtr, PerfettoDsInstanceIndex instance_idx) { sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(dataSourcePtr); auto* datasource_instance = static_cast<PerfettoDataSourceInstance*>( PerfettoDsImplGetInstanceLocked(datasource->dataSource.impl, instance_idx)); datasource_instance->stopDone(); PerfettoDsImplReleaseInstanceLocked(datasource->dataSource.impl, instance_idx); } bool nativePerfettoDsTraceIterateBegin(JNIEnv* /* env */, jclass /* clazz */, jlong dataSourcePtr) { sp<PerfettoDataSource> datasource = reinterpret_cast<PerfettoDataSource*>(dataSourcePtr); return datasource->TraceIterateBegin(); Loading Loading @@ -429,11 +445,13 @@ const JNINativeMethod gMethods[] = { (void*)nativeCreate}, {"nativeFlushAll", "(J)V", (void*)nativeFlushAll}, {"nativeGetFinalizer", "()J", (void*)nativeGetFinalizer}, {"nativeRegisterDataSource", "(JIZZ)V", (void*)nativeRegisterDataSource}, {"nativeRegisterDataSource", "(JIZZZ)V", (void*)nativeRegisterDataSource}, {"nativeGetPerfettoInstanceLocked", "(JI)Landroid/tracing/perfetto/DataSourceInstance;", (void*)nativeGetPerfettoInstanceLocked}, {"nativeReleasePerfettoInstanceLocked", "(JI)V", (void*)nativeReleasePerfettoInstanceLocked}, {"nativeStopDonePerfettoInstanceLocked", "(JI)V", (void*)nativeStopDonePerfettoInstanceLocked}, {"nativePerfettoDsTraceIterateBegin", "(J)Z", (void*)nativePerfettoDsTraceIterateBegin}, {"nativePerfettoDsTraceIterateNext", "(J)Z", (void*)nativePerfettoDsTraceIterateNext}, Loading