diff options
author | Casey Marshall <csm@gnu.org> | 2006-09-25 21:54:44 +0000 |
---|---|---|
committer | Casey Marshall <csm@gnu.org> | 2006-09-25 21:54:44 +0000 |
commit | 531e39762343dc00a415b75c19443bf724daac94 (patch) | |
tree | 789a82b6d151635a636a51b64b505d97e1f44084 /vm | |
parent | 5427bd2e19fc5d53c18777df0178d8c91cf913d2 (diff) | |
download | classpath-531e39762343dc00a415b75c19443bf724daac94.tar.gz |
2006-09-25 Casey Marshall <csm@gnu.org>
* 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.
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); } |