From 2a293b50184dc5f316d7a7a6903c55906fb1663e Mon Sep 17 00:00:00 2001 From: akwizgran <michael@briarproject.org> Date: Mon, 26 Nov 2012 16:16:36 +0000 Subject: [PATCH] Use a fresh receive queue for each call. This prevents a caller from getting stale data and/or a stale EOF marker if a previous caller didn't consume the queue. --- src/net/sf/briar/plugins/modem/ModemImpl.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/net/sf/briar/plugins/modem/ModemImpl.java b/src/net/sf/briar/plugins/modem/ModemImpl.java index eb85422599..82ac37e5de 100644 --- a/src/net/sf/briar/plugins/modem/ModemImpl.java +++ b/src/net/sf/briar/plugins/modem/ModemImpl.java @@ -36,11 +36,12 @@ class ModemImpl implements Modem, SerialPortEventListener { private final SerialPort port; private final AtomicBoolean initialised, connected; private final Semaphore offHook; - private final BlockingQueue<byte[]> received; private final byte[] line; private int lineLen = 0; + private volatile BlockingQueue<byte[]> received = null; + ModemImpl(Executor executor, Callback callback, String portName) { this.executor = executor; this.callback = callback; @@ -48,7 +49,6 @@ class ModemImpl implements Modem, SerialPortEventListener { initialised = new AtomicBoolean(false); offHook = new Semaphore(1); connected = new AtomicBoolean(false); - received = new LinkedBlockingQueue<byte[]>(); line = new byte[MAX_LINE_LENGTH]; } @@ -92,6 +92,7 @@ class ModemImpl implements Modem, SerialPortEventListener { Thread.currentThread().interrupt(); throw new IOException("Interrupted while initialising modem"); } + received = new LinkedBlockingQueue<byte[]>(); } public boolean dial(String number) throws IOException { @@ -124,7 +125,7 @@ class ModemImpl implements Modem, SerialPortEventListener { } public InputStream getInputStream() { - return new ModemInputStream(); + return new ModemInputStream(received); } public OutputStream getOutputStream() { @@ -140,6 +141,7 @@ class ModemImpl implements Modem, SerialPortEventListener { throw new IOException(e.toString()); } received.add(new byte[0]); // Empty buffer indicates EOF + received = new LinkedBlockingQueue<byte[]>(); connected.set(false); offHook.release(); } @@ -246,9 +248,15 @@ class ModemImpl implements Modem, SerialPortEventListener { private class ModemInputStream extends InputStream { + private final BlockingQueue<byte[]> received; + private byte[] buf = null; private int offset = 0; + private ModemInputStream(BlockingQueue<byte[]> received) { + this.received = received; + } + @Override public int read() throws IOException { getBufferIfNecessary(); -- GitLab