Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a9753891 authored by mayankkk's avatar mayankkk
Browse files

Synchronize the ArrayMap.put method calls.

BUG: 382433676
Test: m & N/A concurrency issue
Flag: EXEMPT bugFix
Change-Id: I631dcf09cc08e1f997f9aeee345c47371651e8aa
parent 29925d01
Loading
Loading
Loading
Loading
+33 −22
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import android.telephony.TelephonyManager;
import android.util.ArrayMap;
import android.view.WindowManagerPolicyConstants;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;

@@ -71,8 +72,10 @@ public class BroadcastStickyCache {
    @VisibleForTesting
    public static final ArrayMap<String, String> sActionApiNameMap = new ArrayMap<>();

    @GuardedBy("BroadcastStickyCache.class")
    private static final ArrayMap<String, IpcDataCache.Config> sActionConfigMap = new ArrayMap<>();

    @GuardedBy("BroadcastStickyCache.class")
    private static final ArrayMap<StickyBroadcastFilter, IpcDataCache<Void, Intent>>
            sFilterCacheMap = new ArrayMap<>();

@@ -154,7 +157,10 @@ public class BroadcastStickyCache {
            @Nullable String broadcastPermission,
            @UserIdInt int userId,
            @RegisterReceiverFlags int flags) {
        IpcDataCache<Void, Intent> intentDataCache = findIpcDataCache(filter);
        IpcDataCache<Void, Intent> intentDataCache;

        synchronized (BroadcastStickyCache.class) {
            intentDataCache = findIpcDataCache(filter);

            if (intentDataCache == null) {
                final String action = filter.getAction(0);
@@ -176,15 +182,19 @@ public class BroadcastStickyCache {
                                        flags));
                sFilterCacheMap.put(stickyBroadcastFilter, intentDataCache);
            }
        }
        return intentDataCache.query(null);
    }

    @VisibleForTesting
    public static void clearCacheForTest() {
        synchronized (BroadcastStickyCache.class) {
            sFilterCacheMap.clear();
        }
    }

    @Nullable
    @GuardedBy("BroadcastStickyCache.class")
    private static IpcDataCache<Void, Intent> findIpcDataCache(
            @NonNull IntentFilter filter) {
        for (int i = sFilterCacheMap.size() - 1; i >= 0; i--) {
@@ -198,6 +208,7 @@ public class BroadcastStickyCache {
    }

    @NonNull
    @GuardedBy("BroadcastStickyCache.class")
    private static IpcDataCache.Config getConfig(@NonNull String action) {
        if (!sActionConfigMap.containsKey(action)) {
            // We only need 1 entry per cache but just to be on the safer side we are choosing 32