From 531e39762343dc00a415b75c19443bf724daac94 Mon Sep 17 00:00:00 2001 From: Casey Marshall Date: Mon, 25 Sep 2006 21:54:44 +0000 Subject: 2006-09-25 Casey Marshall * gnu/java/nio/FileChannelImpl.java (read): revert back to using `readScattering.' (write): revert back to using `writeGathering.' * vm/reference/gnu/java/nio/VMChannel.java (writeGathering): find the first buffer that has data remaining, and start at that one. --- vm/reference/gnu/java/nio/VMChannel.java | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'vm/reference/gnu/java') 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 "<>"; if (closed) return "<>"; + if (!valid) + return "<>"; return String.valueOf(native_fd); } -- cgit v1.2.1