sal/osl/unx/socket.c | 26 +++++++++++++------------- sal/osl/unx/sockimpl.h | 8 +++++++- 2 files changed, 20 insertions(+), 14 deletions(-)
New commits: commit d3600c128fd32804283e6c4d7c55767ae49a2270 Author: Damjan Jovanovic <dam...@apache.org> Date: Tue Oct 13 18:54:59 2015 +0000 #i126586# don't break on non-Linux non-FreeBSD non-NetBSD *nix systems ... diff --git a/sal/osl/unx/sockimpl.h b/sal/osl/unx/sockimpl.h index 8ab86e7..904190f 100644 --- a/sal/osl/unx/sockimpl.h +++ b/sal/osl/unx/sockimpl.h @@ -36,6 +36,8 @@ typedef void* (*oslCloseCallback) (void*); #if defined(LINUX) || defined(FREEBSD) || defined(NETBSD) #define CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT 1 +#else +#define CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT 0 #endif struct oslSocketImpl { commit 4c7bfe32168912844a50059b2a901f6434c0f86f Author: Damjan Jovanovic <dam...@apache.org> Date: Tue Oct 13 18:22:30 2015 +0000 #i126586# FreeBSD automation deadlock: osl_closeSocket() doesn't wake up thread stuck in accept(). Generalize the "#if defined(LINUX)" workarounds to the *BSDs. diff --git a/sal/osl/unx/socket.c b/sal/osl/unx/socket.c index a55d759..9bd877a 100644 --- a/sal/osl/unx/socket.c +++ b/sal/osl/unx/socket.c @@ -490,7 +490,7 @@ oslSocket __osl_createSocketImpl(int Socket) pSocket->m_CallbackArg = 0; pSocket->m_nRefCount = 1; -#if defined(LINUX) +#if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT pSocket->m_bIsAccepting = sal_False; #endif @@ -1824,13 +1824,13 @@ void SAL_CALL osl_releaseSocket( oslSocket pSocket ) { if( pSocket && 0 == osl_decrementInterlockedCount( &(pSocket->m_nRefCount) ) ) { -#if defined(LINUX) +#if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT if ( pSocket->m_bIsAccepting == sal_True ) { OSL_ENSURE(0, "osl_destroySocket : attempt to destroy socket while accepting\n"); return; } -#endif /* LINUX */ +#endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */ osl_closeSocket( pSocket ); __osl_destroySocketImpl( pSocket ); } @@ -1858,7 +1858,7 @@ void SAL_CALL osl_closeSocket(oslSocket pSocket) pSocket->m_Socket = OSL_INVALID_SOCKET; -#if defined(LINUX) +#if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT pSocket->m_bIsInShutdown = sal_True; if ( pSocket->m_bIsAccepting == sal_True ) @@ -1904,7 +1904,7 @@ void SAL_CALL osl_closeSocket(oslSocket pSocket) } pSocket->m_bIsAccepting = sal_False; } -#endif /* LINUX */ +#endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */ /* registrierten Callback ausfuehren */ if (pSocket->m_CloseCallback != NULL) @@ -2185,9 +2185,9 @@ oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket pSocket, } pSocket->m_nLastError=0; -#if defined(LINUX) +#if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT pSocket->m_bIsAccepting = sal_True; -#endif /* LINUX */ +#endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */ if( ppAddr && *ppAddr ) { @@ -2208,23 +2208,23 @@ oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket pSocket, pSocket->m_nLastError=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; -#endif /* LINUX */ +#endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */ return 0; } OSL_ASSERT(AddrLen == sizeof(struct sockaddr)); -#if defined(LINUX) +#if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT if ( pSocket->m_bIsInShutdown == sal_True ) { close(Connection); OSL_TRACE("osl_acceptConnectionOnSocket : close while accept\n"); return 0; } -#endif /* LINUX */ +#endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */ if(ppAddr) @@ -2253,11 +2253,11 @@ oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket pSocket, pConnectionSockImpl->m_nLastError = 0; pConnectionSockImpl->m_CloseCallback = NULL; pConnectionSockImpl->m_CallbackArg = NULL; -#if defined(LINUX) +#if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT pConnectionSockImpl->m_bIsAccepting = sal_False; pSocket->m_bIsAccepting = sal_False; -#endif /* LINUX */ +#endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */ return pConnectionSockImpl; } diff --git a/sal/osl/unx/sockimpl.h b/sal/osl/unx/sockimpl.h index f148b9d..8ab86e7 100644 --- a/sal/osl/unx/sockimpl.h +++ b/sal/osl/unx/sockimpl.h @@ -34,13 +34,17 @@ extern "C" { typedef void* (*oslCloseCallback) (void*); +#if defined(LINUX) || defined(FREEBSD) || defined(NETBSD) +#define CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT 1 +#endif + struct oslSocketImpl { int m_Socket; int m_nLastError; oslCloseCallback m_CloseCallback; void* m_CallbackArg; oslInterlockedCount m_nRefCount; -#if defined(LINUX) +#if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT sal_Bool m_bIsAccepting; sal_Bool m_bIsInShutdown; #endif _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits