diff --git a/components/net/sf/briar/transport/batch/OutgoingBatchConnection.java b/components/net/sf/briar/transport/batch/OutgoingBatchConnection.java index 562c5b3fe..57b45b3fa 100644 --- a/components/net/sf/briar/transport/batch/OutgoingBatchConnection.java +++ b/components/net/sf/briar/transport/batch/OutgoingBatchConnection.java @@ -89,6 +89,7 @@ class OutgoingBatchConnection { } // Flush the output stream out.flush(); + transport.dispose(true); } catch(DbException e) { if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.getMessage()); transport.dispose(false); @@ -96,7 +97,5 @@ class OutgoingBatchConnection { if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.getMessage()); transport.dispose(false); } - // Success - transport.dispose(true); } } diff --git a/components/net/sf/briar/transport/stream/StreamConnection.java b/components/net/sf/briar/transport/stream/StreamConnection.java index c96467e6c..cfbf1f224 100644 --- a/components/net/sf/briar/transport/stream/StreamConnection.java +++ b/components/net/sf/briar/transport/stream/StreamConnection.java @@ -67,7 +67,7 @@ abstract class StreamConnection implements DatabaseListener { protected final StreamTransportConnection transport; private final Executor dbExecutor, verificationExecutor; - private final AtomicBoolean canSendOffer; + private final AtomicBoolean canSendOffer, disposed; private final BlockingQueue writerTasks; private Collection offered = null; // Locking: this @@ -91,6 +91,7 @@ abstract class StreamConnection implements DatabaseListener { this.contactId = contactId; this.transport = transport; canSendOffer = new AtomicBoolean(false); + disposed = new AtomicBoolean(false); writerTasks = new LinkedBlockingQueue(); } @@ -164,13 +165,14 @@ abstract class StreamConnection implements DatabaseListener { throw new FormatException(); } } - transport.dispose(true); + writerTasks.add(CLOSE); + if(!disposed.getAndSet(true)) transport.dispose(true); } catch(DbException e) { if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.getMessage()); - transport.dispose(false); + if(!disposed.getAndSet(true)) transport.dispose(false); } catch(IOException e) { if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.getMessage()); - transport.dispose(false); + if(!disposed.getAndSet(true)) transport.dispose(false); } } @@ -205,13 +207,13 @@ abstract class StreamConnection implements DatabaseListener { Thread.currentThread().interrupt(); } } - transport.dispose(true); + if(!disposed.getAndSet(true)) transport.dispose(true); } catch(DbException e) { if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.getMessage()); - transport.dispose(false); + if(!disposed.getAndSet(true)) transport.dispose(false); } catch(IOException e) { if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.getMessage()); - transport.dispose(false); + if(!disposed.getAndSet(true)) transport.dispose(false); } finally { db.removeListener(this); }