diff options
author | Sudheer Shanka <sudheersai@google.com> | 2020-10-30 22:25:03 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-10-30 22:25:03 +0000 |
commit | adb3c332fd7fff1fe119d4797d95ed88e99f779c (patch) | |
tree | 8cae9df505eb1844b95db9d51be049f9d092fce2 | |
parent | dbbcb14f065b8adc12bf76f0a1084daa4abde252 (diff) | |
parent | 388fe5f6262b410c2456097e75780eaf59e36f0d (diff) |
Merge "NPMS lock improvement." am: 053893568a am: cada17643d am: 388fe5f626
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1480258
Change-Id: Ia0a79dc25e9bc08e572fa5a37fb5f821bd7bbfcf
-rw-r--r-- | services/core/java/com/android/server/net/NetworkPolicyManagerService.java | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 898037c2fb71..19d95f807ede 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -526,8 +526,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private final SparseBooleanArray mRestrictBackgroundAllowlistRevokedUids = new SparseBooleanArray(); + final Object mMeteredIfacesLock = new Object(); /** Set of ifaces that are metered. */ - @GuardedBy("mNetworkPoliciesSecondLock") + @GuardedBy("mMeteredIfacesLock") private ArraySet<String> mMeteredIfaces = new ArraySet<>(); /** Set of over-limit templates that have been notified. */ @GuardedBy("mNetworkPoliciesSecondLock") @@ -1980,13 +1981,15 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } // Remove quota from any interfaces that are no longer metered. - for (int i = mMeteredIfaces.size() - 1; i >= 0; i--) { - final String iface = mMeteredIfaces.valueAt(i); - if (!newMeteredIfaces.contains(iface)) { - removeInterfaceQuotaAsync(iface); + synchronized (mMeteredIfacesLock) { + for (int i = mMeteredIfaces.size() - 1; i >= 0; i--) { + final String iface = mMeteredIfaces.valueAt(i); + if (!newMeteredIfaces.contains(iface)) { + removeInterfaceQuotaAsync(iface); + } } + mMeteredIfaces = newMeteredIfaces; } - mMeteredIfaces = newMeteredIfaces; final ContentResolver cr = mContext.getContentResolver(); final boolean quotaEnabled = Settings.Global.getInt(cr, @@ -2038,7 +2041,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { mSubscriptionOpportunisticQuota.put(subId, quotaBytes); } - final String[] meteredIfaces = mMeteredIfaces.toArray(new String[mMeteredIfaces.size()]); + final String[] meteredIfaces; + synchronized (mMeteredIfacesLock) { + meteredIfaces = mMeteredIfaces.toArray(new String[mMeteredIfaces.size()]); + } mHandler.obtainMessage(MSG_METERED_IFACES_CHANGED, meteredIfaces).sendToTarget(); mHandler.obtainMessage(MSG_ADVISE_PERSIST_THRESHOLD, lowestRule).sendToTarget(); @@ -3460,7 +3466,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { fout.print("Restrict background: "); fout.println(mRestrictBackground); fout.print("Restrict power: "); fout.println(mRestrictPower); fout.print("Device idle: "); fout.println(mDeviceIdleMode); - fout.print("Metered ifaces: "); fout.println(mMeteredIfaces); + synchronized (mMeteredIfacesLock) { + fout.print("Metered ifaces: "); + fout.println(mMeteredIfaces); + } fout.println(); fout.print("mRestrictBackgroundLowPowerMode: " + mRestrictBackgroundLowPowerMode); @@ -4654,7 +4663,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } case MSG_LIMIT_REACHED: { final String iface = (String) msg.obj; - synchronized (mNetworkPoliciesSecondLock) { + synchronized (mMeteredIfacesLock) { // fast return if not needed. if (!mMeteredIfaces.contains(iface)) { return true; @@ -5296,7 +5305,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { isBackgroundRestricted = mRestrictBackground; } final boolean isNetworkMetered; - synchronized (mNetworkPoliciesSecondLock) { + synchronized (mMeteredIfacesLock) { isNetworkMetered = mMeteredIfaces.contains(ifname); } final boolean ret = isUidNetworkingBlockedInternal(uid, uidRules, isNetworkMetered, |