diff options
| author | membar <membar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-02-03 16:07:24 +0000 |
|---|---|---|
| committer | membar <membar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-02-03 16:07:24 +0000 |
| commit | 0e5e52e6dbbbcfe760182ce407d3bb3713b6582b (patch) | |
| tree | 0f48b5ad32382781358369642827a7d8b293ae29 /libjava/gnu/java/nio | |
| parent | a2cd141b9f3b1abf15e5fdff738fc0160355880a (diff) | |
| download | ppe42-gcc-0e5e52e6dbbbcfe760182ce407d3bb3713b6582b.tar.gz ppe42-gcc-0e5e52e6dbbbcfe760182ce407d3bb3713b6582b.zip | |
* gnu/java/nio/DatagramChannelImpl.java
(inChannelOperation): New field.
(isInChannelOperation): New accessor.
(setInChannelOperation): New modifier.
(receive): Use capacity() - position() of destination
buffer instead of remaining(). Set and reset our "in
channel operation indicator" before and after delegating
the receive to our datagram socket. Removed testing code.
Update destination buffer's current position if it is
backed by a byte array (hasArray() is true).
(send): Set and reset our "in channel operation indicator"
before and after delegating the send to our datagram socket.
Removed testing code. Update source buffer's current position
if it is backed by a byte array (hasArray() is true).
* gnu/java/nio/SocketChannelImpl.java (read(ByteBuffer)):
Use capacity() - position() of destination buffer instead
of remaining().
* java/net/DatagramSocket.java (receive): Don't throw an
IllegalBlockingModeException if we have a non-blocking
channel which initiated this operation.
(send): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@77173 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/gnu/java/nio')
| -rw-r--r-- | libjava/gnu/java/nio/DatagramChannelImpl.java | 57 | ||||
| -rw-r--r-- | libjava/gnu/java/nio/SocketChannelImpl.java | 2 |
2 files changed, 49 insertions, 10 deletions
diff --git a/libjava/gnu/java/nio/DatagramChannelImpl.java b/libjava/gnu/java/nio/DatagramChannelImpl.java index 3531803900a..baeac19deb6 100644 --- a/libjava/gnu/java/nio/DatagramChannelImpl.java +++ b/libjava/gnu/java/nio/DatagramChannelImpl.java @@ -57,6 +57,33 @@ public final class DatagramChannelImpl extends DatagramChannel { private NIODatagramSocket socket; + /** + * Indicates whether this channel initiated whatever operation + * is being invoked on our datagram socket. + */ + private boolean inChannelOperation; + + /** + * Indicates whether our datagram socket should ignore whether + * we are set to non-blocking mode. Certain operations on our + * socket throw an <code>IllegalBlockingModeException</code> if + * we are in non-blocking mode, <i>except</i> if the operation + * is initiated by us. + */ + public final boolean isInChannelOperation() + { + return inChannelOperation; + } + + /** + * Sets our indicator of whether we are initiating an I/O operation + * on our socket. + */ + public final void setInChannelOperation(boolean b) + { + inChannelOperation = b; + } + protected DatagramChannelImpl (SelectorProvider provider) throws IOException { @@ -178,7 +205,7 @@ public final class DatagramChannelImpl extends DatagramChannel try { DatagramPacket packet; - int len = dst.remaining(); + int len = dst.capacity() - dst.position(); if (dst.hasArray()) { @@ -196,23 +223,23 @@ public final class DatagramChannelImpl extends DatagramChannel try { begin(); + setInChannelOperation(true); socket.receive (packet); completed = true; } finally { end (completed); + setInChannelOperation(false); } if (!dst.hasArray()) { dst.put (packet.getData(), packet.getOffset(), packet.getLength()); } - - // FIMXE: remove this testing code. - for (int i = 0; i < packet.getLength(); i++) + else { - System.out.println ("Byte " + i + " has value " + packet.getData() [packet.getOffset() + i]); + dst.position (dst.position() + packet.getLength()); } return packet.getSocketAddress(); @@ -246,13 +273,25 @@ public final class DatagramChannelImpl extends DatagramChannel DatagramPacket packet = new DatagramPacket (buffer, offset, len, target); - // FIMXE: remove this testing code. - for (int i = 0; i < packet.getLength(); i++) + boolean completed = false; + try + { + begin(); + setInChannelOperation(true); + socket.send(packet); + completed = true; + } + finally + { + end (completed); + setInChannelOperation(false); + } + + if (src.hasArray()) { - System.out.println ("Byte " + i + " has value " + packet.getData() [packet.getOffset() + i]); + src.position (src.position() + len); } - socket.send (packet); return len; } } diff --git a/libjava/gnu/java/nio/SocketChannelImpl.java b/libjava/gnu/java/nio/SocketChannelImpl.java index 4df40b481a6..d490529f873 100644 --- a/libjava/gnu/java/nio/SocketChannelImpl.java +++ b/libjava/gnu/java/nio/SocketChannelImpl.java @@ -226,7 +226,7 @@ public final class SocketChannelImpl extends SocketChannel int offset = 0; InputStream input = socket.getInputStream(); int available = input.available(); - int len = dst.remaining(); + int len = dst.capacity() - dst.position(); if (available == 0) return 0; |

