diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llmessage/lliosocket.cpp | 26 | ||||
| -rw-r--r-- | indra/llmessage/lliosocket.h | 11 | 
2 files changed, 30 insertions, 7 deletions
| diff --git a/indra/llmessage/lliosocket.cpp b/indra/llmessage/lliosocket.cpp index ca84fa8bb8..8c752fbe30 100644 --- a/indra/llmessage/lliosocket.cpp +++ b/indra/llmessage/lliosocket.cpp @@ -191,7 +191,7 @@ LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port)  		port = PORT_EPHEMERAL;  	}  	rv->mPort = port; -	rv->setOptions(); +	rv->setNonBlocking();  	return rv;  } @@ -206,7 +206,7 @@ LLSocket::ptr_t LLSocket::create(apr_socket_t* socket, apr_pool_t* pool)  	}  	rv = ptr_t(new LLSocket(socket, pool));  	rv->mPort = PORT_EPHEMERAL; -	rv->setOptions(); +	rv->setNonBlocking();  	return rv;  } @@ -227,10 +227,10 @@ bool LLSocket::blockingConnect(const LLHost& host)  	{  		return false;  	} -	apr_socket_timeout_set(mSocket, 1000); +	setBlocking(1000);  	ll_debug_socket("Blocking connect", mSocket);  	if(ll_apr_warn_status(apr_socket_connect(mSocket, sa))) return false; -	setOptions(); +	setNonBlocking();  	return true;  } @@ -258,11 +258,27 @@ LLSocket::~LLSocket()  	}  } -void LLSocket::setOptions() +// See http://dev.ariel-networks.com/apr/apr-tutorial/html/apr-tutorial-13.html#ss13.4 +// for an explanation of how to get non-blocking sockets and timeouts with +// consistent behavior across platforms. + +void LLSocket::setBlocking(S32 timeout) +{ +	LLMemType m1(LLMemType::MTYPE_IO_TCP); +	// set up the socket options +	ll_apr_warn_status(apr_socket_timeout_set(mSocket, timeout)); +	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_NONBLOCK, 0)); +	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_SNDBUF, LL_SEND_BUFFER_SIZE)); +	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_RCVBUF, LL_RECV_BUFFER_SIZE)); + +} + +void LLSocket::setNonBlocking()  {  	LLMemType m1(LLMemType::MTYPE_IO_TCP);  	// set up the socket options  	ll_apr_warn_status(apr_socket_timeout_set(mSocket, 0)); +	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_NONBLOCK, 1));  	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_SNDBUF, LL_SEND_BUFFER_SIZE));  	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_RCVBUF, LL_RECV_BUFFER_SIZE)); diff --git a/indra/llmessage/lliosocket.h b/indra/llmessage/lliosocket.h index 6806e5084a..e0f6c1e34d 100644 --- a/indra/llmessage/lliosocket.h +++ b/indra/llmessage/lliosocket.h @@ -153,9 +153,16 @@ protected:  	LLSocket(apr_socket_t* socket, apr_pool_t* pool);  	/**  -	 * @brief Set default socket options. +	 * @brief Set default socket options, with SO_NONBLOCK = 0 and a timeout in us. +	 * @param timeout Number of microseconds to wait on this socket. Any +	 * negative number means block-forever. TIMEOUT OF 0 IS NON-PORTABLE.  	 */ -	void setOptions(); +	void setBlocking(S32 timeout); + +	/** +	 * @brief Set default socket options, with SO_NONBLOCK = 1 and timeout = 0. +	 */ +	void setNonBlocking();  public:  	/**  | 
