/*
* 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 );
}
}