Merge "NetworkPolicyManagerService: fix deadlock" into oc-dev

am: 73edcd7328

Change-Id: I8428663ed86cc4257b24ad10488d69b89666537d
This commit is contained in:
Sudheer Shanka
2017-04-10 19:37:21 +00:00
committed by android-build-merger

View File

@@ -1003,22 +1003,24 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
final boolean meteredHint = info.getMeteredHint(); final boolean meteredHint = info.getMeteredHint();
final NetworkTemplate template = NetworkTemplate.buildTemplateWifi(info.getSSID()); final NetworkTemplate template = NetworkTemplate.buildTemplateWifi(info.getSSID());
synchronized (mNetworkPoliciesSecondLock) { synchronized (mUidRulesFirstLock) {
NetworkPolicy policy = mNetworkPolicy.get(template); synchronized (mNetworkPoliciesSecondLock) {
if (policy == null && meteredHint) { NetworkPolicy policy = mNetworkPolicy.get(template);
// policy doesn't exist, and AP is hinting that it's if (policy == null && meteredHint) {
// metered: create an inferred policy. // policy doesn't exist, and AP is hinting that it's
policy = newWifiPolicy(template, meteredHint); // metered: create an inferred policy.
addNetworkPolicyNL(policy); policy = newWifiPolicy(template, meteredHint);
addNetworkPolicyAL(policy);
} else if (policy != null && policy.inferred) { } else if (policy != null && policy.inferred) {
// policy exists, and was inferred: update its current // policy exists, and was inferred: update its current
// metered state. // metered state.
policy.metered = meteredHint; policy.metered = meteredHint;
// since this is inferred for each wifi session, just update // since this is inferred for each wifi session, just update
// rules without persisting. // rules without persisting.
updateNetworkRulesNL(); updateNetworkRulesNL();
}
} }
} }
} }
@@ -1289,12 +1291,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
// permission above. // permission above.
maybeRefreshTrustedTime(); maybeRefreshTrustedTime();
synchronized (mNetworkPoliciesSecondLock) { synchronized (mUidRulesFirstLock) {
ensureActiveMobilePolicyNL(); synchronized (mNetworkPoliciesSecondLock) {
normalizePoliciesNL(); ensureActiveMobilePolicyAL();
updateNetworkEnabledNL(); normalizePoliciesNL();
updateNetworkRulesNL(); updateNetworkEnabledNL();
updateNotificationsNL(); updateNetworkRulesNL();
updateNotificationsNL();
}
} }
} }
}; };
@@ -1477,7 +1481,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
maybeRefreshTrustedTime(); maybeRefreshTrustedTime();
synchronized (mUidRulesFirstLock) { synchronized (mUidRulesFirstLock) {
synchronized (mNetworkPoliciesSecondLock) { synchronized (mNetworkPoliciesSecondLock) {
final boolean added = ensureActiveMobilePolicyNL(subId, subscriberId); final boolean added = ensureActiveMobilePolicyAL(subId, subscriberId);
if (added) return; if (added) return;
final boolean updated = maybeUpdateMobilePolicyCycleNL(subId); final boolean updated = maybeUpdateMobilePolicyCycleNL(subId);
if (!updated) return; if (!updated) return;
@@ -1721,8 +1725,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
* Once any {@link #mNetworkPolicy} are loaded from disk, ensure that we * Once any {@link #mNetworkPolicy} are loaded from disk, ensure that we
* have at least a default mobile policy defined. * have at least a default mobile policy defined.
*/ */
private void ensureActiveMobilePolicyNL() { private void ensureActiveMobilePolicyAL() {
if (LOGV) Slog.v(TAG, "ensureActiveMobilePolicyNL()"); if (LOGV) Slog.v(TAG, "ensureActiveMobilePolicyAL()");
if (mSuppressDefaultPolicy) return; if (mSuppressDefaultPolicy) return;
final TelephonyManager tele = TelephonyManager.from(mContext); final TelephonyManager tele = TelephonyManager.from(mContext);
@@ -1731,7 +1735,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
final int[] subIds = sub.getActiveSubscriptionIdList(); final int[] subIds = sub.getActiveSubscriptionIdList();
for (int subId : subIds) { for (int subId : subIds) {
final String subscriberId = tele.getSubscriberId(subId); final String subscriberId = tele.getSubscriberId(subId);
ensureActiveMobilePolicyNL(subId, subscriberId); ensureActiveMobilePolicyAL(subId, subscriberId);
} }
} }
@@ -1743,7 +1747,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
* @param subscriberId that we check for an existing policy * @param subscriberId that we check for an existing policy
* @return true if a mobile network policy was added, or false one already existed. * @return true if a mobile network policy was added, or false one already existed.
*/ */
private boolean ensureActiveMobilePolicyNL(int subId, String subscriberId) { private boolean ensureActiveMobilePolicyAL(int subId, String subscriberId) {
// Poke around to see if we already have a policy // Poke around to see if we already have a policy
final NetworkIdentity probeIdent = new NetworkIdentity(TYPE_MOBILE, final NetworkIdentity probeIdent = new NetworkIdentity(TYPE_MOBILE,
TelephonyManager.NETWORK_TYPE_UNKNOWN, subscriberId, null, false, true); TelephonyManager.NETWORK_TYPE_UNKNOWN, subscriberId, null, false, true);
@@ -1761,7 +1765,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
Slog.i(TAG, "No policy for subscriber " + NetworkIdentity.scrubSubscriberId(subscriberId) Slog.i(TAG, "No policy for subscriber " + NetworkIdentity.scrubSubscriberId(subscriberId)
+ "; generating default policy"); + "; generating default policy");
final NetworkPolicy policy = buildDefaultMobilePolicy(subId, subscriberId); final NetworkPolicy policy = buildDefaultMobilePolicy(subId, subscriberId);
addNetworkPolicyNL(policy); addNetworkPolicyAL(policy);
return true; return true;
} }
@@ -2265,7 +2269,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
} }
} }
void addNetworkPolicyNL(NetworkPolicy policy) { void addNetworkPolicyAL(NetworkPolicy policy) {
NetworkPolicy[] policies = getNetworkPolicies(mContext.getOpPackageName()); NetworkPolicy[] policies = getNetworkPolicies(mContext.getOpPackageName());
policies = ArrayUtils.appendElement(NetworkPolicy.class, policies, policy); policies = ArrayUtils.appendElement(NetworkPolicy.class, policies, policy);
setNetworkPolicies(policies); setNetworkPolicies(policies);