summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Hani Kazmi <hanikazmi@google.com> 2022-09-14 12:05:26 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-09-14 12:05:26 +0000
commit9cce3d7dd5dc1d7280d20bb0446e2022ff7269ca (patch)
tree68f8d934888724a0df7b54ad71265d2af268a2cd
parent7f4150929b4c437166e91223bd2a37fa853e7c8b (diff)
parent9da89484bdae926726688dc164b911ca44e6da83 (diff)
Merge "Add a lock when unwrapping lazy value in bundles"
-rw-r--r--core/java/android/os/BaseBundle.java20
1 files changed, 18 insertions, 2 deletions
diff --git a/core/java/android/os/BaseBundle.java b/core/java/android/os/BaseBundle.java
index 87579eb20890..4e3adfbdda3f 100644
--- a/core/java/android/os/BaseBundle.java
+++ b/core/java/android/os/BaseBundle.java
@@ -27,6 +27,7 @@ import android.util.MathUtils;
import android.util.Slog;
import android.util.SparseArray;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
@@ -396,6 +397,20 @@ public class BaseBundle {
final <T> T getValueAt(int i, @Nullable Class<T> clazz, @Nullable Class<?>... itemTypes) {
Object object = mMap.valueAt(i);
if (object instanceof BiFunction<?, ?, ?>) {
+ synchronized (this) {
+ object = unwrapLazyValueFromMapLocked(i, clazz, itemTypes);
+ }
+ }
+ return (clazz != null) ? clazz.cast(object) : (T) object;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Nullable
+ @GuardedBy("this")
+ private Object unwrapLazyValueFromMapLocked(int i, @Nullable Class<?> clazz,
+ @Nullable Class<?>... itemTypes) {
+ Object object = mMap.valueAt(i);
+ if (object instanceof BiFunction<?, ?, ?>) {
try {
object = ((BiFunction<Class<?>, Class<?>[], ?>) object).apply(clazz, itemTypes);
} catch (BadParcelableException e) {
@@ -409,7 +424,8 @@ public class BaseBundle {
mMap.setValueAt(i, object);
mLazyValues--;
if (mOwnsLazyValues) {
- Preconditions.checkState(mLazyValues >= 0, "Lazy values ref count below 0");
+ Preconditions.checkState(mLazyValues >= 0,
+ "Lazy values ref count below 0");
// No more lazy values in mMap, so we can recycle the parcel early rather than
// waiting for the next GC run
if (mLazyValues == 0) {
@@ -420,7 +436,7 @@ public class BaseBundle {
}
}
}
- return (clazz != null) ? clazz.cast(object) : (T) object;
+ return object;
}
private void initializeFromParcelLocked(@NonNull Parcel parcelledData, boolean ownsParcel,