[Libreoffice-commits] core.git: 3 commits - cppuhelper/source framework/source i18npool/inc i18npool/source

Stephan Bergmann sbergman at redhat.com
Mon Jan 4 05:24:20 PST 2016


 cppuhelper/source/component_context.cxx                    |    4 -
 framework/source/uifactory/uielementfactorymanager.cxx     |   47 ++++++++-----
 framework/source/uifactory/windowcontentfactorymanager.cxx |   33 +++------
 i18npool/inc/numberformatcode.hxx                          |    1 
 i18npool/source/numberformatcode/numberformatcode.cxx      |    4 +
 5 files changed, 51 insertions(+), 38 deletions(-)

New commits:
commit d01888302b03a79bf7ccde6cbe8434b427164a75
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Mon Jan 4 14:22:59 2016 +0100

    tdf#82775: Make NumberFormatCodeMapper MT safe
    
    Change-Id: I77f49f09ce9fe5897f78044c0522210978c904d1

diff --git a/i18npool/inc/numberformatcode.hxx b/i18npool/inc/numberformatcode.hxx
index 3b36cec..9c7d780 100644
--- a/i18npool/inc/numberformatcode.hxx
+++ b/i18npool/inc/numberformatcode.hxx
@@ -54,6 +54,7 @@ public:
                 throw( css::uno::RuntimeException, std::exception ) override;
 
 private:
+    osl::Mutex maMutex;
     css::lang::Locale aLocale;
     css::uno::Reference < css::uno::XComponentContext > mxContext;
     css::uno::Sequence< css::i18n::FormatElement > aFormatSeq;
