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

Commit f31dc9a6 authored by Zimuzo Ezeozue's avatar Zimuzo Ezeozue Committed by Gerrit Code Review
Browse files

Merge "Populate binder trace txn names lazily"

parents da1c78d1 b0d5d53f
Loading
Loading
Loading
Loading
+23 −18
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Modifier;
import java.util.concurrent.atomic.AtomicReferenceArray;

/**
 * Base class for a remotable object, the core part of a lightweight
@@ -291,7 +292,7 @@ public class Binder implements IBinder {
    private IInterface mOwner;
    @Nullable
    private String mDescriptor;
    private volatile String[] mTransactionTraceNames = null;
    private volatile AtomicReferenceArray<String> mTransactionTraceNames = null;
    private volatile String mSimpleDescriptor = null;
    private static final int TRANSACTION_TRACE_NAME_ID_LIMIT = 1024;

@@ -895,28 +896,32 @@ public class Binder implements IBinder {
    @VisibleForTesting
    public final @NonNull String getTransactionTraceName(int transactionCode) {
        if (mTransactionTraceNames == null) {
            final String descriptor = getSimpleDescriptor();
            final int highestId = Math.min(getMaxTransactionId(), TRANSACTION_TRACE_NAME_ID_LIMIT);
            final String[] transactionNames = new String[highestId + 1];
            mSimpleDescriptor = getSimpleDescriptor();
            mTransactionTraceNames = new AtomicReferenceArray(highestId + 1);
        }

        final int index = transactionCode - FIRST_CALL_TRANSACTION;
        if (index < 0 || index >= mTransactionTraceNames.length()) {
            return mSimpleDescriptor + "#" + transactionCode;
        }

        String transactionTraceName = mTransactionTraceNames.getAcquire(index);
        if (transactionTraceName == null) {
            final String transactionName = getTransactionName(transactionCode);
            final StringBuffer buf = new StringBuffer();
            for (int i = 0; i <= highestId; i++) {
                String transactionName = getTransactionName(i + FIRST_CALL_TRANSACTION);

            if (transactionName != null) {
                    buf.append(descriptor).append(':').append(transactionName);
                buf.append(mSimpleDescriptor).append(":").append(transactionName);
            } else {
                    buf.append(descriptor).append('#').append(i + FIRST_CALL_TRANSACTION);
                buf.append(mSimpleDescriptor).append("#").append(transactionCode);
            }
                transactionNames[i] = buf.toString();
                buf.setLength(0);
            }
            mSimpleDescriptor = descriptor;
            mTransactionTraceNames = transactionNames;
        }
        final int index = transactionCode - FIRST_CALL_TRANSACTION;
        if (index < 0 || index >= mTransactionTraceNames.length) {
            return mSimpleDescriptor + "#" + transactionCode;

            transactionTraceName = buf.toString();
            mTransactionTraceNames.setRelease(index, transactionTraceName);
        }
        return mTransactionTraceNames[index];

        return transactionTraceName;
    }

    private @NonNull String getSimpleDescriptor() {