Wake any readers that are waiting for data when the modem hangs up.

This commit is contained in:
akwizgran
2012-11-27 14:40:21 +00:00
parent 4869a8034b
commit f8210e1b13
2 changed files with 15 additions and 2 deletions

View File

@@ -23,13 +23,15 @@ class Receiver implements ReadHandler {
private long finalSequenceNumber = Long.MAX_VALUE;
private long nextSequenceNumber = 1L;
private volatile boolean valid = true;
Receiver(Sender sender) {
this.sender = sender;
dataFrames = new TreeSet<Data>(new SequenceNumberComparator());
}
synchronized Data read() throws IOException, InterruptedException {
while(true) {
while(valid) {
if(dataFrames.isEmpty()) {
if(LOG.isLoggable(FINE)) LOG.fine("Waiting for a data frame");
wait();
@@ -53,9 +55,18 @@ class Receiver implements ReadHandler {
}
}
}
throw new IOException("Connection closed");
}
void invalidate() {
valid = false;
synchronized(this) {
notifyAll();
}
}
public void handleRead(byte[] b, int length) throws IOException {
if(!valid) throw new IOException("Connection closed");
if(length < Data.MIN_LENGTH || length > Data.MAX_LENGTH) {
if(LOG.isLoggable(FINE))
LOG.fine("Ignoring frame with invalid length");

View File

@@ -7,6 +7,7 @@ import java.io.OutputStream;
class ReliabilityLayer implements ReadHandler, WriteHandler {
private final WriteHandler writeHandler;
private final Receiver receiver;
private final SlipDecoder decoder;
private final ReceiverInputStream inputStream;
private final SenderOutputStream outputStream;
@@ -17,7 +18,7 @@ class ReliabilityLayer implements ReadHandler, WriteHandler {
this.writeHandler = writeHandler;
SlipEncoder encoder = new SlipEncoder(this);
Sender sender = new Sender(encoder);
Receiver receiver = new Receiver(sender);
receiver = new Receiver(sender);
decoder = new SlipDecoder(receiver);
inputStream = new ReceiverInputStream(receiver);
outputStream = new SenderOutputStream(sender);
@@ -33,6 +34,7 @@ class ReliabilityLayer implements ReadHandler, WriteHandler {
void invalidate() {
valid = false;
receiver.invalidate();
}
// The modem calls this method to pass data up to the SLIP decoder