Improve performance for TlsStream::OnEvent

refs #11014
This commit is contained in:
Gunnar Beutner 2016-02-02 13:51:17 +01:00
parent 3b4fc69fab
commit a2cbe1a0d5

View File

@ -126,7 +126,7 @@ boost::shared_ptr<X509> TlsStream::GetPeerCertificate(void) const
void TlsStream::OnEvent(int revents) void TlsStream::OnEvent(int revents)
{ {
int rc, err; int rc;
size_t count; size_t count;
boost::mutex::scoped_lock lock(m_Mutex); boost::mutex::scoped_lock lock(m_Mutex);
@ -147,6 +147,8 @@ void TlsStream::OnEvent(int revents)
} }
} }
bool success = false;
switch (m_CurrentAction) { switch (m_CurrentAction) {
case TlsActionRead: case TlsActionRead:
do { do {
@ -154,9 +156,12 @@ void TlsStream::OnEvent(int revents)
if (rc > 0) { if (rc > 0) {
m_RecvQ->Write(buffer, rc); 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; break;
case TlsActionWrite: case TlsActionWrite:
@ -164,14 +169,17 @@ void TlsStream::OnEvent(int revents)
rc = SSL_write(m_SSL.get(), buffer, count); rc = SSL_write(m_SSL.get(), buffer, count);
if (rc > 0) if (rc > 0) {
m_SendQ->Read(NULL, rc, true); m_SendQ->Read(NULL, rc, true);
success = true;
}
break; break;
case TlsActionHandshake: case TlsActionHandshake:
rc = SSL_do_handshake(m_SSL.get()); rc = SSL_do_handshake(m_SSL.get());
if (rc > 0) { if (rc > 0) {
success = true;
m_HandshakeOK = true; m_HandshakeOK = true;
m_CV.notify_all(); m_CV.notify_all();
} }
@ -181,28 +189,8 @@ void TlsStream::OnEvent(int revents)
VERIFY(!"Invalid TlsAction"); VERIFY(!"Invalid TlsAction");
} }
if (rc > 0) { if (rc < 0) {
m_CurrentAction = TlsActionNone; int err = SSL_get_error(m_SSL.get(), rc);
if (!m_Eof) {
if (m_SendQ->GetAvailableBytes() > 0)
ChangeEvents(POLLIN|POLLOUT);
else
ChangeEvents(POLLIN);
}
lock.unlock();
while (m_RecvQ->IsDataAvailable() && IsHandlingEvents())
SignalDataAvailable();
if (m_Shutdown && !m_SendQ->IsDataAvailable())
Close();
return;
}
err = SSL_get_error(m_SSL.get(), rc);
switch (err) { switch (err) {
case SSL_ERROR_WANT_READ: case SSL_ERROR_WANT_READ:
@ -218,9 +206,6 @@ void TlsStream::OnEvent(int revents)
case SSL_ERROR_ZERO_RETURN: case SSL_ERROR_ZERO_RETURN:
lock.unlock(); lock.unlock();
if (IsHandlingEvents())
SignalDataAvailable();
Close(); Close();
break; break;
@ -237,15 +222,32 @@ void TlsStream::OnEvent(int revents)
lock.unlock(); lock.unlock();
if (IsHandlingEvents())
SignalDataAvailable();
Close(); Close();
break; break;
} }
} }
if (success) {
m_CurrentAction = TlsActionNone;
if (!m_Eof) {
if (m_SendQ->GetAvailableBytes() > 0)
ChangeEvents(POLLIN|POLLOUT);
else
ChangeEvents(POLLIN);
}
lock.unlock();
while (m_RecvQ->IsDataAvailable() && IsHandlingEvents())
SignalDataAvailable();
if (m_Shutdown && !m_SendQ->IsDataAvailable())
Close();
}
}
void TlsStream::HandleError(void) const void TlsStream::HandleError(void) const
{ {
if (m_ErrorOccurred) { if (m_ErrorOccurred) {