summaryrefslogtreecommitdiff
path: root/vm
diff options
context:
space:
mode:
Diffstat (limited to 'vm')
-rw-r--r--vm/reference/gnu/java/nio/VMChannel.java21
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);
}