/* * Copyright 2009 Red Hat, Inc. * Red Hat licenses this file to you under the Apache License, version 2.0 * (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at: * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package org.jboss.netty.channel.socket.nio; import static org.jboss.netty.channel.Channels.fireChannelOpen; import java.io.IOException; import java.nio.channels.SocketChannel; import org.apache.log4j.Logger; import org.jboss.netty.channel.ChannelException; import org.jboss.netty.channel.ChannelFactory; import org.jboss.netty.channel.ChannelFuture; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelSink; /** * * @author The Netty Project (netty-dev@lists.jboss.org) * @author Trustin Lee (tlee@redhat.com) * * @version $Rev: 1685 $, $Date: 2009-08-28 03:15:49 -0400 (Fri, 28 Aug 2009) $ * */ final class NioClientSocketChannel extends NioSocketChannel { private static final Logger logger = Logger.getLogger( NioClientSocketChannel.class ); private static SocketChannel newSocket( ) { SocketChannel socket; try { socket = SocketChannel.open( ); } catch ( IOException e ) { throw new ChannelException( "Failed to open a socket.", e ); } boolean success = false; try { socket.configureBlocking( false ); success = true; } catch ( IOException e ) { throw new ChannelException( "Failed to enter non-blocking mode.", e ); } finally { if ( !success ) { try { socket.close( ); } catch ( IOException e ) { logger.warn( "Failed to close a partially initialized socket.", e ); } } } return socket; } volatile ChannelFuture connectFuture; volatile boolean boundManually; // Does not need to be volatile as it's accessed by only one thread. long connectDeadlineNanos; NioClientSocketChannel( ChannelFactory factory, ChannelPipeline pipeline, ChannelSink sink, NioWorker worker ) { super( null, factory, pipeline, sink, newSocket( ), worker ); fireChannelOpen( this ); } }