From a2cbe1a0d51a72390eef52a2090fb10719cd361c Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 2 Feb 2016 13:51:17 +0100 Subject: [PATCH] Improve performance for TlsStream::OnEvent refs #11014 --- lib/base/tlsstream.cpp | 102 +++++++++++++++++++++-------------------- 1 file changed, 52 insertions(+), 50 deletions(-) diff --git a/lib/base/tlsstream.cpp b/lib/base/tlsstream.cpp index c04e9a264..8f27bb6a0 100644 --- a/lib/base/tlsstream.cpp +++ b/lib/base/tlsstream.cpp @@ -126,7 +126,7 @@ boost::shared_ptr 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,68 +189,62 @@ void TlsStream::OnEvent(int revents) VERIFY(!"Invalid TlsAction"); } - if (rc > 0) { - m_CurrentAction = TlsActionNone; + if (rc < 0) { + int err = SSL_get_error(m_SSL.get(), rc); - if (!m_Eof) { - if (m_SendQ->GetAvailableBytes() > 0) - ChangeEvents(POLLIN|POLLOUT); - else + switch (err) { + case SSL_ERROR_WANT_READ: + m_Retry = true; ChangeEvents(POLLIN); - } - lock.unlock(); + break; + case SSL_ERROR_WANT_WRITE: + m_Retry = true; + ChangeEvents(POLLOUT); - while (m_RecvQ->IsDataAvailable() && IsHandlingEvents()) - SignalDataAvailable(); - - if (m_Shutdown && !m_SendQ->IsDataAvailable()) - Close(); + break; + case SSL_ERROR_ZERO_RETURN: + lock.unlock(); - return; - } + Close(); - err = SSL_get_error(m_SSL.get(), rc); + break; + default: + m_ErrorCode = ERR_peek_error(); + m_ErrorOccurred = true; - switch (err) { - case SSL_ERROR_WANT_READ: - m_Retry = true; - ChangeEvents(POLLIN); + if (m_ErrorCode != 0) { + Log(LogWarning, "TlsStream") + << "OpenSSL error: " << ERR_error_string(m_ErrorCode, NULL); + } else { + Log(LogWarning, "TlsStream", "TLS stream was disconnected."); + } - break; - case SSL_ERROR_WANT_WRITE: - m_Retry = true; - ChangeEvents(POLLOUT); + lock.unlock(); - break; - case SSL_ERROR_ZERO_RETURN: - lock.unlock(); + Close(); - if (IsHandlingEvents()) - SignalDataAvailable(); + break; + } + } - Close(); + if (success) { + m_CurrentAction = TlsActionNone; - 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."); - } + if (!m_Eof) { + if (m_SendQ->GetAvailableBytes() > 0) + ChangeEvents(POLLIN|POLLOUT); + else + ChangeEvents(POLLIN); + } - lock.unlock(); + lock.unlock(); - if (IsHandlingEvents()) - SignalDataAvailable(); + while (m_RecvQ->IsDataAvailable() && IsHandlingEvents()) + SignalDataAvailable(); + if (m_Shutdown && !m_SendQ->IsDataAvailable()) Close(); - - break; } } -- 2.40.0