From 7dcc98e25c7da0f7eeef93d77d0ead2e5814b019 Mon Sep 17 00:00:00 2001 From: Mohan Embar Date: Fri, 30 Jan 2004 13:43:21 +0000 Subject: * 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 --- libjava/java/net/ServerSocket.java | 12 +++++++++--- libjava/java/net/Socket.java | 10 ++++++++-- 2 files changed, 17 insertions(+), 5 deletions(-) (limited to 'libjava/java/net') 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 ()) -- cgit v1.1