Merge "ConnectivityService: simplify WakeLock management" am: 063cd4485d am: 8da1697f8f

am: 56ca1705d6

Change-Id: Iacc2e977c1eec2ebc9deb9395e1f77a62b57f070
This commit is contained in:
Hugo Benichi
2017-04-03 09:17:18 +00:00
committed by android-build-merger

View File

@@ -413,7 +413,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
private Intent mInitialBroadcast; private Intent mInitialBroadcast;
private PowerManager.WakeLock mNetTransitionWakeLock; private PowerManager.WakeLock mNetTransitionWakeLock;
private int mNetTransitionWakeLockSerialNumber;
private int mNetTransitionWakeLockTimeout; private int mNetTransitionWakeLockTimeout;
private final PowerManager.WakeLock mPendingIntentWakeLock; private final PowerManager.WakeLock mPendingIntentWakeLock;
@@ -2384,7 +2383,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (nai.isSatisfyingRequest(mDefaultRequest.requestId)) { if (nai.isSatisfyingRequest(mDefaultRequest.requestId)) {
removeDataActivityTracking(nai); removeDataActivityTracking(nai);
notifyLockdownVpn(nai); notifyLockdownVpn(nai);
requestNetworkTransitionWakelock(nai.name()); ensureNetworkTransitionWakelock(nai.name());
} }
mLegacyTypeTracker.remove(nai, wasDefault); mLegacyTypeTracker.remove(nai, wasDefault);
rematchAllNetworksAndRequests(null, 0); rematchAllNetworksAndRequests(null, 0);
@@ -2843,7 +2842,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
switch (msg.what) { switch (msg.what) {
case EVENT_EXPIRE_NET_TRANSITION_WAKELOCK: case EVENT_EXPIRE_NET_TRANSITION_WAKELOCK:
case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: { case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: {
handleNetworkTransitionWakelockRelease(msg.what, msg.arg1); handleReleaseNetworkTransitionWakelock(msg.what);
break; break;
} }
case EVENT_APPLY_GLOBAL_HTTP_PROXY: { case EVENT_APPLY_GLOBAL_HTTP_PROXY: {
@@ -3076,44 +3075,46 @@ public class ConnectivityService extends IConnectivityManager.Stub
// This will automatically be cleared after X seconds or a new default network // This will automatically be cleared after X seconds or a new default network
// becomes CONNECTED, whichever happens first. The timer is started by the // becomes CONNECTED, whichever happens first. The timer is started by the
// first caller and not restarted by subsequent callers. // first caller and not restarted by subsequent callers.
private void requestNetworkTransitionWakelock(String forWhom) { private void ensureNetworkTransitionWakelock(String forWhom) {
int serialNum = 0;
synchronized (this) { synchronized (this) {
if (mNetTransitionWakeLock.isHeld()) return; if (mNetTransitionWakeLock.isHeld()) {
serialNum = ++mNetTransitionWakeLockSerialNumber; return;
}
mNetTransitionWakeLock.acquire(); mNetTransitionWakeLock.acquire();
mWakelockLogs.log(String.format("ACQUIRE %d for %s", serialNum, forWhom));
} }
mHandler.sendMessageDelayed(mHandler.obtainMessage( mWakelockLogs.log("ACQUIRE for " + forWhom);
EVENT_EXPIRE_NET_TRANSITION_WAKELOCK, serialNum, 0), Message msg = mHandler.obtainMessage(EVENT_EXPIRE_NET_TRANSITION_WAKELOCK);
mNetTransitionWakeLockTimeout); mHandler.sendMessageDelayed(msg, mNetTransitionWakeLockTimeout);
return;
} }
private void handleNetworkTransitionWakelockRelease(int eventId, int wantSerialNumber) { // Called when we gain a new default network to release the network transition wakelock in a
final int serialNumber; // second, to allow a grace period for apps to reconnect over the new network. Pending expiry
final boolean isHeld; // message is cancelled.
final boolean release; private void scheduleReleaseNetworkTransitionWakelock() {
synchronized (this) { synchronized (this) {
serialNumber = mNetTransitionWakeLockSerialNumber; if (!mNetTransitionWakeLock.isHeld()) {
isHeld = mNetTransitionWakeLock.isHeld(); return; // expiry message released the lock first.
release = (wantSerialNumber == serialNumber) && isHeld;
if (release) {
mNetTransitionWakeLock.release();
} }
} }
final String result; // Cancel self timeout on wakelock hold.
if (release) { mHandler.removeMessages(EVENT_EXPIRE_NET_TRANSITION_WAKELOCK);
result = "released"; Message msg = mHandler.obtainMessage(EVENT_CLEAR_NET_TRANSITION_WAKELOCK);
} else if (!isHeld) { mHandler.sendMessageDelayed(msg, 1000);
result = "already released"; }
} else {
result = String.format("not released (serial number was %d)", serialNumber); // Called when either message of ensureNetworkTransitionWakelock or
// scheduleReleaseNetworkTransitionWakelock is processed.
private void handleReleaseNetworkTransitionWakelock(int eventId) {
String event = eventName(eventId);
synchronized (this) {
if (!mNetTransitionWakeLock.isHeld()) {
mWakelockLogs.log(String.format("RELEASE: already released (%s)", event));
Slog.w(TAG, "expected Net Transition WakeLock to be held");
return;
}
mNetTransitionWakeLock.release();
} }
String msg = String.format( mWakelockLogs.log(String.format("RELEASE (%s)", event));
"RELEASE %d by %s: %s", wantSerialNumber, eventName(eventId), result);
mWakelockLogs.log(msg);
if (DBG) log(msg);
} }
// 100 percent is full good, 0 is full bad. // 100 percent is full good, 0 is full bad.
@@ -4945,17 +4946,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
makeDefault(newNetwork); makeDefault(newNetwork);
// Log 0 -> X and Y -> X default network transitions, where X is the new default. // Log 0 -> X and Y -> X default network transitions, where X is the new default.
logDefaultNetworkEvent(newNetwork, oldDefaultNetwork); logDefaultNetworkEvent(newNetwork, oldDefaultNetwork);
synchronized (ConnectivityService.this) { // Have a new default network, release the transition wakelock in
// have a new default network, release the transition wakelock in scheduleReleaseNetworkTransitionWakelock();
// a second if it's held. The second pause is to allow apps
// to reconnect over the new network
if (mNetTransitionWakeLock.isHeld()) {
mHandler.sendMessageDelayed(mHandler.obtainMessage(
EVENT_CLEAR_NET_TRANSITION_WAKELOCK,
mNetTransitionWakeLockSerialNumber, 0),
1000);
}
}
} }
if (!newNetwork.networkCapabilities.equalRequestableCapabilities(nc)) { if (!newNetwork.networkCapabilities.equalRequestableCapabilities(nc)) {