From f2b47ef5e94e896b795bbd1bd5b767ecae7c80d6 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Wed, 18 Nov 2015 14:12:48 -0600 Subject: [PATCH] thread shutdown --- src/remote/blockingTCPAcceptor.cpp | 29 ++++++++++++++++++++++++----- src/server/serverContext.cpp | 4 ++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/remote/blockingTCPAcceptor.cpp b/src/remote/blockingTCPAcceptor.cpp index 1efeab6..ae75275 100644 --- a/src/remote/blockingTCPAcceptor.cpp +++ b/src/remote/blockingTCPAcceptor.cpp @@ -232,16 +232,35 @@ namespace pvAccess { } void BlockingTCPAcceptor::destroy() { - Lock guard(_mutex); - if(_destroyed) return; - _destroyed = true; + SOCKET sock; + { + Lock guard(_mutex); + if(_destroyed) return; + _destroyed = true; - if(_serverSocketChannel!=INVALID_SOCKET) { + sock = _serverSocketChannel; + _serverSocketChannel = INVALID_SOCKET; + } + + if(sock!=INVALID_SOCKET) { char ipAddrStr[48]; ipAddrToDottedIP(&_bindAddress.ia, ipAddrStr, sizeof(ipAddrStr)); LOG(logLevelDebug, "Stopped accepting connections at %s.", ipAddrStr); - epicsSocketDestroy(_serverSocketChannel); + switch(epicsSocketSystemCallInterruptMechanismQuery()) + { + case esscimqi_socketBothShutdownRequired: + shutdown(sock, SHUT_RDWR); + _thread.exitWait(); + epicsSocketDestroy(sock); + break; + case esscimqi_socketSigAlarmRequired: + LOG(logLevelError, "SigAlarm close not implemented for this target\n"); + case esscimqi_socketCloseRequired: + epicsSocketDestroy(sock); + _thread.exitWait(); + break; + } } } diff --git a/src/server/serverContext.cpp b/src/server/serverContext.cpp index 586dd02..e1a02a9 100644 --- a/src/server/serverContext.cpp +++ b/src/server/serverContext.cpp @@ -545,6 +545,10 @@ void ServerContextImpl::dispose() { destroy(); } + catch(std::exception& e) + { + std::cerr<<"Error in: ServerContextImpl::dispose: "<