]> granicus.if.org Git - icinga2/commitdiff
Improve performance for TlsStream::OnEvent
authorGunnar Beutner <gunnar@beutner.name>
Tue, 2 Feb 2016 12:51:17 +0000 (13:51 +0100)
committerGunnar Beutner <gunnar@beutner.name>
Tue, 2 Feb 2016 12:51:17 +0000 (13:51 +0100)
refs #11014

lib/base/tlsstream.cpp

index 5984105f4925441873b31fd00a8092193c27064f..2f24a1106db0af4812cef7e1131275ac9cab62ad 100644 (file)
@@ -126,7 +126,7 @@ boost::shared_ptr<X509> TlsStream::GetPeerCertificate(void) const
 
 void TlsStream::OnEvent(int revents)
 {
-       int rc, err;
+       int rc;
        size_t count;
 
        boost::mutex::scoped_lock lock(m_Mutex);
@@ -147,6 +147,8 @@ void TlsStream::OnEvent(int revents)
                }
        }
 
+       bool success = false;
+
        switch (m_CurrentAction) {
                case TlsActionRead:
                        do {
@@ -154,9 +156,12 @@ void TlsStream::OnEvent(int revents)
 
                                if (rc > 0) {
                                        m_RecvQ->Write(buffer, rc);
-                                       m_CV.notify_all();
+                                       success = true;
                                }
-                       } while (SSL_pending(m_SSL.get()));
+                       } while (rc > 0);
+
+                       if (success)
+                               m_CV.notify_all();
 
                        break;
                case TlsActionWrite:
@@ -164,14 +169,17 @@ void TlsStream::OnEvent(int revents)
 
                        rc = SSL_write(m_SSL.get(), buffer, count);
 
-                       if (rc > 0)
+                       if (rc > 0) {
                                m_SendQ->Read(NULL, rc, true);
+                               success = true;
+                       }
 
                        break;
                case TlsActionHandshake:
                        rc = SSL_do_handshake(m_SSL.get());
 
                        if (rc > 0) {
+                               success = true;
                                m_HandshakeOK = true;
                                m_CV.notify_all();
                        }
@@ -181,7 +189,46 @@ void TlsStream::OnEvent(int revents)
                        VERIFY(!"Invalid TlsAction");
        }
 
-       if (rc > 0) {
+       if (rc < 0) {
+               int err = SSL_get_error(m_SSL.get(), rc);
+
+               switch (err) {
+                       case SSL_ERROR_WANT_READ:
+                               m_Retry = true;
+                               ChangeEvents(POLLIN);
+
+                               break;
+                       case SSL_ERROR_WANT_WRITE:
+                               m_Retry = true;
+                               ChangeEvents(POLLOUT);
+
+                               break;
+                       case SSL_ERROR_ZERO_RETURN:
+                               lock.unlock();
+
+                               Close();
+
+                               break;
+                       default:
+                               m_ErrorCode = ERR_peek_error();
+                               m_ErrorOccurred = true;
+
+                               if (m_ErrorCode != 0) {
+                                       Log(LogWarning, "TlsStream")
+                                               << "OpenSSL error: " << ERR_error_string(m_ErrorCode, NULL);
+                               } else {
+                                       Log(LogWarning, "TlsStream", "TLS stream was disconnected.");
+                               }
+
+                               lock.unlock();
+
+                               Close();
+
+                               break;
+               }
+       }
+
+       if (success) {
                m_CurrentAction = TlsActionNone;
 
                if (!m_Eof) {
@@ -198,46 +245,8 @@ void TlsStream::OnEvent(int revents)
 
                if (m_Shutdown && !m_SendQ->IsDataAvailable())
                        Close();
-
-               return;
        }
 
-       err = SSL_get_error(m_SSL.get(), rc);
-
-       switch (err) {
-               case SSL_ERROR_WANT_READ:
-                       m_Retry = true;
-                       ChangeEvents(POLLIN);
-
-                       break;
-               case SSL_ERROR_WANT_WRITE:
-                       m_Retry = true;
-                       ChangeEvents(POLLOUT);
-
-                       break;
-               case SSL_ERROR_ZERO_RETURN:
-                       lock.unlock();
-
-                       Close();
-
-                       break;
-               default:
-                       m_ErrorCode = ERR_peek_error();
-                       m_ErrorOccurred = true;
-
-                       if (m_ErrorCode != 0) {
-                               Log(LogWarning, "TlsStream")
-                                       << "OpenSSL error: " << ERR_error_string(m_ErrorCode, NULL);
-                       } else {
-                               Log(LogWarning, "TlsStream", "TLS stream was disconnected.");
-                       }
-
-                       lock.unlock();
-
-                       Close();
-
-                       break;
-       }
 }
 
 void TlsStream::HandleError(void) const