Merge "Add a lock when unwrapping lazy value in bundles"
diff --git a/core/java/android/os/BaseBundle.java b/core/java/android/os/BaseBundle.java
index 87579eb..4e3adfb 100644
--- a/core/java/android/os/BaseBundle.java
+++ b/core/java/android/os/BaseBundle.java
@@ -27,6 +27,7 @@
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 @@
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 @@
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 @@
}
}
}
- return (clazz != null) ? clazz.cast(object) : (T) object;
+ return object;
}
private void initializeFromParcelLocked(@NonNull Parcel parcelledData, boolean ownsParcel,