Merge "Populate binder trace txn names lazily"

This commit is contained in:
Zimuzo Ezeozue
2022-10-19 17:09:25 +00:00
committed by Gerrit Code Review

View File

@@ -45,6 +45,7 @@ import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.util.concurrent.atomic.AtomicReferenceArray;
/** /**
* Base class for a remotable object, the core part of a lightweight * Base class for a remotable object, the core part of a lightweight
@@ -291,7 +292,7 @@ public class Binder implements IBinder {
private IInterface mOwner; private IInterface mOwner;
@Nullable @Nullable
private String mDescriptor; private String mDescriptor;
private volatile String[] mTransactionTraceNames = null; private volatile AtomicReferenceArray<String> mTransactionTraceNames = null;
private volatile String mSimpleDescriptor = null; private volatile String mSimpleDescriptor = null;
private static final int TRANSACTION_TRACE_NAME_ID_LIMIT = 1024; private static final int TRANSACTION_TRACE_NAME_ID_LIMIT = 1024;
@@ -895,28 +896,32 @@ public class Binder implements IBinder {
@VisibleForTesting @VisibleForTesting
public final @NonNull String getTransactionTraceName(int transactionCode) { public final @NonNull String getTransactionTraceName(int transactionCode) {
if (mTransactionTraceNames == null) { if (mTransactionTraceNames == null) {
final String descriptor = getSimpleDescriptor();
final int highestId = Math.min(getMaxTransactionId(), TRANSACTION_TRACE_NAME_ID_LIMIT); final int highestId = Math.min(getMaxTransactionId(), TRANSACTION_TRACE_NAME_ID_LIMIT);
final String[] transactionNames = new String[highestId + 1]; mSimpleDescriptor = getSimpleDescriptor();
final StringBuffer buf = new StringBuffer(); mTransactionTraceNames = new AtomicReferenceArray(highestId + 1);
for (int i = 0; i <= highestId; i++) {
String transactionName = getTransactionName(i + FIRST_CALL_TRANSACTION);
if (transactionName != null) {
buf.append(descriptor).append(':').append(transactionName);
} else {
buf.append(descriptor).append('#').append(i + FIRST_CALL_TRANSACTION);
}
transactionNames[i] = buf.toString();
buf.setLength(0);
}
mSimpleDescriptor = descriptor;
mTransactionTraceNames = transactionNames;
} }
final int index = transactionCode - FIRST_CALL_TRANSACTION; final int index = transactionCode - FIRST_CALL_TRANSACTION;
if (index < 0 || index >= mTransactionTraceNames.length) { if (index < 0 || index >= mTransactionTraceNames.length()) {
return mSimpleDescriptor + "#" + transactionCode; return mSimpleDescriptor + "#" + transactionCode;
} }
return mTransactionTraceNames[index];
String transactionTraceName = mTransactionTraceNames.getAcquire(index);
if (transactionTraceName == null) {
final String transactionName = getTransactionName(transactionCode);
final StringBuffer buf = new StringBuffer();
if (transactionName != null) {
buf.append(mSimpleDescriptor).append(":").append(transactionName);
} else {
buf.append(mSimpleDescriptor).append("#").append(transactionCode);
}
transactionTraceName = buf.toString();
mTransactionTraceNames.setRelease(index, transactionTraceName);
}
return transactionTraceName;
} }
private @NonNull String getSimpleDescriptor() { private @NonNull String getSimpleDescriptor() {