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