Merge "Fix crash when incrementing data usage request" into tm-dev am: 5b73f4bef4

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18583185

Change-Id: I3ad20d0d4ddea5ed5ed9d3aae0c1b17443c01e92
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Junyu Lai
2022-06-01 10:17:37 +00:00
committed by Automerger Merge Worker

View File

@@ -192,10 +192,13 @@ public class MultipathPolicyTracker {
private final int mSubId; private final int mSubId;
private long mQuota; private long mQuota;
/** Current multipath budget. Nonzero iff we have budget and a UsageCallback is armed. */ /** Current multipath budget. Nonzero iff we have budget. */
private long mMultipathBudget; // The budget could be accessed by multiple threads, make it volatile to ensure the callers
// on a different thread will not see the stale value.
private volatile long mMultipathBudget;
private final NetworkTemplate mNetworkTemplate; private final NetworkTemplate mNetworkTemplate;
private final UsageCallback mUsageCallback; private final UsageCallback mUsageCallback;
private boolean mUsageCallbackRegistered = false;
private NetworkCapabilities mNetworkCapabilities; private NetworkCapabilities mNetworkCapabilities;
private final NetworkStatsManager mStatsManager; private final NetworkStatsManager mStatsManager;
@@ -234,7 +237,6 @@ public class MultipathPolicyTracker {
@Override @Override
public void onThresholdReached(int networkType, String subscriberId) { public void onThresholdReached(int networkType, String subscriberId) {
if (DBG) Log.d(TAG, "onThresholdReached for network " + network); if (DBG) Log.d(TAG, "onThresholdReached for network " + network);
mMultipathBudget = 0;
updateMultipathBudget(); updateMultipathBudget();
} }
}; };
@@ -376,9 +378,9 @@ public class MultipathPolicyTracker {
if (DBG) { if (DBG) {
Log.d(TAG, "Setting callback for " + budget + " bytes on network " + network); Log.d(TAG, "Setting callback for " + budget + " bytes on network " + network);
} }
registerUsageCallback(budget); setMultipathBudget(budget);
} else { } else {
maybeUnregisterUsageCallback(); clearMultipathBudget();
} }
} }
@@ -403,23 +405,30 @@ public class MultipathPolicyTracker {
return mMultipathBudget > 0; return mMultipathBudget > 0;
} }
private void registerUsageCallback(long budget) { // Sets the budget and registers a usage callback for it.
private void setMultipathBudget(long budget) {
maybeUnregisterUsageCallback(); maybeUnregisterUsageCallback();
if (DBG) Log.d(TAG, "Registering callback, budget is " + mMultipathBudget);
mStatsManager.registerUsageCallback(mNetworkTemplate, budget, mStatsManager.registerUsageCallback(mNetworkTemplate, budget,
(command) -> mHandler.post(command), mUsageCallback); (command) -> mHandler.post(command), mUsageCallback);
mUsageCallbackRegistered = true;
mMultipathBudget = budget; mMultipathBudget = budget;
} }
private void maybeUnregisterUsageCallback() { private void maybeUnregisterUsageCallback() {
if (haveMultipathBudget()) { if (!mUsageCallbackRegistered) return;
if (DBG) Log.d(TAG, "Unregistering callback, budget was " + mMultipathBudget); if (DBG) Log.d(TAG, "Unregistering callback, budget was " + mMultipathBudget);
mStatsManager.unregisterUsageCallback(mUsageCallback); mStatsManager.unregisterUsageCallback(mUsageCallback);
mMultipathBudget = 0; mUsageCallbackRegistered = false;
} }
private void clearMultipathBudget() {
maybeUnregisterUsageCallback();
mMultipathBudget = 0;
} }
void shutdown() { void shutdown() {
maybeUnregisterUsageCallback(); clearMultipathBudget();
} }
} }