Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7ed3b2ef authored by Kean Mariotti's avatar Kean Mariotti Committed by Android (Google) Code Review
Browse files

Merge "perfetto java api: extend to support postponed stop" into main

parents d302de78 ac3ef7d6
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -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;

/**
@@ -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);
    }

    /**
@@ -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);
@@ -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);
+8 −0
Original line number Diff line number Diff line
@@ -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();
+17 −3
Original line number Diff line number Diff line
@@ -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
@@ -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;
    }
}
+8 −0
Original line number Diff line number Diff line
@@ -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++) {
+38 −20
Original line number Diff line number Diff line
@@ -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);
@@ -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
@@ -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,
@@ -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();
@@ -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