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

Commit 8594b224 authored by Pablo Gamito's avatar Pablo Gamito Committed by Android (Google) Code Review
Browse files

Merge "Use single accumulating shell transition handler mapping" into main

parents c68003cd 126ad606
Loading
Loading
Loading
Loading
+1 −23
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package android.tracing.transition;

import android.tracing.perfetto.CreateTlsStateArgs;
import android.tracing.perfetto.DataSource;
import android.tracing.perfetto.DataSourceInstance;
import android.tracing.perfetto.FlushCallbackArguments;
@@ -24,23 +23,17 @@ import android.tracing.perfetto.StartCallbackArguments;
import android.tracing.perfetto.StopCallbackArguments;
import android.util.proto.ProtoInputStream;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @hide
 */
public class TransitionDataSource
        extends DataSource<DataSourceInstance, TransitionDataSource.TlsState, Void> {
        extends DataSource<DataSourceInstance, Void, Void> {
    public static String DATA_SOURCE_NAME = "com.android.wm.shell.transition";

    private final Runnable mOnStartStaticCallback;
    private final Runnable mOnFlushStaticCallback;
    private final Runnable mOnStopStaticCallback;

    private final ConcurrentHashMap<Integer, ConcurrentHashMap<String, Integer>> mHandlerMappings =
            new ConcurrentHashMap<>();

    public TransitionDataSource(Runnable onStart, Runnable onFlush, Runnable onStop) {
        super(DATA_SOURCE_NAME);
        this.mOnStartStaticCallback = onStart;
@@ -48,20 +41,6 @@ public class TransitionDataSource
        this.mOnStopStaticCallback = onStop;
    }

    @Override
    protected TlsState createTlsState(CreateTlsStateArgs<DataSourceInstance> args) {
        return new TlsState(args.getDataSourceInstanceLocked().getInstanceIndex());
    }

    public class TlsState {
        public final Map<String, Integer> handlerMapping;

        public TlsState(int instanceIndex) {
            handlerMapping = mHandlerMappings
                    .computeIfAbsent(instanceIndex, index -> new ConcurrentHashMap<>());
        }
    }

    @Override
    public DataSourceInstance createInstance(ProtoInputStream configStream, int instanceIndex) {
        return new DataSourceInstance(this, instanceIndex) {
@@ -78,7 +57,6 @@ public class TransitionDataSource
            @Override
            protected void onStop(StopCallbackArguments args) {
                mOnStopStaticCallback.run();
                mHandlerMappings.remove(instanceIndex);
            }
        };
    }
+16 −25
Original line number Diff line number Diff line
@@ -19,16 +19,15 @@ package com.android.wm.shell.transition.tracing;
import android.internal.perfetto.protos.PerfettoTrace;
import android.os.SystemClock;
import android.os.Trace;
import android.tracing.perfetto.DataSourceInstance;
import android.tracing.perfetto.DataSourceParams;
import android.tracing.perfetto.InitArguments;
import android.tracing.perfetto.Producer;
import android.tracing.perfetto.TracingContext;
import android.tracing.transition.TransitionDataSource;
import android.util.proto.ProtoOutputStream;

import com.android.wm.shell.transition.Transitions;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

@@ -41,6 +40,7 @@ public class PerfettoTransitionTracer implements TransitionTracer {
            mActiveTraces::incrementAndGet,
            this::onFlush,
            mActiveTraces::decrementAndGet);
    private final Map<String, Integer> mHandlerMapping = new HashMap<>();

    public PerfettoTransitionTracer() {
        Producer.init(InitArguments.DEFAULTS);
@@ -69,7 +69,7 @@ public class PerfettoTransitionTracer implements TransitionTracer {

    private void doLogDispatched(int transitionId, Transitions.TransitionHandler handler) {
        mDataSource.trace(ctx -> {
            final int handlerId = getHandlerId(handler, ctx);
            final int handlerId = getHandlerId(handler);

            final ProtoOutputStream os = ctx.newTracePacket();
            final long token = os.start(PerfettoTrace.TracePacket.SHELL_TRANSITION);
@@ -81,17 +81,16 @@ public class PerfettoTransitionTracer implements TransitionTracer {
        });
    }

    private static int getHandlerId(Transitions.TransitionHandler handler,
            TracingContext<DataSourceInstance, TransitionDataSource.TlsState, Void> ctx) {
        final Map<String, Integer> handlerMapping =
                ctx.getCustomTlsState().handlerMapping;
    private int getHandlerId(Transitions.TransitionHandler handler) {
        final int handlerId;
        if (handlerMapping.containsKey(handler.getClass().getName())) {
            handlerId = handlerMapping.get(handler.getClass().getName());
        synchronized (mHandlerMapping) {
            if (mHandlerMapping.containsKey(handler.getClass().getName())) {
                handlerId = mHandlerMapping.get(handler.getClass().getName());
            } else {
                // + 1 to avoid 0 ids which can be confused with missing value when dumped to proto
            handlerId = handlerMapping.size() + 1;
            handlerMapping.put(handler.getClass().getName(), handlerId);
                handlerId = mHandlerMapping.size() + 1;
                mHandlerMapping.put(handler.getClass().getName(), handlerId);
            }
        }
        return handlerId;
    }
@@ -194,22 +193,14 @@ public class PerfettoTransitionTracer implements TransitionTracer {
    }

    private void onFlush() {
        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "onFlush");
        try {
            doOnFlush();
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
        }
    }

    private void doOnFlush() {
        mDataSource.trace(ctx -> {
            final ProtoOutputStream os = ctx.newTracePacket();

            final Map<String, Integer> handlerMapping = ctx.getCustomTlsState().handlerMapping;
            for (String handler : handlerMapping.keySet()) {
            for (Map.Entry<String, Integer> entry : mHandlerMapping.entrySet()) {
                final String handler = entry.getKey();
                final int handlerId = entry.getValue();
                final long token = os.start(PerfettoTrace.TracePacket.SHELL_HANDLER_MAPPINGS);
                os.write(PerfettoTrace.ShellHandlerMapping.ID, handlerMapping.get(handler));
                os.write(PerfettoTrace.ShellHandlerMapping.ID, handlerId);
                os.write(PerfettoTrace.ShellHandlerMapping.NAME, handler);
                os.end(token);
            }