Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
diff --git a/src/org/jruby/util/io/ChannelStream.java b/src/org/jruby/util/io/ChannelStream.java index 8d7ce20..dc448a4 100644 --- a/src/org/jruby/util/io/ChannelStream.java +++ b/src/org/jruby/util/io/ChannelStream.java @@ -50,7 +50,6 @@ import java.nio.channels.Channel; import java.nio.channels.IllegalBlockingModeException; import java.nio.channels.ReadableByteChannel; import java.nio.channels.SelectableChannel; -import java.nio.channels.SocketChannel; import java.nio.channels.WritableByteChannel; import static java.util.logging.Logger.getLogger; import org.jruby.Finalizable; @@ -579,17 +578,30 @@ public class ChannelStream implements Stream, Finalizable { ReadableByteChannel readChannel = (ReadableByteChannel)descriptor.getChannel(); int read = BUFSIZE; - while (read == BUFSIZE && result.length() != number) { // not complete. try to read more + while (result.length() != number) { + // try to read more buffer.clear(); read = readChannel.read(buffer); buffer.flip(); - if (read == -1) break; + + if (read == -1) { + // if we reach EOF, set EOF flag and bail + eof = true; + break; + } + + if (read == 0) { + // if we read nothing, there's no more available; bail + break; + } + + // append what we read into our buffer and allow the loop to continue int desired = number - result.length(); len = (desired < read) ? desired : read; result.append(buffer, len); } - if (result.length() == 0 && number != 0) throw new java.io.EOFException(); + if (result.length() == 0 && number != 0) throw new EOFException(); return result; }
This paste will be private.
From the Design Piracy series on my blog: