[Libreoffice-commits] core.git: sal/osl

Damjan Jovanovic damjan at apache.org
Wed Oct 14 01:18:12 PDT 2015


 sal/osl/unx/socket.cxx   |   26 +++++++++++++-------------
 sal/osl/unx/sockimpl.hxx |    6 +++++-
 2 files changed, 18 insertions(+), 14 deletions(-)

New commits:
commit 309aa845a8e413519d634680aff112a3567e2e61
Author: Damjan Jovanovic <damjan at apache.org>
Date:   Tue Oct 13 18:22:30 2015 +0000

    Resolves: #i126586# FreeBSD automation deadlock: osl_closeSocket()...
    
    doesn't wake up thread stuck in accept().
    
    Generalize the "#if defined(LINUX)" workarounds to the *BSDs.
    
    (cherry picked from commit 4c7bfe32168912844a50059b2a901f6434c0f86f)
    
    Change-Id: I1649f6d1a63ae2daf8e6ff650d8af6ea89a6d449

diff --git a/sal/osl/unx/socket.cxx b/sal/osl/unx/socket.cxx
index d1a937a..63b079f 100644
--- a/sal/osl/unx/socket.cxx
+++ b/sal/osl/unx/socket.cxx
@@ -447,7 +447,7 @@ oslSocket __osl_createSocketImpl(int Socket)
     pSocket->m_nLastError = 0;
     pSocket->m_nRefCount = 1;
 
-#if defined(LINUX)
+#if defined(CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT)
     pSocket->m_bIsAccepting = false;
 #endif
 
@@ -1364,13 +1364,13 @@ void SAL_CALL osl_releaseSocket( oslSocket pSocket )
 {
     if( pSocket && 0 == osl_atomic_decrement( &(pSocket->m_nRefCount) ) )
     {
-#if defined(LINUX)
+#if defined(CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT)
     if ( pSocket->m_bIsAccepting )
     {
         SAL_WARN( "sal.osl", "attempt to destroy socket while accepting" );
         return;
     }
-#endif /* LINUX */
+#endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */
         osl_closeSocket( pSocket );
         __osl_destroySocketImpl( pSocket );
     }
@@ -1393,7 +1393,7 @@ void SAL_CALL osl_closeSocket(oslSocket pSocket)
 
     pSocket->m_Socket = OSL_INVALID_SOCKET;
 
-#if defined(LINUX)
+#if defined(CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT)
     pSocket->m_bIsInShutdown = true;
 
     if ( pSocket->m_bIsAccepting )
@@ -1437,7 +1437,7 @@ void SAL_CALL osl_closeSocket(oslSocket pSocket)
         }
         pSocket->m_bIsAccepting = false;
     }
-#endif /* LINUX */
+#endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */
 
     nRet=close(nFD);
     if ( nRet != 0 )
@@ -1695,9 +1695,9 @@ oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket pSocket,
     }
 
     pSocket->m_nLastError=0;
-#if defined(LINUX)
+#if defined(CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT)
     pSocket->m_bIsAccepting = true;
-#endif /* LINUX */
+#endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */
 
     if( ppAddr && *ppAddr )
     {
@@ -1718,22 +1718,22 @@ oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket pSocket,
         int nErrno = errno;
         SAL_WARN( "sal.osl", "accept connection failed: (" << nErrno << ") " << strerror(nErrno) );
 
-#if defined(LINUX)
+#if defined(CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT)
         pSocket->m_bIsAccepting = false;
-#endif /* LINUX */
+#endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */
         return 0;
     }
 
     assert(AddrLen == sizeof(struct sockaddr));
 
-#if defined(LINUX)
+#if defined(CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT)
     if ( pSocket->m_bIsInShutdown )
     {
         close(Connection);
         SAL_WARN( "sal.osl", "close while accept" );
         return 0;
     }
-#endif /* LINUX */
+#endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */
 
     if(ppAddr)
     {
@@ -1758,11 +1758,11 @@ oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket pSocket,
 
     pConnectionSockImpl->m_Socket           = Connection;
     pConnectionSockImpl->m_nLastError       = 0;
-#if defined(LINUX)
+#if defined(CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT)
     pConnectionSockImpl->m_bIsAccepting     = false;
 
     pSocket->m_bIsAccepting = false;
-#endif /* LINUX */
+#endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */
     return pConnectionSockImpl;
 }
 
diff --git a/sal/osl/unx/sockimpl.hxx b/sal/osl/unx/sockimpl.hxx
index 993c850..772a583 100644
--- a/sal/osl/unx/sockimpl.hxx
+++ b/sal/osl/unx/sockimpl.hxx
@@ -24,11 +24,15 @@
 #include <osl/socket.h>
 #include <osl/interlck.h>
 
+#if defined(LINUX) || defined(FREEBSD) || defined(NETBSD)
+#define CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT 1
+#endif
+
 struct oslSocketImpl {
     int                 m_Socket;
     int                 m_nLastError;
     oslInterlockedCount m_nRefCount;
-#if defined(LINUX)
+#if defined(CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT)
     bool                m_bIsAccepting;
     bool                m_bIsInShutdown;
 #endif


More information about the Libreoffice-commits mailing list