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

Commit db48957f authored by Nicolò Mazzucato's avatar Nicolò Mazzucato Committed by Android (Google) Code Review
Browse files

Merge "Add traceSyncAndAsync and traceAsyncClosable" into main

parents f43613de a9df4a50
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.app.tracing

import android.annotation.SuppressLint
import android.os.Trace
import com.android.app.tracing.TrackGroupUtils.trackGroup
import com.android.app.tracing.coroutines.traceCoroutine
import java.util.concurrent.ThreadLocalRandom
import kotlin.contracts.ExperimentalContracts
@@ -238,4 +239,31 @@ public object TraceUtils {
            block()
        }
    }

    /** Starts an async slice, and returns a runnable that stops the slice. */
    @JvmStatic
    public fun traceAsyncClosable(
        traceTag: Long = Trace.TRACE_TAG_APP,
        trackName: String,
        sliceName: String,
    ): () -> Unit {
        val cookie = ThreadLocalRandom.current().nextInt()
        Trace.asyncTraceForTrackBegin(traceTag, trackName, sliceName, cookie)
        return { Trace.asyncTraceForTrackEnd(traceTag, trackName, cookie) }
    }

    /** Starts an async slice, and returns a runnable that stops the slice. */
    @JvmStatic
    @JvmOverloads
    public fun traceAsyncClosable(
        traceTag: Long = Trace.TRACE_TAG_APP,
        trackGroupName: String,
        trackName: String,
        sliceName: String,
    ): () -> Unit {
        val groupedTrackName = trackGroup(trackGroupName, trackName)
        val cookie = ThreadLocalRandom.current().nextInt()
        Trace.asyncTraceForTrackBegin(traceTag, groupedTrackName, sliceName, cookie)
        return { Trace.asyncTraceForTrackEnd(traceTag, groupedTrackName, cookie) }
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -27,5 +27,6 @@ public object TrackGroupUtils {
     * "shade" related tracks will appear together, under the "shade" track in the process
     * workspace).
     */
    @JvmStatic
    public fun trackGroup(groupName: String, trackName: String): String = "$groupName##$trackName"
}
+24 −0
Original line number Diff line number Diff line
@@ -77,6 +77,20 @@ public class TrackTracer(
        return Closeable { Trace.asyncTraceForTrackEnd(traceTag, trackName, cookie) }
    }

    /** Traces [block] both sync and async. */
    public fun traceSyncAndAsync(sliceName: () -> String, block: () -> Unit) {
        contract {
            callsInPlace(block, InvocationKind.EXACTLY_ONCE)
            callsInPlace(sliceName, InvocationKind.AT_MOST_ONCE)
        }
        if (Trace.isEnabled()) {
            val name = sliceName()
            TraceUtils.trace(name) { traceAsync(name, block) }
        } else {
            block()
        }
    }

    public companion object {
        /**
         * Creates an instant event for a track called [trackName] inside [groupName]. See
@@ -87,6 +101,16 @@ public class TrackTracer(
            Trace.traceCounter(Trace.TRACE_TAG_APP, trackGroup(groupName, trackName), i)
        }

        /**
         * Creates an instant event for a track called [trackName] inside [groupName]. See
         * [trackGroup] for details on how the rendering in groups works.
         */
        @JvmStatic
        public fun instantForGroup(groupName: String, trackName: String, event: () -> String) {
            if (!Trace.isEnabled()) return
            Trace.instantForTrack(Trace.TRACE_TAG_APP, trackGroup(groupName, trackName), event())
        }

        /** Creates an instant event for [groupName] grgorp, see [instantForGroup]. */
        @JvmStatic
        public inline fun instantForGroup(groupName: String, trackName: () -> String, i: Int) {