summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Huston <shuston@riverace.com>2020-06-29 08:12:07 -0400
committerGitHub <noreply@github.com>2020-06-29 08:12:07 -0400
commit885ffbb0d51c93cec57ff50433ad95e8b79e6a32 (patch)
tree581cfaeec318cf7f8d42265a71169269953d85b3
parent7cf3f1283ef8a4901d8962e7f951ada8252288ce (diff)
parent98ab6f28e5230f5561182c9914801d6d3a83b2bd (diff)
downloadATCD-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.cpp48
-rw-r--r--ACE/ace/SSL/SSL_SOCK_Connector.cpp35
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 ();