Kill TCP sockets in 2 stages to fix a race condition during socket closure
This commit is contained in:
parent
c18e334cd4
commit
e5a6297d30
5 changed files with 23 additions and 13 deletions
|
|
@ -392,19 +392,23 @@ int stopControlStream(void) {
|
|||
LbqSignalQueueShutdown(&invalidReferenceFrameTuples);
|
||||
PltSetEvent(&invalidateRefFramesEvent);
|
||||
|
||||
if (ctlSock != INVALID_SOCKET) {
|
||||
shutdownSocket(ctlSock);
|
||||
}
|
||||
|
||||
PltInterruptThread(&lossStatsThread);
|
||||
PltInterruptThread(&invalidateRefFramesThread);
|
||||
|
||||
if (ctlSock != INVALID_SOCKET) {
|
||||
closeSocket(ctlSock);
|
||||
ctlSock = INVALID_SOCKET;
|
||||
}
|
||||
|
||||
PltJoinThread(&lossStatsThread);
|
||||
PltJoinThread(&invalidateRefFramesThread);
|
||||
|
||||
PltCloseThread(&lossStatsThread);
|
||||
PltCloseThread(&invalidateRefFramesThread);
|
||||
|
||||
if (ctlSock != INVALID_SOCKET) {
|
||||
closeSocket(ctlSock);
|
||||
ctlSock = INVALID_SOCKET;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -294,12 +294,16 @@ int stopInputStream(void) {
|
|||
PltInterruptThread(&inputSendThread);
|
||||
|
||||
if (inputSock != INVALID_SOCKET) {
|
||||
closeSocket(inputSock);
|
||||
inputSock = INVALID_SOCKET;
|
||||
shutdownSocket(inputSock);
|
||||
}
|
||||
|
||||
PltJoinThread(&inputSendThread);
|
||||
PltCloseThread(&inputSendThread);
|
||||
|
||||
if (inputSock != INVALID_SOCKET) {
|
||||
closeSocket(inputSock);
|
||||
inputSock = INVALID_SOCKET;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,12 +21,13 @@ void addrToUrlSafeString(struct sockaddr_storage* addr, char* string)
|
|||
}
|
||||
}
|
||||
|
||||
void closeSocket(SOCKET s) {
|
||||
void shutdownSocket(SOCKET s) {
|
||||
// Calling shutdown() prior to close wakes up callers
|
||||
// blocked in connect(), recv(), and friends.
|
||||
shutdown(s, SHUT_RDWR);
|
||||
|
||||
// Now close the socket fd
|
||||
}
|
||||
|
||||
void closeSocket(SOCKET s) {
|
||||
#ifdef _WIN32
|
||||
closesocket(s);
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -43,4 +43,5 @@ void addrToUrlSafeString(struct sockaddr_storage* addr, char* string);
|
|||
SOCKET connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen, unsigned short port);
|
||||
SOCKET bindUdpSocket(int addrfamily, int bufferSize);
|
||||
int enableNoDelay(SOCKET s);
|
||||
void shutdownSocket(SOCKET s);
|
||||
void closeSocket(SOCKET s);
|
||||
|
|
@ -144,11 +144,11 @@ Exit:
|
|||
return ret;
|
||||
}
|
||||
|
||||
// Terminate the RTSP Handshake process by closing the socket
|
||||
// Terminate the RTSP Handshake process by shutting down the socket.
|
||||
// The thread waiting on RTSP will close the socket.
|
||||
void terminateRtspHandshake(void) {
|
||||
if (sock != INVALID_SOCKET) {
|
||||
closeSocket(sock);
|
||||
sock = INVALID_SOCKET;
|
||||
shutdownSocket(sock);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue