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: "<