From ba9e7dbf9c1130df228e9324c8a0225d34443150 Mon Sep 17 00:00:00 2001 From: sb Date: Wed, 20 Jan 2010 14:50:45 +0100 Subject: sb119: #i106355# clear signal mask inherited from parent process --- sal/osl/unx/signal.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'sal') diff --git a/sal/osl/unx/signal.c b/sal/osl/unx/signal.c index 35884e11c9ba..fe3ab59ba9fc 100644 --- a/sal/osl/unx/signal.c +++ b/sal/osl/unx/signal.c @@ -202,6 +202,7 @@ static sal_Bool InitSignal() int i; struct sigaction act; struct sigaction oact; + sigset_t unset; if (is_soffice_Impl()) { @@ -283,6 +284,16 @@ static sal_Bool InitSignal() } } + /* Clear signal mask inherited from parent process (on Mac OS X, upon a + crash soffice re-execs itself from within the signal handler, so the + second soffice would have the guilty signal blocked and would freeze upon + encountering a similar crash again): */ + if (sigemptyset(&unset) < 0 || + pthread_sigmask(SIG_SETMASK, &unset, NULL) < 0) + { + OSL_TRACE("sigemptyset or pthread_sigmask failed"); + } + return sal_True; } -- cgit From 84ae8fd53c7e18d7a803ca3616a8370d17dc5219 Mon Sep 17 00:00:00 2001 From: sb Date: Fri, 29 Jan 2010 11:13:17 +0100 Subject: sb119: #i108560# avoid never-released StringHashTableImpl; simplified code --- sal/rtl/source/hash.cxx | 70 ++++++++++++++++++++++++------------------------ sal/rtl/source/hash.h | 10 +++---- sal/rtl/source/ustring.c | 8 ++---- 3 files changed, 40 insertions(+), 48 deletions(-) (limited to 'sal') diff --git a/sal/rtl/source/hash.cxx b/sal/rtl/source/hash.cxx index 5bb428434722..6d2ae3fee435 100644 --- a/sal/rtl/source/hash.cxx +++ b/sal/rtl/source/hash.cxx @@ -39,52 +39,51 @@ #include namespace { - struct UStringHash - { - size_t operator()(rtl_uString * const &rString) const - { return (size_t)rtl_ustr_hashCode_WithLength( rString->buffer, rString->length ); } - }; - struct UStringEqual - { - sal_Bool operator() ( rtl_uString * const &pStringA, - rtl_uString * const &pStringB) const - { - if (pStringA == pStringB) - return true; - if (pStringA->length != pStringB->length) - return false; - return !rtl_ustr_compare_WithLength( pStringA->buffer, pStringA->length, - pStringB->buffer, pStringB->length); - } - }; -} -typedef std::hash_set< rtl_uString *, UStringHash, UStringEqual, - rtl::Allocator > UniqueHash; +struct UStringHash +{ + size_t operator()(rtl_uString * const &rString) const + { return (size_t)rtl_ustr_hashCode_WithLength( rString->buffer, rString->length ); } +}; -struct StringHashTableImpl : public UniqueHash +struct UStringEqual { - StringHashTableImpl(sal_uInt32 nSize) : UniqueHash( nSize ) {} + sal_Bool operator() ( rtl_uString * const &pStringA, + rtl_uString * const &pStringB) const + { + if (pStringA == pStringB) + return true; + if (pStringA->length != pStringB->length) + return false; + return !rtl_ustr_compare_WithLength( pStringA->buffer, pStringA->length, + pStringB->buffer, pStringB->length); + } }; +typedef std::hash_set< rtl_uString *, UStringHash, UStringEqual, + rtl::Allocator > StringHashTable; + StringHashTable * -rtl_str_hash_new (sal_uInt32 nSize) +getHashTable () { - return new StringHashTableImpl (nSize); + static StringHashTable *pInternPool = NULL; + if (pInternPool == NULL) { + static StringHashTable aImpl(1024); + pInternPool = &aImpl; + } + return pInternPool; } -void -rtl_str_hash_free (StringHashTable *pHash) -{ - delete pHash; } +extern "C" { + rtl_uString * -rtl_str_hash_intern (StringHashTable *pHash, - rtl_uString *pString, +rtl_str_hash_intern (rtl_uString *pString, int can_return) { - UniqueHash::iterator aIter; + StringHashTable *pHash = getHashTable(); + StringHashTable::iterator aIter; aIter = pHash->find(pString); if (aIter != pHash->end()) { @@ -109,8 +108,9 @@ rtl_str_hash_intern (StringHashTable *pHash, } void -rtl_str_hash_remove (StringHashTable *pHash, - rtl_uString *pString) +rtl_str_hash_remove (rtl_uString *pString) { - pHash->erase(pString); + getHashTable()->erase(pString); +} + } diff --git a/sal/rtl/source/hash.h b/sal/rtl/source/hash.h index 63f3e99c8495..2aadfb33efcd 100644 --- a/sal/rtl/source/hash.h +++ b/sal/rtl/source/hash.h @@ -8,15 +8,11 @@ extern "C" { #endif /* __cplusplus */ -typedef struct StringHashTableImpl StringHashTable; +/* These functions are not multi-thread safe: */ -StringHashTable *rtl_str_hash_new (sal_uInt32 nSize); -void rtl_str_hash_free (StringHashTable *pHash); -rtl_uString *rtl_str_hash_intern (StringHashTable *pHash, - rtl_uString *pString, +rtl_uString *rtl_str_hash_intern (rtl_uString *pString, int can_return); -void rtl_str_hash_remove (StringHashTable *pHash, - rtl_uString *pString); +void rtl_str_hash_remove (rtl_uString *pString); #if defined __cplusplus } diff --git a/sal/rtl/source/ustring.c b/sal/rtl/source/ustring.c index bfe9a7c5f2bd..2274107a8c07 100644 --- a/sal/rtl/source/ustring.c +++ b/sal/rtl/source/ustring.c @@ -756,8 +756,6 @@ getInternMutex() return pPoolGuard; } -static StringHashTable *pInternPool = NULL; - /* returns true if we found a dup in the pool */ static void rtl_ustring_intern_internal( rtl_uString ** newStr, rtl_uString * str, @@ -769,9 +767,7 @@ static void rtl_ustring_intern_internal( rtl_uString ** newStr, osl_acquireMutex( pPoolMutex ); - if (!pInternPool) - pInternPool = rtl_str_hash_new (1024); - *newStr = rtl_str_hash_intern (pInternPool, str, can_return); + *newStr = rtl_str_hash_intern (str, can_return); osl_releaseMutex( pPoolMutex ); @@ -859,7 +855,7 @@ internRelease (rtl_uString *pThis) pPoolMutex = getInternMutex(); osl_acquireMutex( pPoolMutex ); - rtl_str_hash_remove (pInternPool, pThis); + rtl_str_hash_remove (pThis); /* May have been separately acquired */ if ( SAL_STRING_REFCOUNT( -- cgit From 5611c35f047b9568a4a51c243069113fd5b1e462 Mon Sep 17 00:00:00 2001 From: sb Date: Fri, 29 Jan 2010 12:57:03 +0100 Subject: sb119: #i107473# fix invalid static_cast (patch by dtardon) --- sal/inc/osl/diagnose.hxx | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) (limited to 'sal') diff --git a/sal/inc/osl/diagnose.hxx b/sal/inc/osl/diagnose.hxx index 799a5a035885..ea27f1d00003 100644 --- a/sal/inc/osl/diagnose.hxx +++ b/sal/inc/osl/diagnose.hxx @@ -128,19 +128,17 @@ public: VoidPointerSet::const_iterator iPos(m_data.m_addresses.begin()); VoidPointerSet::const_iterator const iEnd(m_data.m_addresses.end()); for ( ; iPos != iEnd; ++iPos ) { - T const* pLeakingObj = static_cast(*iPos); - OSL_ASSERT( pLeakingObj != 0 ); - static_cast(pLeakingObj); + OSL_ASSERT( *iPos != 0 ); } } return bRet; } - void registerObject( T const* pObj ) { + void registerObject( void const* pObj ) { osl_detail_ObjectRegistry_registerObject(m_data, pObj); } - void revokeObject( T const* pObj ) { + void revokeObject( void const* pObj ) { osl_detail_ObjectRegistry_revokeObject(m_data, pObj); } @@ -191,12 +189,10 @@ public: protected: DebugBase() { - StaticObjectRegistry::get().registerObject( - static_cast(this) ); + StaticObjectRegistry::get().registerObject( this ); } ~DebugBase() { - StaticObjectRegistry::get().revokeObject( - static_cast(this) ); + StaticObjectRegistry::get().revokeObject( this ); } private: -- cgit From a51028098af2f5f531a2fe87d20856c0d6a655ac Mon Sep 17 00:00:00 2001 From: sb Date: Mon, 1 Feb 2010 09:25:10 +0100 Subject: sb119: #i108244# small fix for Linux socket handling (patch by olistraub) --- sal/osl/unx/socket.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'sal') diff --git a/sal/osl/unx/socket.c b/sal/osl/unx/socket.c index 362f3b0f2644..40767a4ade2b 100644 --- a/sal/osl/unx/socket.c +++ b/sal/osl/unx/socket.c @@ -1861,6 +1861,9 @@ void SAL_CALL osl_closeSocket(oslSocket pSocket) pSocket->m_nLastError=0; nFD = pSocket->m_Socket; + if (nFD == OSL_INVALID_SOCKET) + return; + pSocket->m_Socket = OSL_INVALID_SOCKET; #if defined(LINUX) @@ -1907,6 +1910,7 @@ void SAL_CALL osl_closeSocket(oslSocket pSocket) #endif /* OSL_DEBUG_LEVEL */ close(nConnFD); } + pSocket->m_bIsAccepting = sal_False; } #endif /* LINUX */ -- cgit