Merge "Rely on Tethering mutex for TetherInterfaceSM"

This commit is contained in:
TreeHugger Robot
2016-05-24 20:00:56 +00:00
committed by Android (Google) Code Review
3 changed files with 41 additions and 74 deletions

View File

@@ -262,7 +262,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
TetherInterfaceStateMachine sm = mIfaces.get(iface);
if (up) {
if (sm == null) {
sm = new TetherInterfaceStateMachine(iface, mLooper, usb, mPublicSync,
sm = new TetherInterfaceStateMachine(iface, mLooper, usb,
mNMService, mStatsService, this);
mIfaces.put(iface, sm);
sm.start();
@@ -338,7 +338,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
if (VDBG) Log.d(TAG, "active iface (" + iface + ") reported as added, ignoring");
return;
}
sm = new TetherInterfaceStateMachine(iface, mLooper, usb, mPublicSync,
sm = new TetherInterfaceStateMachine(iface, mLooper, usb,
mNMService, mStatsService, this);
mIfaces.put(iface, sm);
sm.start();
@@ -576,38 +576,39 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
public int tether(String iface) {
if (DBG) Log.d(TAG, "Tethering " + iface);
TetherInterfaceStateMachine sm = null;
synchronized (mPublicSync) {
sm = mIfaces.get(iface);
TetherInterfaceStateMachine sm = mIfaces.get(iface);
if (sm == null) {
Log.e(TAG, "Tried to Tether an unknown iface :" + iface + ", ignoring");
return ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
}
// Ignore the error status of the interface. If the interface is available,
// the errors are referring to past tethering attempts anyway.
if (!sm.isAvailable()) {
Log.e(TAG, "Tried to Tether an unavailable iface :" + iface + ", ignoring");
return ConnectivityManager.TETHER_ERROR_UNAVAIL_IFACE;
}
sm.sendMessage(TetherInterfaceStateMachine.CMD_TETHER_REQUESTED);
return ConnectivityManager.TETHER_ERROR_NO_ERROR;
}
if (sm == null) {
Log.e(TAG, "Tried to Tether an unknown iface :" + iface + ", ignoring");
return ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
}
if (!sm.isAvailable() && !sm.isErrored()) {
Log.e(TAG, "Tried to Tether an unavailable iface :" + iface + ", ignoring");
return ConnectivityManager.TETHER_ERROR_UNAVAIL_IFACE;
}
sm.sendMessage(TetherInterfaceStateMachine.CMD_TETHER_REQUESTED);
return ConnectivityManager.TETHER_ERROR_NO_ERROR;
}
public int untether(String iface) {
if (DBG) Log.d(TAG, "Untethering " + iface);
TetherInterfaceStateMachine sm = null;
synchronized (mPublicSync) {
sm = mIfaces.get(iface);
TetherInterfaceStateMachine sm = mIfaces.get(iface);
if (sm == null) {
Log.e(TAG, "Tried to Untether an unknown iface :" + iface + ", ignoring");
return ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
}
if (!sm.isTethered()) {
Log.e(TAG, "Tried to Untethered an errored iface :" + iface + ", ignoring");
return ConnectivityManager.TETHER_ERROR_UNAVAIL_IFACE;
}
sm.sendMessage(TetherInterfaceStateMachine.CMD_TETHER_UNREQUESTED);
return ConnectivityManager.TETHER_ERROR_NO_ERROR;
}
if (sm == null) {
Log.e(TAG, "Tried to Untether an unknown iface :" + iface + ", ignoring");
return ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
}
if (sm.isErrored()) {
Log.e(TAG, "Tried to Untethered an errored iface :" + iface + ", ignoring");
return ConnectivityManager.TETHER_ERROR_UNAVAIL_IFACE;
}
sm.sendMessage(TetherInterfaceStateMachine.CMD_TETHER_UNREQUESTED);
return ConnectivityManager.TETHER_ERROR_NO_ERROR;
}
public void untetherAll() {
@@ -618,9 +619,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
}
public int getLastTetherError(String iface) {
TetherInterfaceStateMachine sm = null;
synchronized (mPublicSync) {
sm = mIfaces.get(iface);
TetherInterfaceStateMachine sm = mIfaces.get(iface);
if (sm == null) {
Log.e(TAG, "Tried to getLastTetherError on an unknown iface :" + iface +
", ignoring");

View File

@@ -84,13 +84,10 @@ public class TetherInterfaceStateMachine extends StateMachine {
private final boolean mUsb;
private final String mIfaceName;
private final Object mMutex; // Protects the fields below.
private boolean mAvailable;
private boolean mTethered;
private int mLastError;
private String mMyUpstreamIfaceName; // may change over time
public TetherInterfaceStateMachine(String ifaceName, Looper looper, boolean usb, Object mutex,
public TetherInterfaceStateMachine(String ifaceName, Looper looper, boolean usb,
INetworkManagementService nMService, INetworkStatsService statsService,
IControlsTethering tetherController) {
super(ifaceName, looper);
@@ -99,7 +96,6 @@ public class TetherInterfaceStateMachine extends StateMachine {
mTetherController = tetherController;
mIfaceName = ifaceName;
mUsb = usb;
mMutex = mutex;
setLastError(ConnectivityManager.TETHER_ERROR_NO_ERROR);
mInitialState = new InitialState();
@@ -127,53 +123,31 @@ public class TetherInterfaceStateMachine extends StateMachine {
}
public int getLastError() {
synchronized (mMutex) {
return mLastError;
}
return mLastError;
}
private void setLastError(int error) {
synchronized (mMutex) {
mLastError = error;
mLastError = error;
if (isErrored()) {
if (mUsb) {
// note everything's been unwound by this point so nothing to do on
// further error..
configureUsbIface(false, mIfaceName);
}
if (isErrored()) {
if (mUsb) {
// note everything's been unwound by this point so nothing to do on
// further error..
configureUsbIface(false, mIfaceName);
}
}
}
public boolean isAvailable() {
synchronized (mMutex) {
return mAvailable;
}
}
private void setAvailable(boolean available) {
synchronized (mMutex) {
mAvailable = available;
}
return getCurrentState() == mInitialState;
}
public boolean isTethered() {
synchronized (mMutex) {
return mTethered;
}
}
private void setTethered(boolean tethered) {
synchronized (mMutex) {
mTethered = tethered;
}
return getCurrentState() == mTetheredState;
}
public boolean isErrored() {
synchronized (mMutex) {
return (mLastError != ConnectivityManager.TETHER_ERROR_NO_ERROR);
}
return (mLastError != ConnectivityManager.TETHER_ERROR_NO_ERROR);
}
// configured when we start tethering and unconfig'd on error or conclusion
@@ -212,8 +186,6 @@ public class TetherInterfaceStateMachine extends StateMachine {
class InitialState extends State {
@Override
public void enter() {
setAvailable(true);
setTethered(false);
mTetherController.sendTetherStateChangedBroadcast();
}
@@ -241,7 +213,6 @@ public class TetherInterfaceStateMachine extends StateMachine {
class TetheredState extends State {
@Override
public void enter() {
setAvailable(false);
if (mUsb) {
if (!configureUsbIface(true, mIfaceName)) {
mTetherController.notifyInterfaceTetheringReadiness(false, TetherInterfaceStateMachine.this);
@@ -267,7 +238,6 @@ public class TetherInterfaceStateMachine extends StateMachine {
return;
}
if (DBG) Log.d(TAG, "Tethered " + mIfaceName);
setTethered(true);
mTetherController.sendTetherStateChangedBroadcast();
}
@@ -392,9 +362,7 @@ public class TetherInterfaceStateMachine extends StateMachine {
class UnavailableState extends State {
@Override
public void enter() {
setAvailable(false);
setLastError(ConnectivityManager.TETHER_ERROR_NO_ERROR);
setTethered(false);
mTetherController.sendTetherStateChangedBroadcast();
}
}

View File

@@ -48,11 +48,10 @@ public class TetherInterfaceStateMachineTest {
@Mock private InterfaceConfiguration mInterfaceConfiguration;
private final TestLooper mLooper = new TestLooper();
private final Object mMutex = new Object();
private TetherInterfaceStateMachine mTestedSm;
private void initStateMachine(boolean isUsb) {
mTestedSm = new TetherInterfaceStateMachine(IFACE_NAME, mLooper.getLooper(), isUsb, mMutex,
mTestedSm = new TetherInterfaceStateMachine(IFACE_NAME, mLooper.getLooper(), isUsb,
mNMService, mStatsService, mTetherHelper);
mTestedSm.start();
// Starting the state machine always puts us in a consistent state and notifies
@@ -77,7 +76,7 @@ public class TetherInterfaceStateMachineTest {
@Test
public void startsOutAvailable() {
mTestedSm = new TetherInterfaceStateMachine(IFACE_NAME, mLooper.getLooper(), false, mMutex,
mTestedSm = new TetherInterfaceStateMachine(IFACE_NAME, mLooper.getLooper(), false,
mNMService, mStatsService, mTetherHelper);
mTestedSm.start();
mLooper.dispatchAll();