summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Zimuzo Ezeozue <zezeozue@google.com> 2022-10-19 17:47:13 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2022-10-19 17:47:13 +0000
commitaab9d2dba5cd3d18fe369e6066b525618daf35b1 (patch)
tree7678de9cfdab89a90fe9140cebb756944523365c
parentc3355df5da37cd0e78bce83920c579f2cb50d0b4 (diff)
parentf31dc9a61b08708b856a545440d18c7b49e04861 (diff)
Merge "Populate binder trace txn names lazily" am: f31dc9a61b
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2254277 Change-Id: Idd634734951de7a2aa16d1883568e5b9024f81a9 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--core/java/android/os/Binder.java41
1 files changed, 23 insertions, 18 deletions
diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java
index 80b34a107a25..2f4b2c411c1d 100644
--- a/core/java/android/os/Binder.java
+++ b/core/java/android/os/Binder.java
@@ -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];
- 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);
- } else {
- buf.append(descriptor).append('#').append(i + FIRST_CALL_TRANSACTION);
- }
- transactionNames[i] = buf.toString();
- buf.setLength(0);
- }
- mSimpleDescriptor = descriptor;
- mTransactionTraceNames = transactionNames;
+ mSimpleDescriptor = getSimpleDescriptor();
+ mTransactionTraceNames = new AtomicReferenceArray(highestId + 1);
}
+
final int index = transactionCode - FIRST_CALL_TRANSACTION;
- if (index < 0 || index >= mTransactionTraceNames.length) {
+ if (index < 0 || index >= mTransactionTraceNames.length()) {
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() {