Remove unecessary locking to avoid dead lock.
Bug: 160252067
Bug: 173421434
Test: manual - switch to dsds multiple times to make sure no error
happens
Change-Id: I15def5c401811190f0f2ca8d1fa7e44d6387407e
Merged-In: I15def5c401811190f0f2ca8d1fa7e44d6387407e
diff --git a/src/java/com/android/internal/telephony/SubscriptionController.java b/src/java/com/android/internal/telephony/SubscriptionController.java
index 457c17d..88c80a1 100644
--- a/src/java/com/android/internal/telephony/SubscriptionController.java
+++ b/src/java/com/android/internal/telephony/SubscriptionController.java
@@ -700,6 +700,12 @@
}
}
+ private List<SubscriptionInfo> makeCacheListCopyWithLock(List<SubscriptionInfo> cacheSubList) {
+ synchronized (mSubInfoListLock) {
+ return new ArrayList<>(cacheSubList);
+ }
+ }
+
/**
* Get the SubInfoRecord(s) of the currently active SIM(s) - which include both local
* and remote SIMs.
@@ -709,7 +715,8 @@
@UnsupportedAppUsage
@Override
public List<SubscriptionInfo> getActiveSubscriptionInfoList(String callingPackage) {
- return getSubscriptionInfoListFromCacheHelper(callingPackage, mCacheActiveSubInfoList);
+ return getSubscriptionInfoListFromCacheHelper(callingPackage,
+ makeCacheListCopyWithLock(mCacheActiveSubInfoList));
}
/**
@@ -720,13 +727,13 @@
public void refreshCachedActiveSubscriptionInfoList() {
boolean opptSubListChanged;
- synchronized (mSubInfoListLock) {
- List<SubscriptionInfo> activeSubscriptionInfoList = getSubInfo(
- SubscriptionManager.SIM_SLOT_INDEX + ">=0 OR "
- + SubscriptionManager.SUBSCRIPTION_TYPE + "="
- + SubscriptionManager.SUBSCRIPTION_TYPE_REMOTE_SIM,
- null);
+ List<SubscriptionInfo> activeSubscriptionInfoList = getSubInfo(
+ SubscriptionManager.SIM_SLOT_INDEX + ">=0 OR "
+ + SubscriptionManager.SUBSCRIPTION_TYPE + "="
+ + SubscriptionManager.SUBSCRIPTION_TYPE_REMOTE_SIM,
+ null);
+ synchronized (mSubInfoListLock) {
if (activeSubscriptionInfoList != null) {
// Log when active sub info changes.
if (mCacheActiveSubInfoList.size() != activeSubscriptionInfoList.size()
@@ -741,10 +748,6 @@
logd("activeSubscriptionInfoList is null.");
mCacheActiveSubInfoList.clear();
}
-
- // Refresh cached opportunistic sub list and detect whether it's changed.
- refreshCachedOpportunisticSubscriptionInfoList();
-
if (DBG_CACHE) {
if (!mCacheActiveSubInfoList.isEmpty()) {
for (SubscriptionInfo si : mCacheActiveSubInfoList) {
@@ -756,6 +759,9 @@
}
}
}
+
+ // Refresh cached opportunistic sub list and detect whether it's changed.
+ refreshCachedOpportunisticSubscriptionInfoList();
}
/**
@@ -2909,8 +2915,8 @@
@Override
public List<SubscriptionInfo> getOpportunisticSubscriptions(String callingPackage) {
- return getSubscriptionInfoListFromCacheHelper(
- callingPackage, mCacheOpportunisticSubInfoList);
+ return getSubscriptionInfoListFromCacheHelper(callingPackage,
+ makeCacheListCopyWithLock(mCacheOpportunisticSubInfoList));
}
/**
@@ -3568,36 +3574,34 @@
// the identifier and phone number access checks are not required.
}
- synchronized (mSubInfoListLock) {
- // If the caller can read all phone state, just return the full list.
- if (canReadIdentifiers) {
- return new ArrayList<>(cacheSubList);
- }
- // Filter the list to only include subscriptions which the caller can manage.
- List<SubscriptionInfo> subscriptions = new ArrayList<>(cacheSubList.size());
- for (SubscriptionInfo subscriptionInfo : cacheSubList) {
- int subId = subscriptionInfo.getSubscriptionId();
- boolean hasCarrierPrivileges = TelephonyPermissions.checkCarrierPrivilegeForSubId(
- subId);
- // If the caller does not have the READ_PHONE_STATE permission nor carrier
- // privileges then they cannot access the current subscription.
- if (!canReadPhoneState && !hasCarrierPrivileges) {
- continue;
- }
- // If the caller has carrier privileges then they are granted access to all
- // identifiers for their subscription.
- if (hasCarrierPrivileges) {
- subscriptions.add(subscriptionInfo);
- } else {
- // The caller does not have carrier privileges for this subId, filter the
- // identifiers in the subscription based on the results of the initial
- // permission checks.
- subscriptions.add(
- conditionallyRemoveIdentifiers(subscriptionInfo, canReadIdentifiers));
- }
- }
- return subscriptions;
+ // If the caller can read all phone state, just return the full list.
+ if (canReadIdentifiers) {
+ return cacheSubList;
}
+ // Filter the list to only include subscriptions which the caller can manage.
+ List<SubscriptionInfo> subscriptions = new ArrayList<>(cacheSubList.size());
+ for (SubscriptionInfo subscriptionInfo : cacheSubList) {
+ int subId = subscriptionInfo.getSubscriptionId();
+ boolean hasCarrierPrivileges = TelephonyPermissions.checkCarrierPrivilegeForSubId(
+ subId);
+ // If the caller does not have the READ_PHONE_STATE permission nor carrier
+ // privileges then they cannot access the current subscription.
+ if (!canReadPhoneState && !hasCarrierPrivileges) {
+ continue;
+ }
+ // If the caller has carrier privileges then they are granted access to all
+ // identifiers for their subscription.
+ if (hasCarrierPrivileges) {
+ subscriptions.add(subscriptionInfo);
+ } else {
+ // The caller does not have carrier privileges for this subId, filter the
+ // identifiers in the subscription based on the results of the initial
+ // permission checks.
+ subscriptions.add(
+ conditionallyRemoveIdentifiers(subscriptionInfo, canReadIdentifiers));
+ }
+ }
+ return subscriptions;
}
/**
@@ -3697,14 +3701,13 @@
}
private void refreshCachedOpportunisticSubscriptionInfoList() {
+ List<SubscriptionInfo> subList = getSubInfo(
+ SubscriptionManager.IS_OPPORTUNISTIC + "=1 AND ("
+ + SubscriptionManager.SIM_SLOT_INDEX + ">=0 OR "
+ + SubscriptionManager.IS_EMBEDDED + "=1)", null);
synchronized (mSubInfoListLock) {
List<SubscriptionInfo> oldOpptCachedList = mCacheOpportunisticSubInfoList;
- List<SubscriptionInfo> subList = getSubInfo(
- SubscriptionManager.IS_OPPORTUNISTIC + "=1 AND ("
- + SubscriptionManager.SIM_SLOT_INDEX + ">=0 OR "
- + SubscriptionManager.IS_EMBEDDED + "=1)", null);
-
if (subList != null) {
subList.sort(SUBSCRIPTION_INFO_COMPARATOR);
} else {