[prev in list] [next in list] [prev in thread] [next in thread]
List: activemq-commits
Subject: svn commit: r938581 - in
From: tabish () apache ! org
Date: 2010-04-27 17:59:35
Message-ID: 20100427175935.88617238896F () eris ! apache ! org
[Download RAW message or body]
Author: tabish
Date: Tue Apr 27 17:59:34 2010
New Revision: 938581
URL: http://svn.apache.org/viewvc?rev=938581&view=rev
Log:
More work on adding new Socket tests, additional fixes to Socket connect to deal with \
timeout options for connect. Removed some work in ServerSocket, APR can't seem to \
handle timeout on accept without the use of the polling mechanism which can't seem to \
be interrupted from another thread which can lead to segfaults in close operations if \
the accept hasn't timed out.
Modified:
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.cpp
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.h
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/ServerSocket.cpp
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/ServerSocket.h
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/Socket.cpp
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/Socket.h
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/SocketImpl.h
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.cpp?rev=938581&r1=938580&r2=938581&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.cpp \
(original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.cpp \
Tue Apr 27 17:59:34 2010 @@ -63,7 +63,6 @@ TcpSocket::TcpSocket() throw ( SocketExc
: socketHandle( NULL ),
localAddress( NULL ),
remoteAddress( NULL ),
- pollSet( NULL ),
inputStream( NULL ),
outputStream( NULL ),
inputShutdown( false ),
@@ -110,9 +109,6 @@ void TcpSocket::create() throw( decaf::i
// Create the actual socket.
checkResult( apr_socket_create( &socketHandle, AF_INET, SOCK_STREAM,
APR_PROTO_TCP, apr_pool.getAprPool() ) );
-
- // Create the pollset for the socket.
- checkResult( apr_pollset_create( &pollSet, 1, apr_pool.getAprPool(), \
APR_POLLSET_NOCOPY ) ); }
DECAF_CATCH_RETHROW( decaf::io::IOException )
DECAF_CATCH_EXCEPTION_CONVERT( Exception, decaf::io::IOException )
@@ -120,7 +116,8 @@ void TcpSocket::create() throw( decaf::i
}
////////////////////////////////////////////////////////////////////////////////
-void TcpSocket::accept( SocketImpl* socket ) throw( decaf::io::IOException ) {
+void TcpSocket::accept( SocketImpl* socket )
+ throw( decaf::io::IOException ) {
try{
@@ -137,49 +134,6 @@ void TcpSocket::accept( SocketImpl* sock
apr_status_t result = APR_SUCCESS;
- if( this->soTimeout == -1 ) {
-
- // ensure we are in a blocking accept mode.
- apr_socket_opt_set( socketHandle, APR_SO_NONBLOCK, 0 );
- apr_socket_timeout_set( socketHandle, -1 );
-
- } else {
-
- // ensure we are in a non-blocking accept mode.
- apr_socket_opt_set( socketHandle, APR_SO_NONBLOCK, 1 );
- apr_socket_timeout_set( socketHandle, 0 );
-
- int num = 0;
- const apr_pollfd_t* signalled = NULL;
- apr_pollfd_t pfd = { apr_pool.getAprPool(),
- APR_POLL_SOCKET,
- APR_POLLIN | APR_POLLERR,
- 0, { NULL }, NULL };
-
- pfd.desc.s = socketHandle;
-
- // Add the socket to pollset to check APR_POLLOUT(writable)
- apr_pollset_add( pollSet, &pfd );
-
- // Poll for the specified timeout, the value in APR is taken as \
Microseconds.
- result = apr_pollset_poll( pollSet, soTimeout * 1000, &num, &signalled \
);
-
- // Check for async close event.
- if( closed ) {
- return;
- }
-
- // Remove the socket from the pollset now.
- apr_pollset_remove( pollSet, &pfd );
-
- if( result == APR_TIMEUP ) {
- close();
- throw SocketTimeoutException(
- __FILE__, __LINE__,
- "Timed out while waiting for Socket to Connect." );
- }
- }
-
// Loop to ignore any signal interruptions that occur during the operation.
do {
result = apr_socket_accept( &impl->socketHandle, socketHandle, \
apr_pool.getAprPool() ); @@ -226,7 +180,7 @@ void TcpSocket::bind( const std::string&
SocketError::getErrorString().c_str() );
}
- // Set the socket to reuse the address and default as blocking
+ // Set the socket to reuse the address and default as blocking with no \
timeout. apr_socket_opt_set( socketHandle, APR_SO_REUSEADDR, 1 );
apr_socket_opt_set( socketHandle, APR_SO_NONBLOCK, 0 );
apr_socket_timeout_set( socketHandle, -1 );
@@ -259,7 +213,6 @@ void TcpSocket::bind( const std::string&
////////////////////////////////////////////////////////////////////////////////
void TcpSocket::connect( const std::string& hostname, int port, int timeout )
throw( decaf::io::IOException,
- decaf::net::SocketTimeoutException,
decaf::lang::exceptions::IllegalArgumentException ) {
try{
@@ -285,59 +238,19 @@ void TcpSocket::connect( const std::stri
apr_socket_opt_get( socketHandle, APR_SO_NONBLOCK, &oldNonblockSetting );
apr_socket_timeout_get( socketHandle, &oldTimeoutSetting );
+ // Temporarily make it what we want, blocking.
+ apr_socket_opt_set( socketHandle, APR_SO_NONBLOCK, 0 );
+
// Timeout and non-timeout case require very different logic.
if( timeout <= 0 ) {
-
- // Temporarily make it what we want, blocking with no timeout.
- apr_socket_opt_set( socketHandle, APR_SO_NONBLOCK, 0 );
apr_socket_timeout_set( socketHandle, -1 );
-
- // try to Connect to the provided address.
- checkResult( apr_socket_connect( socketHandle, remoteAddress ) );
-
} else {
-
- // Temporarily make it what we want, blocking with no timeout.
- apr_socket_opt_set( socketHandle, APR_SO_NONBLOCK, 1 );
- apr_socket_timeout_set( socketHandle, 0 );
-
- apr_status_t result = apr_socket_connect( socketHandle, remoteAddress );
-
- // Special case, it connected, usually doesn't happen.
- if( result == APR_SUCCESS ) {
- return;
- } else if( APR_STATUS_IS_EINPROGRESS( result ) ) {
-
- int num = 0;
- const apr_pollfd_t* signalled = NULL;
- apr_pollfd_t pfd = { apr_pool.getAprPool(), APR_POLL_SOCKET, \
APR_POLLOUT, 0, { NULL }, NULL };
-
- pfd.desc.s = socketHandle;
-
- // Add the socket to pollset to check APR_POLLOUT(writable)
- apr_pollset_add( pollSet, &pfd );
-
- // Poll for the specified timeout, the value in APR is taken as \
Microseconds.
- result = apr_pollset_poll( pollSet, timeout * 1000, &num, &signalled \
);
-
- // Remove the socket from the pollset now.
- apr_pollset_remove( pollSet, &pfd );
-
- if( result != APR_SUCCESS || num == 0 ) {
- close();
- throw SocketTimeoutException(
- __FILE__, __LINE__,
- "Timed out while waiting for Socket to Connect." );
- }
-
- } else {
- close();
- throw SocketException(
- __FILE__, __LINE__, "Error while attempting to connect to remote \
host.",
- SocketError::getErrorString().c_str() );
- }
+ apr_socket_timeout_set( socketHandle, timeout * 1000 );
}
+ // try to Connect to the provided address.
+ checkResult( apr_socket_connect( socketHandle, remoteAddress ) );
+
// Now that we are connected, we want to go back to old settings.
apr_socket_opt_set( socketHandle, APR_SO_NONBLOCK, oldNonblockSetting );
apr_socket_timeout_set( socketHandle, oldTimeoutSetting );
@@ -494,12 +407,6 @@ void TcpSocket::close() throw( decaf::io
apr_socket_close( socketHandle );
socketHandle = NULL;
}
-
- // Destroy the pollset
- if( pollSet != NULL ) {
- apr_pollset_destroy( pollSet );
- pollSet = NULL;
- }
}
DECAF_CATCH_RETHROW( decaf::io::IOException )
DECAF_CATCH_EXCEPTION_CONVERT( Exception, decaf::io::IOException )
@@ -584,6 +491,7 @@ void TcpSocket::setOption( int option, i
apr_int32_t aprId = 0;
if( option == SocketOptions::SOCKET_OPTION_TIMEOUT ) {
+ checkResult( apr_socket_opt_set( socketHandle, APR_SO_NONBLOCK, 0 ) );
// Time in APR for sockets is in microseconds so multiply by 1000.
checkResult( apr_socket_timeout_set( socketHandle, value * 1000 ) );
this->soTimeout = value;
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.h?rev=938581&r1=938580&r2=938581&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.h \
(original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.h \
Tue Apr 27 17:59:34 2010 @@ -25,7 +25,6 @@
#include <decaf/internal/AprPool.h>
#include <apr_network_io.h>
-#include <apr_poll.h>
#include <decaf/io/IOException.h>
#include <decaf/net/SocketTimeoutException.h>
@@ -80,11 +79,6 @@ namespace tcp {
SocketAddress remoteAddress;
/**
- * APR Pollset used for connect and accept when soTimeout is set.
- */
- apr_pollset_t* pollSet;
-
- /**
* The input stream for reading this socket.
*/
TcpSocketInputStream* inputStream;
@@ -168,7 +162,8 @@ namespace tcp {
/**
* {@inheritDoc}
*/
- virtual void accept( SocketImpl* socket ) throw( decaf::io::IOException );
+ virtual void accept( SocketImpl* socket )
+ throw( decaf::io::IOException );
/**
* {@inheritDoc}
@@ -181,7 +176,6 @@ namespace tcp {
*/
virtual void connect( const std::string& hostname, int port, int timeout )
throw( decaf::io::IOException,
- decaf::net::SocketTimeoutException,
decaf::lang::exceptions::IllegalArgumentException );
/**
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/ServerSocket.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/ServerSocket.cpp?rev=938581&r1=938580&r2=938581&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/ServerSocket.cpp \
(original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/ServerSocket.cpp Tue \
Apr 27 17:59:34 2010 @@ -196,7 +196,7 @@ bool ServerSocket::isClosed() const {
}
////////////////////////////////////////////////////////////////////////////////
-Socket* ServerSocket::accept() throw( decaf::io::IOException, \
decaf::net::SocketTimeoutException ) { +Socket* ServerSocket::accept() throw( \
decaf::io::IOException ) {
checkClosed();
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/ServerSocket.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/ServerSocket.h?rev=938581&r1=938580&r2=938581&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/ServerSocket.h \
(original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/ServerSocket.h Tue \
Apr 27 17:59:34 2010 @@ -205,10 +205,10 @@ namespace net{
* the caller and must be explicitly freed by them.
*
* @throws IOException if an I/O error occurs while binding the socket.
+ * @throws SocketException if an error occurs while blocking on the accept \
call.
* @throws SocketTimeoutException if the SO_TIMEOUT option was used and the \
accept timed out.
*/
- Socket* accept()
- throw( decaf::io::IOException, decaf::net::SocketTimeoutException );
+ Socket* accept() throw( decaf::io::IOException );
/**
* Closes the server socket, causing any Threads blocked on an accept call \
to
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/Socket.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/Socket.cpp?rev=938581&r1=938580&r2=938581&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/Socket.cpp (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/Socket.cpp Tue Apr 27 \
17:59:34 2010 @@ -222,7 +222,6 @@ void Socket::connect( const std::string&
////////////////////////////////////////////////////////////////////////////////
void Socket::connect( const std::string& host, int port, int timeout )
throw( decaf::io::IOException,
- decaf::net::SocketTimeoutException,
decaf::lang::exceptions::IllegalArgumentException ) {
checkClosed();
@@ -261,7 +260,6 @@ void Socket::connect( const std::string&
throw ex;
}
}
- DECAF_CATCH_RETHROW( SocketTimeoutException )
DECAF_CATCH_RETHROW( IOException )
DECAF_CATCH_RETHROW( IllegalArgumentException )
DECAF_CATCH_EXCEPTION_CONVERT( Exception, IOException )
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/Socket.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/Socket.h?rev=938581&r1=938580&r2=938581&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/Socket.h (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/Socket.h Tue Apr 27 \
17:59:34 2010 @@ -179,7 +179,6 @@ namespace net{
*/
virtual void connect( const std::string& host, int port, int timeout )
throw( decaf::io::IOException,
- decaf::net::SocketTimeoutException,
decaf::lang::exceptions::IllegalArgumentException );
/**
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/SocketImpl.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/SocketImpl.h?rev=938581&r1=938580&r2=938581&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/SocketImpl.h \
(original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/net/SocketImpl.h Tue Apr \
27 17:59:34 2010 @@ -25,6 +25,7 @@
#include <decaf/io/OutputStream.h>
#include <decaf/net/SocketException.h>
+#include <decaf/net/SocketTimeoutException.h>
#include <decaf/net/SocketOptions.h>
#include <string>
@@ -67,8 +68,13 @@ namespace net {
* The accepted connection.
*
* @throws IOException if an I/O error occurs while attempting this \
operation. + * @throws SocketException if an error occurs while performing an \
Accept on the socket. + * @throws SocketTimeoutException if the accept call \
times out due to SO_TIMEOUT being set.
*/
- virtual void accept( SocketImpl* socket ) throw( decaf::io::IOException ) = \
0; + virtual void accept( SocketImpl* socket )
+ throw( decaf::io::IOException,
+ decaf::net::SocketException,
+ decaf::net::SocketTimeoutException ) = 0;
/**
* Connects this socket to the given host and port.
@@ -81,10 +87,12 @@ namespace net {
* Time in milliseconds to wait for a connection, 0 indicates forever.
*
* @throws IOException if an I/O error occurs while attempting this \
operation. + * @throws SocketTimeoutException if the connect call times out \
due to timeout being set.
* @throws IllegalArguementException if a parameter has an illegal value.
*/
virtual void connect( const std::string& hostname, int port, int timeout )
throw( decaf::io::IOException,
+ decaf::net::SocketTimeoutException,
decaf::lang::exceptions::IllegalArgumentException ) = 0;
/**
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic