diff options
author | 2022-09-14 12:05:26 +0000 | |
---|---|---|
committer | 2022-09-14 12:05:26 +0000 | |
commit | 9cce3d7dd5dc1d7280d20bb0446e2022ff7269ca (patch) | |
tree | 68f8d934888724a0df7b54ad71265d2af268a2cd | |
parent | 7f4150929b4c437166e91223bd2a37fa853e7c8b (diff) | |
parent | 9da89484bdae926726688dc164b911ca44e6da83 (diff) |
Merge "Add a lock when unwrapping lazy value in bundles"
-rw-r--r-- | core/java/android/os/BaseBundle.java | 20 |
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, |