From 6dcd18b9aa78af93366156bb253d4bfaa89a3e8d Mon Sep 17 00:00:00 2001 From: David Daney Date: Tue, 15 Mar 2005 16:46:51 +0000 Subject: [PATCH] natPlainSocketImplPosix.cc (read_helper): Handle count == 0 case. 2005-03-15 David Daney * gnu/java/net/natPlainSocketImplPosix.cc (read_helper): Handle count == 0 case. 2005-03-15 David Daney * java/io/BufferedInputStream.java (available): Use 'in' instead of 'super' for underlying stream access. (close): Ditto. (read(byte[], int, int)): Ditto. (refill): Ditto. (skip): Call skip on underlying stream when possible. From-SVN: r96516 --- libjava/ChangeLog | 14 ++++++++++++ .../gnu/java/net/natPlainSocketImplPosix.cc | 7 +++++- libjava/java/io/BufferedInputStream.java | 22 ++++++++++++++----- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 8cf4b5361eed..59db600596f6 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,17 @@ +2005-03-15 David Daney + + * gnu/java/net/natPlainSocketImplPosix.cc (read_helper): Handle + count == 0 case. + +2005-03-15 David Daney + + * java/io/BufferedInputStream.java (available): Use 'in' instead + of 'super' for underlying stream access. + (close): Ditto. + (read(byte[], int, int)): Ditto. + (refill): Ditto. + (skip): Call skip on underlying stream when possible. + 2005-03-12 Andreas Tobler * stacktrace.cc (GetCallerInfo): Return nothing in case of diff --git a/libjava/gnu/java/net/natPlainSocketImplPosix.cc b/libjava/gnu/java/net/natPlainSocketImplPosix.cc index 46b56bb6efbf..3f1dde9f5a29 100644 --- a/libjava/gnu/java/net/natPlainSocketImplPosix.cc +++ b/libjava/gnu/java/net/natPlainSocketImplPosix.cc @@ -1,4 +1,4 @@ -/* Copyright (C) 2003, 2004 Free Software Foundation +/* Copyright (C) 2003, 2004, 2005 Free Software Foundation This file is part of libgcj. @@ -405,6 +405,11 @@ gnu::java::net::PlainSocketImpl$SocketInputStream::read(jbyteArray buffer, jint static jint read_helper (jint native_fd, jint timeout, jbyte *bytes, jint count) { + // If zero bytes were requested, short circuit so that recv + // doesn't signal EOF. + if (count == 0) + return 0; + // Do timeouts via select. if (timeout > 0 && native_fd >= 0 && native_fd < FD_SETSIZE) { diff --git a/libjava/java/io/BufferedInputStream.java b/libjava/java/io/BufferedInputStream.java index bbb38c437199..ce166b337f4a 100644 --- a/libjava/java/io/BufferedInputStream.java +++ b/libjava/java/io/BufferedInputStream.java @@ -158,7 +158,7 @@ public class BufferedInputStream extends FilterInputStream */ public synchronized int available() throws IOException { - return count - pos + super.available(); + return count - pos + in.available(); } /** @@ -173,7 +173,7 @@ public class BufferedInputStream extends FilterInputStream buf = null; pos = count = 0; markpos = -1; - super.close(); + in.close(); } /** @@ -273,7 +273,7 @@ public class BufferedInputStream extends FilterInputStream off += totalBytesRead; len -= totalBytesRead; - while (len > 0 && super.available() > 0 && refill()) + while (len > 0 && in.available() > 0 && refill()) { int remain = Math.min(count - pos, len); System.arraycopy(buf, pos, b, off, remain); @@ -327,8 +327,18 @@ public class BufferedInputStream extends FilterInputStream while (n > 0L) { - if (pos >= count && !refill()) - break; + if (pos >= count) + { + if (markpos == -1) + { + // Buffer is empty and no mark is set, skip on the + // underlying stream. + n -= in.skip(n); + break; + } + else if (!refill()) + break; + } int numread = (int) Math.min((long) (count - pos), n); pos += numread; @@ -369,7 +379,7 @@ public class BufferedInputStream extends FilterInputStream markpos = 0; } - int numread = super.read(buf, count, bufferSize); + int numread = in.read(buf, count, bufferSize); if (numread <= 0) // EOF return false;