diff --git a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java index df82d5d..f39d587 100644 --- a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java +++ b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java @@ -1485,6 +1485,17 @@ public class DeviceTest { assertFalse("iomanager threads", usb.hasIoManagerThreads()); assertNull(usb.ioManager); assertEquals(SerialInputOutputManager.State.STOPPED, ioManager.getState()); + + usb.open(); + ioManager = usb.ioManager; + assertEquals(SerialInputOutputManager.State.RUNNING, usb.ioManager.getState()); + usb.serialPort.close(); // stop before ioManager + for (int i = 0; i < 100 && usb.hasIoManagerThreads(); i++) { + Thread.sleep(1); + } + assertFalse("iomanager threads", usb.hasIoManagerThreads()); + assertEquals(SerialInputOutputManager.State.STOPPED, usb.ioManager.getState()); + SerialInputOutputManager.DEBUG = false; } diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/util/SerialInputOutputManager.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/util/SerialInputOutputManager.java index c22a2b8..c0d50da 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/util/SerialInputOutputManager.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/util/SerialInputOutputManager.java @@ -183,7 +183,7 @@ public class SerialInputOutputManager { public void stop() { if(mState.compareAndSet(State.RUNNING, State.STOPPING)) { synchronized (mWriteBufferLock) { - mWriteBufferLock.notifyAll(); // Wake up any waiting thread to check the stop condition + mWriteBufferLock.notifyAll(); // wake up write thread to check the stop condition } Log.i(TAG, "Stop requested"); } @@ -250,10 +250,12 @@ public class SerialInputOutputManager { } notifyErrorListener(e); } finally { - if (!mState.compareAndSet(State.RUNNING, State.STOPPING)) { - if (mState.compareAndSet(State.STOPPING, State.STOPPED)) { - Log.i(TAG, "runRead: Stopped mState=" + getState()); + if (mState.compareAndSet(State.RUNNING, State.STOPPING)) { + synchronized (mWriteBufferLock) { + mWriteBufferLock.notifyAll(); // wake up write thread to check the stop condition } + } else if (mState.compareAndSet(State.STOPPING, State.STOPPED)) { + Log.i(TAG, "runRead: Stopped mState=" + getState()); } } }