summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chiachang Wang <chiachangwang@google.com> 2018-11-11 21:56:07 -0800
committer android-build-merger <android-build-merger@google.com> 2018-11-11 21:56:07 -0800
commit1c6f68c356a107e13d6bf4a1aa5f43e009e1978c (patch)
tree742af2771ada01efa0eba071f2e7cc7fa08b9b23
parent04fa32edbf7405765660fd05e67b59c5e6f1f10f (diff)
parent2f8c8439a501588b42b24ebdc37c190cd59178f9 (diff)
Merge "Not defer network disconnect event in Probing state" am: 8292fe9d83
am: 2f8c8439a5 Change-Id: I4c607b4abd71ecdc906845fefebcc1dc33755684
-rw-r--r--services/core/java/com/android/server/connectivity/NetworkMonitor.java26
1 files changed, 12 insertions, 14 deletions
diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
index de4f2d88aa19..c3e38424e90b 100644
--- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java
+++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
@@ -313,6 +313,7 @@ public class NetworkMonitor extends StateMachine {
private int mReevaluateDelayMs = INITIAL_REEVALUATE_DELAY_MS;
private int mEvaluateAttempts = 0;
+ private volatile int mProbeToken = 0;
public NetworkMonitor(Context context, Handler handler, NetworkAgentInfo networkAgentInfo,
NetworkRequest defaultRequest) {
@@ -838,7 +839,8 @@ public class NetworkMonitor extends StateMachine {
@Override
public void enter() {
- mThread = new Thread(() -> sendMessage(obtainMessage(CMD_PROBE_COMPLETE,
+ final int token = ++mProbeToken;
+ mThread = new Thread(() -> sendMessage(obtainMessage(CMD_PROBE_COMPLETE, token, 0,
isCaptivePortal())));
mThread.start();
}
@@ -847,16 +849,13 @@ public class NetworkMonitor extends StateMachine {
public boolean processMessage(Message message) {
switch (message.what) {
case CMD_PROBE_COMPLETE:
- // Currently, it's not possible to exit this state without mThread having
- // terminated. Therefore, this state can never get CMD_PROBE_COMPLETE from a
- // stale thread that is not mThread.
- // TODO: As soon as it's possible to exit this state without mThread having
- // terminated, ensure that CMD_PROBE_COMPLETE from stale threads are ignored.
- // This could be done via a sequence number, or by changing mThread to a class
- // that has a stopped volatile boolean or AtomicBoolean.
+ // Ensure that CMD_PROBE_COMPLETE from stale threads are ignored.
+ if (message.arg1 != mProbeToken) {
+ return HANDLED;
+ }
+
final CaptivePortalProbeResult probeResult =
(CaptivePortalProbeResult) message.obj;
-
if (probeResult.isSuccessful()) {
// Transit EvaluatingPrivateDnsState to get to Validated
// state (even if no Private DNS validation required).
@@ -883,6 +882,7 @@ public class NetworkMonitor extends StateMachine {
case CMD_REEVALUATE:
// Leave the event to EvaluatingState. Defer this message will result in reset
// of mReevaluateDelayMs and mEvaluateAttempts.
+ case CMD_NETWORK_DISCONNECTED:
return NOT_HANDLED;
default:
// TODO: Some events may able to handle in this state, instead of deferring to
@@ -894,11 +894,9 @@ public class NetworkMonitor extends StateMachine {
@Override
public void exit() {
- // If StateMachine get here, the probe started in enter() is guaranteed to have
- // completed, because in this state, all messages except CMD_PROBE_COMPLETE and
- // CMD_REEVALUATE are deferred. CMD_REEVALUATE cannot be in the queue, because it is
- // only ever sent in EvaluatingState#enter, and the StateMachine reach this state by
- // processing it. Therefore, there is no need to stop the thread.
+ if (mThread.isAlive()) {
+ mThread.interrupt();
+ }
mThread = null;
}
}