Close the writer when the reader closes; only dispose of the

connection once.
This commit is contained in:
akwizgran
2011-12-08 00:06:05 +00:00
parent b95753bb24
commit d91f96b5e2
2 changed files with 10 additions and 9 deletions

View File

@@ -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);
}
}

View File

@@ -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<Runnable> writerTasks;
private Collection<MessageId> 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<Runnable>();
}
@@ -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);
}