Commit 8696d927 by Mohan Embar Committed by Mohan Embar

* 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.

From-SVN: r77173
parent 9b66ebb1
2004-02-03 Mohan Embar <gnustuff@thisiscool.com>
* 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.
2004-02-01 Thomas Fitzsimmons <fitzsim@redhat.com> 2004-02-01 Thomas Fitzsimmons <fitzsim@redhat.com>
* configure.in: Add pkgconfig check for glib and gthread. * configure.in: Add pkgconfig check for glib and gthread.
......
...@@ -57,6 +57,33 @@ public final class DatagramChannelImpl extends DatagramChannel ...@@ -57,6 +57,33 @@ public final class DatagramChannelImpl extends DatagramChannel
{ {
private NIODatagramSocket socket; 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) protected DatagramChannelImpl (SelectorProvider provider)
throws IOException throws IOException
{ {
...@@ -178,7 +205,7 @@ public final class DatagramChannelImpl extends DatagramChannel ...@@ -178,7 +205,7 @@ public final class DatagramChannelImpl extends DatagramChannel
try try
{ {
DatagramPacket packet; DatagramPacket packet;
int len = dst.remaining(); int len = dst.capacity() - dst.position();
if (dst.hasArray()) if (dst.hasArray())
{ {
...@@ -196,23 +223,23 @@ public final class DatagramChannelImpl extends DatagramChannel ...@@ -196,23 +223,23 @@ public final class DatagramChannelImpl extends DatagramChannel
try try
{ {
begin(); begin();
setInChannelOperation(true);
socket.receive (packet); socket.receive (packet);
completed = true; completed = true;
} }
finally finally
{ {
end (completed); end (completed);
setInChannelOperation(false);
} }
if (!dst.hasArray()) if (!dst.hasArray())
{ {
dst.put (packet.getData(), packet.getOffset(), packet.getLength()); dst.put (packet.getData(), packet.getOffset(), packet.getLength());
} }
else
// FIMXE: remove this testing code.
for (int i = 0; i < packet.getLength(); i++)
{ {
System.out.println ("Byte " + i + " has value " + packet.getData() [packet.getOffset() + i]); dst.position (dst.position() + packet.getLength());
} }
return packet.getSocketAddress(); return packet.getSocketAddress();
...@@ -246,13 +273,25 @@ public final class DatagramChannelImpl extends DatagramChannel ...@@ -246,13 +273,25 @@ public final class DatagramChannelImpl extends DatagramChannel
DatagramPacket packet = new DatagramPacket (buffer, offset, len, target); DatagramPacket packet = new DatagramPacket (buffer, offset, len, target);
// FIMXE: remove this testing code. boolean completed = false;
for (int i = 0; i < packet.getLength(); i++) 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; return len;
} }
} }
...@@ -226,7 +226,7 @@ public final class SocketChannelImpl extends SocketChannel ...@@ -226,7 +226,7 @@ public final class SocketChannelImpl extends SocketChannel
int offset = 0; int offset = 0;
InputStream input = socket.getInputStream(); InputStream input = socket.getInputStream();
int available = input.available(); int available = input.available();
int len = dst.remaining(); int len = dst.capacity() - dst.position();
if (available == 0) if (available == 0)
return 0; return 0;
......
...@@ -39,6 +39,7 @@ exception statement from your version. */ ...@@ -39,6 +39,7 @@ exception statement from your version. */
package java.net; package java.net;
import gnu.java.net.PlainDatagramSocketImpl; import gnu.java.net.PlainDatagramSocketImpl;
import gnu.java.nio.DatagramChannelImpl;
import java.io.IOException; import java.io.IOException;
import java.nio.channels.DatagramChannel; import java.nio.channels.DatagramChannel;
import java.nio.channels.IllegalBlockingModeException; import java.nio.channels.IllegalBlockingModeException;
...@@ -565,7 +566,8 @@ public class DatagramSocket ...@@ -565,7 +566,8 @@ public class DatagramSocket
("Socket connected to a multicast address my not receive"); ("Socket connected to a multicast address my not receive");
if (getChannel() != null if (getChannel() != null
&& !getChannel().isBlocking ()) && !getChannel().isBlocking ()
&& !((DatagramChannelImpl) getChannel()).isInChannelOperation())
throw new IllegalBlockingModeException (); throw new IllegalBlockingModeException ();
getImpl().receive(p); getImpl().receive(p);
...@@ -618,7 +620,8 @@ public class DatagramSocket ...@@ -618,7 +620,8 @@ public class DatagramSocket
// use getTimeToLive for TTL val. // use getTimeToLive for TTL val.
if (getChannel() != null if (getChannel() != null
&& !getChannel().isBlocking ()) && !getChannel().isBlocking ()
&& !((DatagramChannelImpl) getChannel()).isInChannelOperation())
throw new IllegalBlockingModeException (); throw new IllegalBlockingModeException ();
getImpl().send(p); getImpl().send(p);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment