diff options
author | Steve Huston <shuston@riverace.com> | 2020-06-29 08:12:07 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-29 08:12:07 -0400 |
commit | 885ffbb0d51c93cec57ff50433ad95e8b79e6a32 (patch) | |
tree | 581cfaeec318cf7f8d42265a71169269953d85b3 | |
parent | 7cf3f1283ef8a4901d8962e7f951ada8252288ce (diff) | |
parent | 98ab6f28e5230f5561182c9914801d6d3a83b2bd (diff) | |
download | ATCD-885ffbb0d51c93cec57ff50433ad95e8b79e6a32.tar.gz |
Merge pull request #1044 from johnjanthony/Replace-select-with-poll-in-SOCK-Connector-and-Acceptor
Replacing use of ::select in favor of ::poll
-rw-r--r-- | ACE/ace/SSL/SSL_SOCK_Acceptor.cpp | 48 | ||||
-rw-r--r-- | ACE/ace/SSL/SSL_SOCK_Connector.cpp | 35 |
2 files changed, 80 insertions, 3 deletions
diff --git a/ACE/ace/SSL/SSL_SOCK_Acceptor.cpp b/ACE/ace/SSL/SSL_SOCK_Acceptor.cpp index 9ec3d58e9a2..63f6d9bdc99 100644 --- a/ACE/ace/SSL/SSL_SOCK_Acceptor.cpp +++ b/ACE/ace/SSL/SSL_SOCK_Acceptor.cpp @@ -10,6 +10,11 @@ #include "ace/Countdown_Time.h" #include "ace/Truncate.h" + +#if defined (ACE_HAS_POLL) +# include "ace/OS_NS_poll.h" +#endif /* ACE_HAS_POLL */ + #if !defined (__ACE_INLINE__) #include "SSL_SOCK_Acceptor.inl" #endif /* __ACE_INLINE__ */ @@ -64,10 +69,16 @@ ACE_SSL_SOCK_Acceptor::ssl_accept (ACE_SSL_SOCK_Stream &new_stream, int status; do { +#if defined (ACE_HAS_POLL) + struct pollfd fds; + ACE_OS::memset(&fds, 0, sizeof(fds)); + fds.revents = 0; +#else // These handle sets are used to set up for whatever SSL_accept // says it wants next. They're reset on each pass around the loop. ACE_Handle_Set rd_handle; ACE_Handle_Set wr_handle; +#endif /* ACE_HAS_POLL */ status = ::SSL_accept (ssl); switch (::SSL_get_error (ssl, status)) @@ -77,12 +88,22 @@ ACE_SSL_SOCK_Acceptor::ssl_accept (ACE_SSL_SOCK_Stream &new_stream, break; // Done case SSL_ERROR_WANT_WRITE: +#if defined (ACE_HAS_POLL) + fds.fd = handle; + fds.events = POLLOUT; +#else wr_handle.set_bit (handle); +#endif /* ACE_HAS_POLL */ status = 1; // Wait for more activity break; case SSL_ERROR_WANT_READ: +#if defined (ACE_HAS_POLL) + fds.fd = handle; + fds.events = POLLIN; +#else rd_handle.set_bit (handle); +#endif /* ACE_HAS_POLL */ status = 1; // Wait for more activity break; @@ -110,11 +131,27 @@ ACE_SSL_SOCK_Acceptor::ssl_accept (ACE_SSL_SOCK_Stream &new_stream, // Use that to decide what to do. status = 1; // Wait for more activity if (SSL_want_write (ssl)) - wr_handle.set_bit (handle); + { +#if defined (ACE_HAS_POLL) + fds.fd = handle; + fds.events = POLLOUT; +#else + wr_handle.set_bit (handle); +#endif /* ACE_HAS_POLL */ + } else if (SSL_want_read (ssl)) - rd_handle.set_bit (handle); + { +#if defined (ACE_HAS_POLL) + fds.fd = handle; + fds.events = POLLIN; +#else + rd_handle.set_bit (handle); +#endif /* ACE_HAS_POLL */ + } else - status = -1; // Doesn't want anything - bail out + { + status = -1; // Doesn't want anything - bail out + } } else status = -1; @@ -128,6 +165,10 @@ ACE_SSL_SOCK_Acceptor::ssl_accept (ACE_SSL_SOCK_Stream &new_stream, if (status == 1) { +#if defined (ACE_HAS_POLL) + ACE_ASSERT(fds.fd != 0); + status = ACE_OS::poll(&fds, 1, timeout); +#else // Must have at least one handle to wait for at this point. ACE_ASSERT (rd_handle.num_set() == 1 || wr_handle.num_set () == 1); status = ACE::select (int (handle) + 1, @@ -135,6 +176,7 @@ ACE_SSL_SOCK_Acceptor::ssl_accept (ACE_SSL_SOCK_Stream &new_stream, &wr_handle, 0, timeout); +#endif /* ACE_HAS_POLL */ (void) countdown.update (); diff --git a/ACE/ace/SSL/SSL_SOCK_Connector.cpp b/ACE/ace/SSL/SSL_SOCK_Connector.cpp index 45df4ef0404..d85fd545d27 100644 --- a/ACE/ace/SSL/SSL_SOCK_Connector.cpp +++ b/ACE/ace/SSL/SSL_SOCK_Connector.cpp @@ -10,6 +10,10 @@ #include <openssl/err.h> +#if defined (ACE_HAS_POLL) +# include "ace/OS_NS_poll.h" +#endif /* ACE_HAS_POLL */ + #if !defined (__ACE_INLINE__) #include "SSL_SOCK_Connector.inl" #endif /* __ACE_INLINE__ */ @@ -71,10 +75,16 @@ ACE_SSL_SOCK_Connector::ssl_connect (ACE_SSL_SOCK_Stream &new_stream, do { +#if defined (ACE_HAS_POLL) + struct pollfd fds; + ACE_OS::memset(&fds, 0, sizeof(fds)); + fds.revents = 0; +#else // These handle sets are used to set up for whatever SSL_connect // says it wants next. They're reset on each pass around the loop. ACE_Handle_Set rd_handle; ACE_Handle_Set wr_handle; +#endif /* ACE_HAS_POLL */ status = ::SSL_connect (ssl); switch (::SSL_get_error (ssl, status)) @@ -86,12 +96,22 @@ ACE_SSL_SOCK_Connector::ssl_connect (ACE_SSL_SOCK_Stream &new_stream, break; // Done case SSL_ERROR_WANT_WRITE: +#if defined (ACE_HAS_POLL) + fds.fd = handle; + fds.events = POLLOUT; +#else wr_handle.set_bit (handle); +#endif /* ACE_HAS_POLL */ status = 1; // Wait for more activity break; case SSL_ERROR_WANT_READ: +#if defined (ACE_HAS_POLL) + fds.fd = handle; + fds.events = POLLIN; +#else rd_handle.set_bit (handle); +#endif /* ACE_HAS_POLL */ status = 1; // Wait for more activity break; @@ -120,11 +140,21 @@ ACE_SSL_SOCK_Connector::ssl_connect (ACE_SSL_SOCK_Stream &new_stream, status = 1; // Wait for more activity if (SSL_want_write (ssl)) { +#if defined (ACE_HAS_POLL) + fds.fd = handle; + fds.events = POLLOUT; +#else wr_handle.set_bit (handle); +#endif /* ACE_HAS_POLL */ } else if (SSL_want_read (ssl)) { +#if defined (ACE_HAS_POLL) + fds.fd = handle; + fds.events = POLLIN; +#else rd_handle.set_bit (handle); +#endif /* ACE_HAS_POLL */ } else { @@ -146,6 +176,10 @@ ACE_SSL_SOCK_Connector::ssl_connect (ACE_SSL_SOCK_Stream &new_stream, if (status == 1) { +#if defined (ACE_HAS_POLL) + ACE_ASSERT(fds.fd != 0); + status = ACE_OS::poll(&fds, 1, timeout); +#else // Must have at least one handle to wait for at this point. ACE_ASSERT (rd_handle.num_set () == 1 || wr_handle.num_set () == 1); @@ -155,6 +189,7 @@ ACE_SSL_SOCK_Connector::ssl_connect (ACE_SSL_SOCK_Stream &new_stream, &wr_handle, 0, (timeout == 0 ? 0 : &t)); +#endif /* ACE_HAS_POLL */ (void) countdown.update (); |