From 2e8674a54d157b3539fe1fdc9332df6b9c25ac3c Mon Sep 17 00:00:00 2001 From: Guenter Obiltschnig Date: Sat, 5 Mar 2016 14:42:18 +0100 Subject: [PATCH] prevent TCPServer thread from stopping of poll() throws (due to resource issues) --- Net/src/TCPServer.cpp | 52 ++++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/Net/src/TCPServer.cpp b/Net/src/TCPServer.cpp index 201890969..82b7cbfc5 100644 --- a/Net/src/TCPServer.cpp +++ b/Net/src/TCPServer.cpp @@ -115,33 +115,43 @@ void TCPServer::run() while (!_stopped) { Poco::Timespan timeout(250000); - if (_socket.poll(timeout, Socket::SELECT_READ)) + try { - try + if (_socket.poll(timeout, Socket::SELECT_READ)) { - StreamSocket ss = _socket.acceptConnection(); - // enable nodelay per default: OSX really needs that -#if defined(POCO_OS_FAMILY_UNIX) - if (ss.address().family() != AddressFamily::UNIX_LOCAL) -#endif + try { - ss.setNoDelay(true); + StreamSocket ss = _socket.acceptConnection(); + // enable nodelay per default: OSX really needs that + #if defined(POCO_OS_FAMILY_UNIX) + if (ss.address().family() != AddressFamily::UNIX_LOCAL) + #endif + { + ss.setNoDelay(true); + } + _pDispatcher->enqueue(ss); + } + catch (Poco::Exception& exc) + { + ErrorHandler::handle(exc); + } + catch (std::exception& exc) + { + ErrorHandler::handle(exc); + } + catch (...) + { + ErrorHandler::handle(); } - _pDispatcher->enqueue(ss); - } - catch (Poco::Exception& exc) - { - ErrorHandler::handle(exc); - } - catch (std::exception& exc) - { - ErrorHandler::handle(exc); - } - catch (...) - { - ErrorHandler::handle(); } } + catch (Poco::Exception& exc) + { + ErrorHandler::handle(exc); + // possibly a resource issue since poll() failed; + // give some time to recover before trying again + Poco::Thread::sleep(50); + } } }