diff --git a/i18npool/source/numberformatcode/numberformatcode.cxx b/i18npool/source/numberformatcode/numberformatcode.cxx
index 76beead..e329589 100644
--- a/i18npool/source/numberformatcode/numberformatcode.cxx
+++ b/i18npool/source/numberformatcode/numberformatcode.cxx
@@ -44,6 +44,7 @@ NumberFormatCodeMapper::getDefault( sal_Int16 formatType, sal_Int16 formatUsage,
     OUString elementType = mapElementTypeShortToString(formatType);
     OUString elementUsage = mapElementUsageShortToString(formatUsage);
 
+    osl::MutexGuard g(maMutex);
     getFormats( rLocale );
 
     for(sal_Int32 i = 0; i < aFormatSeq.getLength(); i++) {
@@ -68,6 +69,7 @@ NumberFormatCodeMapper::getDefault( sal_Int16 formatType, sal_Int16 formatUsage,
 css::i18n::NumberFormatCode SAL_CALL
 NumberFormatCodeMapper::getFormatCode( sal_Int16 formatIndex, const css::lang::Locale& rLocale ) throw(css::uno::RuntimeException, std::exception)
 {
+    osl::MutexGuard g(maMutex);
     getFormats( rLocale );
 
     for(sal_Int32 i = 0; i < aFormatSeq.getLength(); i++) {
@@ -92,6 +94,7 @@ NumberFormatCodeMapper::getFormatCode( sal_Int16 formatIndex, const css::lang::L
 css::uno::Sequence< css::i18n::NumberFormatCode > SAL_CALL
 NumberFormatCodeMapper::getAllFormatCode( sal_Int16 formatUsage, const css::lang::Locale& rLocale ) throw(css::uno::RuntimeException, std::exception)
 {
+    osl::MutexGuard g(maMutex);
     getFormats( rLocale );
 
     sal_Int32 i, count;
@@ -125,6 +128,7 @@ NumberFormatCodeMapper::getAllFormatCode( sal_Int16 formatUsage, const css::lang
 css::uno::Sequence< css::i18n::NumberFormatCode > SAL_CALL
 NumberFormatCodeMapper::getAllFormatCodes( const css::lang::Locale& rLocale ) throw(css::uno::RuntimeException, std::exception)
 {
+    osl::MutexGuard g(maMutex);
     getFormats( rLocale );
 
     css::uno::Sequence<css::i18n::NumberFormatCode> seq(aFormatSeq.getLength());
commit e83f31724e0f2cd4242e0b398c48578da53cb5c1
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Mon Jan 4 14:21:45 2016 +0100

    tdf#82775: Don't prematurely dispose single-instance services
    
    ...that happen to be requested concurrently from multiple threads
    
    Change-Id: Icecfb0b8d88c9123064689643eddf90a99d3b1b8

diff --git a/cppuhelper/source/component_context.cxx b/cppuhelper/source/component_context.cxx
index 1a95f4a..21f7cfd 100644
--- a/cppuhelper/source/component_context.cxx
+++ b/cppuhelper/source/component_context.cxx
@@ -620,7 +620,9 @@ Any ComponentContext::lookupMap( OUString const & rName )
             ret = pEntry->value;
     }
     guard.clear();
-    try_dispose( xInstance );
+    if (ret != xInstance) {
+        try_dispose( xInstance );
+    }
     return ret;
 }
 
commit 26cbb3d1049e789a1c2f56599dbfe0f379fc4b3d
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Mon Jan 4 14:20:16 2016 +0100

    Related tdf#82775: Check for disposed-ness
    
    ...instead of dereferencing null pointers
    
    Change-Id: I9d1709468a5b601b9f3d86dadea7a8e817f449d8

diff --git a/framework/source/uifactory/uielementfactorymanager.cxx b/framework/source/uifactory/uielementfactorymanager.cxx
index 5e4dc6d..23c68f8 100644
--- a/framework/source/uifactory/uielementfactorymanager.cxx
+++ b/framework/source/uifactory/uielementfactorymanager.cxx
@@ -390,33 +390,24 @@ public:
 private:
     bool                                                  m_bConfigRead;
     css::uno::Reference< css::uno::XComponentContext >        m_xContext;
-    ConfigurationAccess_FactoryManager*                       m_pConfigAccess;
+    rtl::Reference<ConfigurationAccess_FactoryManager> m_pConfigAccess;
 };
 
 UIElementFactoryManager::UIElementFactoryManager( const Reference< XComponentContext >& rxContext ) :
     UIElementFactoryManager_BASE(m_aMutex),
     m_bConfigRead( false ),
-    m_xContext(rxContext)
-{
-    m_pConfigAccess = new ConfigurationAccess_FactoryManager(rxContext,
-            "/org.openoffice.Office.UI.Factories/Registered/UIElementFactories");
-    m_pConfigAccess->acquire();
-}
+    m_xContext(rxContext),
+    m_pConfigAccess(
+        new ConfigurationAccess_FactoryManager(
+            rxContext,
+            "/org.openoffice.Office.UI.Factories/Registered/UIElementFactories"))
+{}
 
-UIElementFactoryManager::~UIElementFactoryManager()
-{
-    disposing();
-}
+UIElementFactoryManager::~UIElementFactoryManager() {}
 
 void SAL_CALL UIElementFactoryManager::disposing()
 {
-    osl::MutexGuard g(rBHelper.rMutex);
-    if (m_pConfigAccess)
-    {
-        // reduce reference count
-        m_pConfigAccess->release();
-        m_pConfigAccess = nullptr;
-    }
+    m_pConfigAccess.clear();
 }
 
 // XUIElementFactory
@@ -429,6 +420,10 @@ throw ( css::container::NoSuchElementException, css::lang::IllegalArgumentExcept
     OUString aModuleId;
     { // SAFE
     osl::MutexGuard g(rBHelper.rMutex);
+    if (rBHelper.bDisposed) {
+        throw css::lang::DisposedException(
+            "disposed", static_cast<OWeakObject *>(this));
+    }
 
     if ( !m_bConfigRead )
     {
@@ -473,6 +468,10 @@ throw ( RuntimeException, std::exception )
 {
     // SAFE
     osl::MutexGuard g(rBHelper.rMutex);
+    if (rBHelper.bDisposed) {
+        throw css::lang::DisposedException(
+            "disposed", static_cast<OWeakObject *>(this));
+    }
 
     if ( !m_bConfigRead )
     {
@@ -489,6 +488,10 @@ throw ( RuntimeException, std::exception )
     OUString aServiceSpecifier;
     { // SAFE
     osl::MutexGuard g(rBHelper.rMutex);
+    if (rBHelper.bDisposed) {
+        throw css::lang::DisposedException(
+            "disposed", static_cast<OWeakObject *>(this));
+    }
 
     if ( !m_bConfigRead )
     {
@@ -524,6 +527,10 @@ throw ( ElementExistException, RuntimeException, std::exception )
 {
     // SAFE
     osl::MutexGuard g(rBHelper.rMutex);
+    if (rBHelper.bDisposed) {
+        throw css::lang::DisposedException(
+            "disposed", static_cast<OWeakObject *>(this));
+    }
 
     if ( !m_bConfigRead )
     {
@@ -540,6 +547,10 @@ throw ( NoSuchElementException, RuntimeException, std::exception )
 {
     // SAFE
     osl::MutexGuard g(rBHelper.rMutex);
+    if (rBHelper.bDisposed) {
+        throw css::lang::DisposedException(
+            "disposed", static_cast<OWeakObject *>(this));
+    }
 
     if ( !m_bConfigRead )
     {
diff --git a/framework/source/uifactory/windowcontentfactorymanager.cxx b/framework/source/uifactory/windowcontentfactorymanager.cxx
index d9a1c7a..de66679 100644
--- a/framework/source/uifactory/windowcontentfactorymanager.cxx
+++ b/framework/source/uifactory/windowcontentfactorymanager.cxx
@@ -33,6 +33,7 @@
 #include <cppuhelper/basemutex.hxx>
 #include <cppuhelper/compbase.hxx>
 #include <cppuhelper/supportsservice.hxx>
+#include <rtl/ref.hxx>
 #include <tools/diagnose_ex.h>
 
 using namespace ::com::sun::star;
@@ -79,34 +80,24 @@ private:
 
     css::uno::Reference< css::uno::XComponentContext >     m_xContext;
     bool                                               m_bConfigRead;
-    ConfigurationAccess_FactoryManager*                    m_pConfigAccess;
+    rtl::Reference<ConfigurationAccess_FactoryManager> m_pConfigAccess;
 };
 
 WindowContentFactoryManager::WindowContentFactoryManager( const uno::Reference< uno::XComponentContext >& rxContext ) :
     WindowContentFactoryManager_BASE(m_aMutex),
     m_xContext( rxContext ),
-    m_bConfigRead( false )
-{
-    m_pConfigAccess = new ConfigurationAccess_FactoryManager( m_xContext,
-            "/org.openoffice.Office.UI.WindowContentFactories/Registered/ContentFactories" );
-    m_pConfigAccess->acquire();
-}
+    m_bConfigRead( false ),
+    m_pConfigAccess(
+        new ConfigurationAccess_FactoryManager(
+            m_xContext,
+            "/org.openoffice.Office.UI.WindowContentFactories/Registered/ContentFactories"))
+{}
 
-WindowContentFactoryManager::~WindowContentFactoryManager()
-{
-    disposing();
-}
+WindowContentFactoryManager::~WindowContentFactoryManager() {}
 
 void SAL_CALL WindowContentFactoryManager::disposing()
 {
-    osl::MutexGuard g(rBHelper.rMutex);
-
-    if (m_pConfigAccess)
-    {
-        // reduce reference count
-        m_pConfigAccess->release();
-        m_pConfigAccess = nullptr;
-    }
+    m_pConfigAccess.clear();
 }
 
 // XSingleComponentFactory
@@ -165,6 +156,10 @@ throw (uno::Exception, uno::RuntimeException, std::exception)
         // module identifier, user interface element type and name
         { // SAFE
         osl::MutexGuard g(rBHelper.rMutex);
+        if (rBHelper.bDisposed) {
+            throw css::lang::DisposedException(
+                "disposed", static_cast<OWeakObject *>(this));
+        }
         if ( !m_bConfigRead )
         {
             m_bConfigRead = true;


More information about the Libreoffice-commits mailing list