Kaydet (Commit) 4c7bfe32 authored tarafından Damjan Jovanovic's avatar Damjan Jovanovic

#i126586# FreeBSD automation deadlock: osl_closeSocket() doesn't wake up thread stuck in accept().

Generalize the "#if defined(LINUX)" workarounds to the *BSDs.
üst 788b479f
...@@ -490,7 +490,7 @@ oslSocket __osl_createSocketImpl(int Socket) ...@@ -490,7 +490,7 @@ oslSocket __osl_createSocketImpl(int Socket)
pSocket->m_CallbackArg = 0; pSocket->m_CallbackArg = 0;
pSocket->m_nRefCount = 1; pSocket->m_nRefCount = 1;
#if defined(LINUX) #if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT
pSocket->m_bIsAccepting = sal_False; pSocket->m_bIsAccepting = sal_False;
#endif #endif
...@@ -1824,13 +1824,13 @@ void SAL_CALL osl_releaseSocket( oslSocket pSocket ) ...@@ -1824,13 +1824,13 @@ void SAL_CALL osl_releaseSocket( oslSocket pSocket )
{ {
if( pSocket && 0 == osl_decrementInterlockedCount( &(pSocket->m_nRefCount) ) ) if( pSocket && 0 == osl_decrementInterlockedCount( &(pSocket->m_nRefCount) ) )
{ {
#if defined(LINUX) #if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT
if ( pSocket->m_bIsAccepting == sal_True ) if ( pSocket->m_bIsAccepting == sal_True )
{ {
OSL_ENSURE(0, "osl_destroySocket : attempt to destroy socket while accepting\n"); OSL_ENSURE(0, "osl_destroySocket : attempt to destroy socket while accepting\n");
return; return;
} }
#endif /* LINUX */ #endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */
osl_closeSocket( pSocket ); osl_closeSocket( pSocket );
__osl_destroySocketImpl( pSocket ); __osl_destroySocketImpl( pSocket );
} }
...@@ -1858,7 +1858,7 @@ void SAL_CALL osl_closeSocket(oslSocket pSocket) ...@@ -1858,7 +1858,7 @@ void SAL_CALL osl_closeSocket(oslSocket pSocket)
pSocket->m_Socket = OSL_INVALID_SOCKET; pSocket->m_Socket = OSL_INVALID_SOCKET;
#if defined(LINUX) #if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT
pSocket->m_bIsInShutdown = sal_True; pSocket->m_bIsInShutdown = sal_True;
if ( pSocket->m_bIsAccepting == sal_True ) if ( pSocket->m_bIsAccepting == sal_True )
...@@ -1904,7 +1904,7 @@ void SAL_CALL osl_closeSocket(oslSocket pSocket) ...@@ -1904,7 +1904,7 @@ void SAL_CALL osl_closeSocket(oslSocket pSocket)
} }
pSocket->m_bIsAccepting = sal_False; pSocket->m_bIsAccepting = sal_False;
} }
#endif /* LINUX */ #endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */
/* registrierten Callback ausfuehren */ /* registrierten Callback ausfuehren */
if (pSocket->m_CloseCallback != NULL) if (pSocket->m_CloseCallback != NULL)
...@@ -2185,9 +2185,9 @@ oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket pSocket, ...@@ -2185,9 +2185,9 @@ oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket pSocket,
} }
pSocket->m_nLastError=0; pSocket->m_nLastError=0;
#if defined(LINUX) #if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT
pSocket->m_bIsAccepting = sal_True; pSocket->m_bIsAccepting = sal_True;
#endif /* LINUX */ #endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */
if( ppAddr && *ppAddr ) if( ppAddr && *ppAddr )
{ {
...@@ -2208,23 +2208,23 @@ oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket pSocket, ...@@ -2208,23 +2208,23 @@ oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket pSocket,
pSocket->m_nLastError=errno; pSocket->m_nLastError=errno;
OSL_TRACE("osl_acceptConnectionOnSocket : accept error '%s'\n",strerror(errno)); OSL_TRACE("osl_acceptConnectionOnSocket : accept error '%s'\n",strerror(errno));
#if defined(LINUX) #if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT
pSocket->m_bIsAccepting = sal_False; pSocket->m_bIsAccepting = sal_False;
#endif /* LINUX */ #endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */
return 0; return 0;
} }
OSL_ASSERT(AddrLen == sizeof(struct sockaddr)); OSL_ASSERT(AddrLen == sizeof(struct sockaddr));
#if defined(LINUX) #if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT
if ( pSocket->m_bIsInShutdown == sal_True ) if ( pSocket->m_bIsInShutdown == sal_True )
{ {
close(Connection); close(Connection);
OSL_TRACE("osl_acceptConnectionOnSocket : close while accept\n"); OSL_TRACE("osl_acceptConnectionOnSocket : close while accept\n");
return 0; return 0;
} }
#endif /* LINUX */ #endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */
if(ppAddr) if(ppAddr)
...@@ -2253,11 +2253,11 @@ oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket pSocket, ...@@ -2253,11 +2253,11 @@ oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket pSocket,
pConnectionSockImpl->m_nLastError = 0; pConnectionSockImpl->m_nLastError = 0;
pConnectionSockImpl->m_CloseCallback = NULL; pConnectionSockImpl->m_CloseCallback = NULL;
pConnectionSockImpl->m_CallbackArg = NULL; pConnectionSockImpl->m_CallbackArg = NULL;
#if defined(LINUX) #if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT
pConnectionSockImpl->m_bIsAccepting = sal_False; pConnectionSockImpl->m_bIsAccepting = sal_False;
pSocket->m_bIsAccepting = sal_False; pSocket->m_bIsAccepting = sal_False;
#endif /* LINUX */ #endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */
return pConnectionSockImpl; return pConnectionSockImpl;
} }
......
...@@ -34,13 +34,17 @@ extern "C" { ...@@ -34,13 +34,17 @@ extern "C" {
typedef void* (*oslCloseCallback) (void*); typedef void* (*oslCloseCallback) (void*);
#if defined(LINUX) || defined(FREEBSD) || defined(NETBSD)
#define CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT 1
#endif
struct oslSocketImpl { struct oslSocketImpl {
int m_Socket; int m_Socket;
int m_nLastError; int m_nLastError;
oslCloseCallback m_CloseCallback; oslCloseCallback m_CloseCallback;
void* m_CallbackArg; void* m_CallbackArg;
oslInterlockedCount m_nRefCount; oslInterlockedCount m_nRefCount;
#if defined(LINUX) #if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT
sal_Bool m_bIsAccepting; sal_Bool m_bIsAccepting;
sal_Bool m_bIsInShutdown; sal_Bool m_bIsInShutdown;
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment