Fix threading issue for mDefaultNetworkRequests
Handler thread updates mDefaultNetworkRequests and Multiple threads read/iterate mDefaultNetworkRequests without locking. This caused NPE when there is concurrent updates and iterations. This CL fixed this issue by using CopyOnWriteArraySet. CopyOnWriteArraySet is suitable since number of default network request is small (system default network request + per-app default network requests) and updated infrequently but read frequently. Bug: 293978451 Test: TH Change-Id: Iaefe8e6e31c2b5257ebc51b4f848c3a7197781cb
This commit is contained in:
parent
e73285c622
commit
7b906dea29
1 changed files with 8 additions and 1 deletions
|
|
@ -407,6 +407,7 @@ import java.util.Set;
|
|||
import java.util.SortedSet;
|
||||
import java.util.StringJoiner;
|
||||
import java.util.TreeSet;
|
||||
import java.util.concurrent.CopyOnWriteArraySet;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.function.BiConsumer;
|
||||
|
|
@ -8933,9 +8934,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
@NonNull
|
||||
final NetworkRequestInfo mDefaultRequest;
|
||||
// Collection of NetworkRequestInfo's used for default networks.
|
||||
// This set is read and iterated on multiple threads.
|
||||
// Using CopyOnWriteArraySet since number of default network request is small (system default
|
||||
// network request + per-app default network requests) and updated infrequently but read
|
||||
// frequently.
|
||||
@VisibleForTesting
|
||||
@NonNull
|
||||
final ArraySet<NetworkRequestInfo> mDefaultNetworkRequests = new ArraySet<>();
|
||||
final CopyOnWriteArraySet<NetworkRequestInfo> mDefaultNetworkRequests =
|
||||
new CopyOnWriteArraySet<>();
|
||||
|
||||
|
||||
private boolean isPerAppDefaultRequest(@NonNull final NetworkRequestInfo nri) {
|
||||
return (mDefaultNetworkRequests.contains(nri) && mDefaultRequest != nri);
|
||||
|
|
|
|||
Loading…
Reference in a new issue