diff options
Diffstat (limited to 'vm')
-rw-r--r-- | vm/reference/gnu/java/nio/VMChannel.java | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/vm/reference/gnu/java/nio/VMChannel.java b/vm/reference/gnu/java/nio/VMChannel.java index ab09ef801..520a6f4d5 100644 --- a/vm/reference/gnu/java/nio/VMChannel.java +++ b/vm/reference/gnu/java/nio/VMChannel.java @@ -196,7 +196,7 @@ public final class VMChannel { if (offset + length > dsts.length) throw new IndexOutOfBoundsException("offset + length > dsts.length"); - + return readScattering(nfd.getNativeFD(), dsts, offset, length); } @@ -275,6 +275,21 @@ public final class VMChannel if (offset + length > srcs.length) throw new IndexOutOfBoundsException("offset + length > srcs.length"); + // A gathering write is limited to 16 buffers; when writing, ensure + // that we have at least one buffer with something in it in the 16 + // buffer window starting at offset. + while (!srcs[offset].hasRemaining() && offset < srcs.length) + offset++; + + // There are no buffers with anything to write. + if (offset == srcs.length) + return 0; + + // If we advanced `offset' so far that we don't have `length' + // buffers left, reset length to only the remaining buffers. + if (length > srcs.length - offset) + length = srcs.length - offset; + return writeGathering(nfd.getNativeFD(), srcs, offset, length); } @@ -673,10 +688,10 @@ public final class VMChannel public String toString() { - if (!valid) - return "<<invalid>>"; if (closed) return "<<closed>>"; + if (!valid) + return "<<invalid>>"; return String.valueOf(native_fd); } |