mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-20 06:39:54 +01:00
Wake any readers that are waiting for data when the modem hangs up.
This commit is contained in:
@@ -23,13 +23,15 @@ class Receiver implements ReadHandler {
|
|||||||
private long finalSequenceNumber = Long.MAX_VALUE;
|
private long finalSequenceNumber = Long.MAX_VALUE;
|
||||||
private long nextSequenceNumber = 1L;
|
private long nextSequenceNumber = 1L;
|
||||||
|
|
||||||
|
private volatile boolean valid = true;
|
||||||
|
|
||||||
Receiver(Sender sender) {
|
Receiver(Sender sender) {
|
||||||
this.sender = sender;
|
this.sender = sender;
|
||||||
dataFrames = new TreeSet<Data>(new SequenceNumberComparator());
|
dataFrames = new TreeSet<Data>(new SequenceNumberComparator());
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized Data read() throws IOException, InterruptedException {
|
synchronized Data read() throws IOException, InterruptedException {
|
||||||
while(true) {
|
while(valid) {
|
||||||
if(dataFrames.isEmpty()) {
|
if(dataFrames.isEmpty()) {
|
||||||
if(LOG.isLoggable(FINE)) LOG.fine("Waiting for a data frame");
|
if(LOG.isLoggable(FINE)) LOG.fine("Waiting for a data frame");
|
||||||
wait();
|
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 {
|
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(length < Data.MIN_LENGTH || length > Data.MAX_LENGTH) {
|
||||||
if(LOG.isLoggable(FINE))
|
if(LOG.isLoggable(FINE))
|
||||||
LOG.fine("Ignoring frame with invalid length");
|
LOG.fine("Ignoring frame with invalid length");
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import java.io.OutputStream;
|
|||||||
class ReliabilityLayer implements ReadHandler, WriteHandler {
|
class ReliabilityLayer implements ReadHandler, WriteHandler {
|
||||||
|
|
||||||
private final WriteHandler writeHandler;
|
private final WriteHandler writeHandler;
|
||||||
|
private final Receiver receiver;
|
||||||
private final SlipDecoder decoder;
|
private final SlipDecoder decoder;
|
||||||
private final ReceiverInputStream inputStream;
|
private final ReceiverInputStream inputStream;
|
||||||
private final SenderOutputStream outputStream;
|
private final SenderOutputStream outputStream;
|
||||||
@@ -17,7 +18,7 @@ class ReliabilityLayer implements ReadHandler, WriteHandler {
|
|||||||
this.writeHandler = writeHandler;
|
this.writeHandler = writeHandler;
|
||||||
SlipEncoder encoder = new SlipEncoder(this);
|
SlipEncoder encoder = new SlipEncoder(this);
|
||||||
Sender sender = new Sender(encoder);
|
Sender sender = new Sender(encoder);
|
||||||
Receiver receiver = new Receiver(sender);
|
receiver = new Receiver(sender);
|
||||||
decoder = new SlipDecoder(receiver);
|
decoder = new SlipDecoder(receiver);
|
||||||
inputStream = new ReceiverInputStream(receiver);
|
inputStream = new ReceiverInputStream(receiver);
|
||||||
outputStream = new SenderOutputStream(sender);
|
outputStream = new SenderOutputStream(sender);
|
||||||
@@ -33,6 +34,7 @@ class ReliabilityLayer implements ReadHandler, WriteHandler {
|
|||||||
|
|
||||||
void invalidate() {
|
void invalidate() {
|
||||||
valid = false;
|
valid = false;
|
||||||
|
receiver.invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
// The modem calls this method to pass data up to the SLIP decoder
|
// The modem calls this method to pass data up to the SLIP decoder
|
||||||
|
|||||||
Reference in New Issue
Block a user