Commit 35c9585f by christosts Committed by Marc Baechinger

Avoid using ConcurrentHashMap

Use Collections.synchronizedSet() instead of creating a set from a
ConcurrentHashMap because ConcurrentHashMap has a bug in APIs 21/22
that can result in lost updates.

PiperOrigin-RevId: 453696565
(cherry picked from commit d506c709)
parent 31c7ccbc
...@@ -43,10 +43,10 @@ import androidx.media3.session.MediaSession.ControllerInfo; ...@@ -43,10 +43,10 @@ import androidx.media3.session.MediaSession.ControllerInfo;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
/** /**
...@@ -472,7 +472,8 @@ public abstract class MediaSessionService extends Service { ...@@ -472,7 +472,8 @@ public abstract class MediaSessionService extends Service {
Context context = serviceReference.getApplicationContext(); Context context = serviceReference.getApplicationContext();
handler = new Handler(context.getMainLooper()); handler = new Handler(context.getMainLooper());
mediaSessionManager = MediaSessionManager.getSessionManager(context); mediaSessionManager = MediaSessionManager.getSessionManager(context);
pendingControllers = Collections.newSetFromMap(new ConcurrentHashMap<>()); // ConcurrentHashMap has a bug in APIs 21-22 that can result in lost updates.
pendingControllers = Collections.synchronizedSet(new HashSet<>());
} }
@Override @Override
......
...@@ -83,10 +83,10 @@ import com.google.common.util.concurrent.MoreExecutors; ...@@ -83,10 +83,10 @@ import com.google.common.util.concurrent.MoreExecutors;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.Collections; import java.util.Collections;
import java.util.Deque; import java.util.Deque;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.CancellationException; import java.util.concurrent.CancellationException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
/** /**
...@@ -109,7 +109,8 @@ import java.util.concurrent.ExecutionException; ...@@ -109,7 +109,8 @@ import java.util.concurrent.ExecutionException;
this.sessionImpl = new WeakReference<>(sessionImpl); this.sessionImpl = new WeakReference<>(sessionImpl);
sessionManager = MediaSessionManager.getSessionManager(sessionImpl.getContext()); sessionManager = MediaSessionManager.getSessionManager(sessionImpl.getContext());
connectedControllersManager = new ConnectedControllersManager<>(sessionImpl); connectedControllersManager = new ConnectedControllersManager<>(sessionImpl);
pendingControllers = Collections.newSetFromMap(new ConcurrentHashMap<>()); // ConcurrentHashMap has a bug in APIs 21-22 that can result in lost updates.
pendingControllers = Collections.synchronizedSet(new HashSet<>());
} }
public ConnectedControllersManager<IBinder> getConnectedControllersManager() { public ConnectedControllersManager<IBinder> getConnectedControllersManager() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment