Fix deadlock in {HttpServerConnection,JsonRpcConnection}::DataAvailableHandler

refs #11014
This commit is contained in:
Gunnar Beutner 2016-02-01 08:35:55 +01:00
parent c2cf614d62
commit deac316a45
2 changed files with 33 additions and 24 deletions

View File

@ -78,6 +78,7 @@ void HttpServerConnection::Disconnect(void)
ApiListener::Ptr listener = ApiListener::GetInstance(); ApiListener::Ptr listener = ApiListener::GetInstance();
listener->RemoveHttpClient(this); listener->RemoveHttpClient(this);
if (!m_Stream->IsEof())
m_Stream->Shutdown(); m_Stream->Shutdown();
} }
@ -196,6 +197,9 @@ void HttpServerConnection::ProcessMessageAsync(HttpRequest& request)
void HttpServerConnection::DataAvailableHandler(void) void HttpServerConnection::DataAvailableHandler(void)
{ {
bool close = false;
if (!m_Stream->IsEof()) {
boost::mutex::scoped_lock lock(m_DataHandlerMutex); boost::mutex::scoped_lock lock(m_DataHandlerMutex);
try { try {
@ -205,12 +209,12 @@ void HttpServerConnection::DataAvailableHandler(void)
Log(LogWarning, "HttpServerConnection") Log(LogWarning, "HttpServerConnection")
<< "Error while reading Http request: " << DiagnosticInformation(ex); << "Error while reading Http request: " << DiagnosticInformation(ex);
Disconnect(); close = true;
return;
} }
} else
close = true;
if (m_Stream->IsEof()) if (close)
Disconnect(); Disconnect();
} }

View File

@ -227,6 +227,9 @@ bool JsonRpcConnection::ProcessMessage(void)
void JsonRpcConnection::DataAvailableHandler(void) void JsonRpcConnection::DataAvailableHandler(void)
{ {
bool close = false;
if (!m_Stream->IsEof()) {
boost::mutex::scoped_lock lock(m_DataHandlerMutex); boost::mutex::scoped_lock lock(m_DataHandlerMutex);
try { try {
@ -241,8 +244,10 @@ void JsonRpcConnection::DataAvailableHandler(void)
return; return;
} }
} else
close = true;
if (m_Stream->IsEof()) if (close)
Disconnect(); Disconnect();
} }