reliable solution for shutdown differences

This commit is contained in:
Jeff Hill
2001-08-10 00:07:17 +00:00
parent 192632eaf2
commit d6587ddca1
4 changed files with 70 additions and 0 deletions

View File

@@ -212,3 +212,16 @@ epicsShareFunc const char * epicsShareAPI convertSocketErrorToString (int errnoI
#endif
}
/*
* WINSOCK II shutdown() function does not wake up threads blocking in TCP recv()
*/
epicsShareFunc enum osiSockShutdownReturn epicsShareAPI osiSocketShutdown ( SOCKET sock )
{
int status = socket_close ( sock );
if ( status ) {
errlogPrintf ("TCP WIN32 socket close (for shutdown purposes) error was %s\n",
SOCKERRSTR (SOCKERRNO) );
return ossrSocketNoChange;
}
return ossrSocketClosed;
}

View File

@@ -128,3 +128,28 @@ epicsShareFunc int epicsShareAPI hostToIPAddr
unlockInfo ();
return ret;
}
/*
* typically the shutdown() function will wake up threads blocking in TCP recv()
* and this is a more graceful way to shutdown
*/
epicsShareFunc enum osiSockShutdownReturn epicsShareAPI osiSocketShutdown ( SOCKET sock )
{
status = shutdown ( this->sock, SD_BOTH );
if ( status ) {
errlogPrintf ( "TCP socket shutdown error (for shutdown purposes) was %s\n",
SOCKERRSTR (SOCKERRNO) );
status = socket_close ( this->sock );
if ( status ) {
errlogPrintf ("TCP socket close error (for shutdown purposes) was %s\n",
SOCKERRSTR (SOCKERRNO) );
return ossrSocketNoChange;
}
else {
return ossrSocketClosed;
}
}
else {
return ossrSocketShutdown;
}
}

View File

@@ -86,3 +86,28 @@ epicsShareFunc int epicsShareAPI hostToIPAddr
*/
return 0;
}
/*
* typically the shutdown() function will wake up threads blocking in TCP recv()
* and this is a more graceful way to shutdown
*/
epicsShareFunc enum osiSockShutdownReturn epicsShareAPI osiSocketShutdown ( SOCKET sock )
{
status = shutdown ( this->sock, SD_BOTH );
if ( status ) {
errlogPrintf ( "TCP socket shutdown error (for shutdown purposes) was %s\n",
SOCKERRSTR (SOCKERRNO) );
status = socket_close ( this->sock );
if ( status ) {
errlogPrintf ("TCP socket close error (for shutdown purposes) was %s\n",
SOCKERRSTR (SOCKERRNO) );
return ossrSocketNoChange;
}
else {
return ossrSocketClosed;
}
}
else {
return ossrSocketShutdown;
}
}

View File

@@ -175,6 +175,13 @@ epicsShareFunc void epicsShareAPI osiSockDiscoverBroadcastAddresses
*/
epicsShareFunc osiSockAddr epicsShareAPI osiLocalAddr (SOCKET socket);
/*
* WINSOCK shutdown() function does not wake up threads blocking
* in TCP recv()
*/
enum osiSockShutdownReturn { ossrSocketClosed, ossrSocketShutdown, ossrSocketNoChange };
epicsShareFunc enum osiSockShutdownReturn epicsShareAPI osiSocketShutdown ( SOCKET sock );
#ifdef __cplusplus
}
#endif