From 0af0ce8469f68721d52a75e834d68413b69795a9 Mon Sep 17 00:00:00 2001 From: Mike Thomas Date: Fri, 7 Mar 2008 20:09:13 +0000 Subject: [PATCH] Re-instate the interrupt() but setup some additional exception handling so we don't spew to the logs unnecessarily due to this. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4962 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../presents/client/BlockingCommunicator.java | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/src/java/com/threerings/presents/client/BlockingCommunicator.java b/src/java/com/threerings/presents/client/BlockingCommunicator.java index 5ee61f763..533bdceac 100644 --- a/src/java/com/threerings/presents/client/BlockingCommunicator.java +++ b/src/java/com/threerings/presents/client/BlockingCommunicator.java @@ -25,6 +25,8 @@ import java.io.EOFException; import java.io.IOException; import java.io.InterruptedIOException; import java.nio.ByteBuffer; +import java.nio.channels.ClosedByInterruptException; +import java.nio.channels.ClosedChannelException; import java.nio.channels.SocketChannel; import java.net.ConnectException; @@ -300,14 +302,21 @@ public class BlockingCommunicator extends Communicator String txt = StringUtil.truncate(String.valueOf(msg), 80, "..."); Log.info("Whoa, writin' a big one [msg=" + txt + ", size=" + buffer.limit() + "]."); } - int wrote = _channel.write(buffer); - if (wrote != buffer.limit()) { - Log.warning("Aiya! Couldn't write entire message [msg=" + msg + - ", size=" + buffer.limit() + ", wrote=" + wrote + "]."); -// } else { -// Log.info("Wrote " + wrote + " bytes."); - } + try { + int wrote = _channel.write(buffer); + if (wrote != buffer.limit()) { + Log.warning("Aiya! Couldn't write entire message [msg=" + msg + + ", size=" + buffer.limit() + ", wrote=" + wrote + "]."); +// } else { +// Log.info("Wrote " + wrote + " bytes."); + } + } catch (ClosedChannelException cce) { + // If we weren't expecting it, throw it on. + if (!_interrupted) { + throw cce; + } + } } finally { _fout.resetFrame(); } @@ -462,6 +471,10 @@ public class BlockingCommunicator extends Communicator // process the message processMessage(msg); + } catch (ClosedByInterruptException cbie) { + // somebody set up us the bomb! we've been interrupted which means that we're being + // shut down, so we just report it and return from iterate() like a good monkey + Log.debug("Reader thread woken up in time to die."); } catch (InterruptedIOException iioe) { // somebody set up us the bomb! we've been interrupted which means that we're being @@ -501,11 +514,11 @@ public class BlockingCommunicator extends Communicator { // we want to interrupt the reader thread as it may be blocked listening to the socket; // this is only called if the reader thread doesn't shut itself down - - // While it would be nice to be able to handle wacky cases requiring reader-side - // shutdown, doing so causes consternation on the other end's writer which suddenly - // loses its connection. So, we rely on the writer side to take us down. - // interrupt(); + + // Note that we're the ones in control of the interruption, and then do it to get our + // reader out of waiting for the rest of a readFrame if necessary. + _interrupted = true; + interrupt(); } } @@ -582,4 +595,7 @@ public class BlockingCommunicator extends Communicator protected ClientDObjectMgr _omgr; protected ClassLoader _loader; + + /** Whether or not we have interrupted our reader. */ + protected boolean _interrupted; }