diff options
author | Mohan Embar <gnustuff@thisiscool.com> | 2004-01-30 13:43:21 +0000 |
---|---|---|
committer | Mohan Embar <membar@gcc.gnu.org> | 2004-01-30 13:43:21 +0000 |
commit | 7dcc98e25c7da0f7eeef93d77d0ead2e5814b019 (patch) | |
tree | 49b741adeec23a17d6a07df2869147de34f24174 /libjava | |
parent | d1615643e511bab93bdf275303aab9468505bc79 (diff) | |
download | gcc-7dcc98e25c7da0f7eeef93d77d0ead2e5814b019.zip gcc-7dcc98e25c7da0f7eeef93d77d0ead2e5814b019.tar.gz gcc-7dcc98e25c7da0f7eeef93d77d0ead2e5814b019.tar.bz2 |
* gnu/java/net/PlainSocketImpl.java
(inChannelOperation): New field.
(isInChannelOperation): New accessor.
(setInChannelOperation): New modifier.
* gnu/java/nio/ServerSocketChannelImpl.java
(accept): Set and reset our server socket's PlainSocketImpl's
"in channel operation" indicator before and after delegating
the accept to our server socket.
* gnu/java/nio/SocketChannelImpl.java
(connect): Set and reset our socket's PlainSocketImpl's "in channel
operation" indicator before and after delegating the operation to
our socket.
(read): Likewise.
(write): Likewise.
* java/net/ServerSocket.java (implAccept): Don't throw an
IllegalBlockingModeException if we have a non-blocking
channel which initiated this accept operation.
* java/net/Socket.java (connect): Don't throw an
IllegalBlockingModeException if we have a non-blocking
channel which initiated this connect operation.
* java/nio/channels/spi/AbstractSelectableChannel.java
(configureBlocking): Only call implConfigureBlocking() if
the desired blocking mode is different from our current one.
From-SVN: r76956
Diffstat (limited to 'libjava')
-rw-r--r-- | libjava/ChangeLog | 26 | ||||
-rw-r--r-- | libjava/gnu/java/net/PlainSocketImpl.java | 29 | ||||
-rw-r--r-- | libjava/gnu/java/nio/ServerSocketChannelImpl.java | 10 | ||||
-rw-r--r-- | libjava/gnu/java/nio/SocketChannelImpl.java | 57 | ||||
-rw-r--r-- | libjava/java/net/ServerSocket.java | 12 | ||||
-rw-r--r-- | libjava/java/net/Socket.java | 10 | ||||
-rw-r--r-- | libjava/java/nio/channels/spi/AbstractSelectableChannel.java | 9 |
7 files changed, 127 insertions, 26 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index aa6242f..1376be8 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,29 @@ +2004-01-30 Mohan Embar <gnustuff@thisiscool.com> + + * gnu/java/net/PlainSocketImpl.java + (inChannelOperation): New field. + (isInChannelOperation): New accessor. + (setInChannelOperation): New modifier. + * gnu/java/nio/ServerSocketChannelImpl.java + (accept): Set and reset our server socket's PlainSocketImpl's + "in channel operation" indicator before and after delegating + the accept to our server socket. + * gnu/java/nio/SocketChannelImpl.java + (connect): Set and reset our socket's PlainSocketImpl's "in channel + operation" indicator before and after delegating the operation to + our socket. + (read): Likewise. + (write): Likewise. + * java/net/ServerSocket.java (implAccept): Don't throw an + IllegalBlockingModeException if we have a non-blocking + channel which initiated this accept operation. + * java/net/Socket.java (connect): Don't throw an + IllegalBlockingModeException if we have a non-blocking + channel which initiated this connect operation. + * java/nio/channels/spi/AbstractSelectableChannel.java + (configureBlocking): Only call implConfigureBlocking() if + the desired blocking mode is different from our current one. + 2004-01-29 Mohan Embar <gnustuff@thisiscool.com> * java/io/BufferedReader.java (sbuf): New field. diff --git a/libjava/gnu/java/net/PlainSocketImpl.java b/libjava/gnu/java/net/PlainSocketImpl.java index 8013911..5680fb3 100644 --- a/libjava/gnu/java/net/PlainSocketImpl.java +++ b/libjava/gnu/java/net/PlainSocketImpl.java @@ -1,5 +1,5 @@ /* PlainSocketImpl.java -- Default socket implementation - Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -120,6 +120,33 @@ public final class PlainSocketImpl extends SocketImpl private OutputStream out; /** + * Indicates whether a channel initiated whatever operation + * is being invoked on this socket. + */ + private boolean inChannelOperation; + + /** + * Indicates whether we should ignore whether any associated + * channel is set to non-blocking mode. Certain operations + * throw an <code>IllegalBlockingModeException</code> if the + * associated channel is in non-blocking mode, <i>except</i> + * if the operation is invoked by the channel itself. + */ + public final boolean isInChannelOperation() + { + return inChannelOperation; + } + + /** + * Sets our indicator of whether an I/O operation is being + * initiated by a channel. + */ + public final void setInChannelOperation(boolean b) + { + inChannelOperation = b; + } + + /** * Default do nothing constructor */ public PlainSocketImpl() diff --git a/libjava/gnu/java/nio/ServerSocketChannelImpl.java b/libjava/gnu/java/nio/ServerSocketChannelImpl.java index fd975d2..76e1ce3 100644 --- a/libjava/gnu/java/nio/ServerSocketChannelImpl.java +++ b/libjava/gnu/java/nio/ServerSocketChannelImpl.java @@ -1,5 +1,5 @@ /* ServerSocketChannelImpl.java -- - Copyright (C) 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -69,7 +69,7 @@ public final class ServerSocketChannelImpl extends ServerSocketChannel { return serverSocket.getPlainSocketImpl().getNativeFD(); } - + public void finalizer() { if (connected) @@ -107,6 +107,11 @@ public final class ServerSocketChannelImpl extends ServerSocketChannel try { + begin(); + serverSocket.getPlainSocketImpl().setInChannelOperation(true); + // indicate that a channel is initiating the accept operation + // so that the socket ignores the fact that we might be in + // non-blocking mode. NIOSocket socket = (NIOSocket) serverSocket.accept(); completed = true; return socket.getChannel(); @@ -117,6 +122,7 @@ public final class ServerSocketChannelImpl extends ServerSocketChannel } finally { + serverSocket.getPlainSocketImpl().setInChannelOperation(false); end (completed); } } diff --git a/libjava/gnu/java/nio/SocketChannelImpl.java b/libjava/gnu/java/nio/SocketChannelImpl.java index efb5fec..4df40b4 100644 --- a/libjava/gnu/java/nio/SocketChannelImpl.java +++ b/libjava/gnu/java/nio/SocketChannelImpl.java @@ -1,5 +1,5 @@ /* SocketChannelImpl.java -- - Copyright (C) 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -136,23 +136,35 @@ public final class SocketChannelImpl extends SocketChannel if (((InetSocketAddress) remote).isUnresolved()) throw new UnresolvedAddressException(); - if (isBlocking()) - { - // Do blocking connect. - socket.connect (remote); - return true; - } - - // Do non-blocking connect. try { - socket.connect (remote, NIOConstants.DEFAULT_TIMEOUT); - return true; + socket.getPlainSocketImpl().setInChannelOperation(true); + // indicate that a channel is initiating the accept operation + // so that the socket ignores the fact that we might be in + // non-blocking mode. + + if (isBlocking()) + { + // Do blocking connect. + socket.connect (remote); + return true; + } + + // Do non-blocking connect. + try + { + socket.connect (remote, NIOConstants.DEFAULT_TIMEOUT); + return true; + } + catch (SocketTimeoutException e) + { + connectionPending = true; + return false; + } } - catch (SocketTimeoutException e) + finally { - connectionPending = true; - return false; + socket.getPlainSocketImpl().setInChannelOperation(false); } } @@ -238,12 +250,14 @@ public final class SocketChannelImpl extends SocketChannel try { begin(); + socket.getPlainSocketImpl().setInChannelOperation(true); readBytes = input.read (data, offset, len); completed = true; } finally { end (completed); + socket.getPlainSocketImpl().setInChannelOperation(false); } if (readBytes > 0) @@ -301,7 +315,20 @@ public final class SocketChannelImpl extends SocketChannel } OutputStream output = socket.getOutputStream(); - output.write (data, offset, len); + boolean completed = false; + + try + { + begin(); + socket.getPlainSocketImpl().setInChannelOperation(true); + output.write (data, offset, len); + completed = true; + } + finally + { + end (completed); + socket.getPlainSocketImpl().setInChannelOperation(false); + } if (src.hasArray()) { diff --git a/libjava/java/net/ServerSocket.java b/libjava/java/net/ServerSocket.java index 9a2d82d..a53ebf6 100644 --- a/libjava/java/net/ServerSocket.java +++ b/libjava/java/net/ServerSocket.java @@ -1,5 +1,6 @@ /* ServerSocket.java -- Class for implementing server side sockets - Copyright (C) 1998, 1999, 2000, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004 + Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -345,9 +346,14 @@ public class ServerSocket if (isClosed()) throw new SocketException("ServerSocket is closed"); + // The Sun spec says that if we have an associated channel and + // it is in non-blocking mode, we throw an IllegalBlockingModeException. + // However, in our implementation if the channel itself initiated this + // operation, then we must honor it regardless of its blocking mode. if (getChannel() != null - && !getChannel().isBlocking()) - throw new IllegalBlockingModeException(); + && !getChannel().isBlocking () + && !((PlainSocketImpl) getImpl()).isInChannelOperation()) + throw new IllegalBlockingModeException (); impl.accept(socket.getImpl()); } diff --git a/libjava/java/net/Socket.java b/libjava/java/net/Socket.java index 9322e92..f9cbb7e 100644 --- a/libjava/java/net/Socket.java +++ b/libjava/java/net/Socket.java @@ -1,5 +1,6 @@ /* Socket.java -- Client socket implementation - Copyright (C) 1998, 1999, 2000, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004 + Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -420,8 +421,13 @@ public class Socket if (! (endpoint instanceof InetSocketAddress)) throw new IllegalArgumentException("unsupported address type"); + // The Sun spec says that if we have an associated channel and + // it is in non-blocking mode, we throw an IllegalBlockingModeException. + // However, in our implementation if the channel itself initiated this + // operation, then we must honor it regardless of its blocking mode. if (getChannel() != null - && !getChannel().isBlocking ()) + && !getChannel().isBlocking () + && !((PlainSocketImpl) getImpl()).isInChannelOperation()) throw new IllegalBlockingModeException (); if (!isBound ()) diff --git a/libjava/java/nio/channels/spi/AbstractSelectableChannel.java b/libjava/java/nio/channels/spi/AbstractSelectableChannel.java index 17d6a2e..76c6c2b 100644 --- a/libjava/java/nio/channels/spi/AbstractSelectableChannel.java +++ b/libjava/java/nio/channels/spi/AbstractSelectableChannel.java @@ -1,5 +1,5 @@ /* AbstractSelectableChannel.java - Copyright (C) 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -80,8 +80,11 @@ public abstract class AbstractSelectableChannel extends SelectableChannel { synchronized (blockingLock()) { - implConfigureBlocking(blocking); - this.blocking = blocking; + if (this.blocking != blocking) + { + implConfigureBlocking(blocking); + this.blocking = blocking; + } } return this; |