From f8210e1b135c2c094f2a95e811ad83526e989f36 Mon Sep 17 00:00:00 2001 From: akwizgran <michael@briarproject.org> Date: Tue, 27 Nov 2012 14:40:21 +0000 Subject: [PATCH] Wake any readers that are waiting for data when the modem hangs up. --- src/net/sf/briar/plugins/modem/Receiver.java | 13 ++++++++++++- .../sf/briar/plugins/modem/ReliabilityLayer.java | 4 +++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/net/sf/briar/plugins/modem/Receiver.java b/src/net/sf/briar/plugins/modem/Receiver.java index e48dea8857..6ce7b53d6d 100644 --- a/src/net/sf/briar/plugins/modem/Receiver.java +++ b/src/net/sf/briar/plugins/modem/Receiver.java @@ -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"); diff --git a/src/net/sf/briar/plugins/modem/ReliabilityLayer.java b/src/net/sf/briar/plugins/modem/ReliabilityLayer.java index bc97a5e2ed..3265d197c1 100644 --- a/src/net/sf/briar/plugins/modem/ReliabilityLayer.java +++ b/src/net/sf/briar/plugins/modem/ReliabilityLayer.java @@ -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 -- GitLab