[Libreoffice-commits] core.git: binaryurp/source

Stephan Bergmann sbergman at redhat.com
Mon May 19 09:12:18 PDT 2014


 binaryurp/source/bridgefactory.cxx |   31 +++++++++++++++++++++++++++++++
 binaryurp/source/bridgefactory.hxx |    2 ++
 2 files changed, 33 insertions(+)

New commits:
commit 184e4ef35641403fd293262ee413ceee37b3761a
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Mon May 19 18:06:16 2014 +0200

    rhbz#1016758: Dispose bridges when disposing bridge factory
    
    ... (which happens when the service manager is disposed), so that no bridges can
    still run during exit.  But this is so glaring that I wonder whether I missed
    the obvious when I originally wrote that code, or whether I rather miss the
    obvious now.  So better let this rest for a while on master before deciding
    about any backports.
    
    Change-Id: I7c9ad6c8a53dfd1a7b702640920dcb0a9a2c3007

diff --git a/binaryurp/source/bridgefactory.cxx b/binaryurp/source/bridgefactory.cxx
index 93cd22b..c397255 100644
--- a/binaryurp/source/bridgefactory.cxx
+++ b/binaryurp/source/bridgefactory.cxx
@@ -116,6 +116,11 @@ css::uno::Reference< css::bridge::XBridge > BridgeFactory::createBridge(
     rtl::Reference< Bridge > b;
     {
         osl::MutexGuard g(m_aMutex);
+        if (rBHelper.bDisposed) {
+            throw css::lang::DisposedException(
+                "BridgeFactory disposed",
+                static_cast< cppu::OWeakObject * >(this));
+        }
         if (named_.find(sName) != named_.end()) {
             throw css::bridge::BridgeExistsException(
                 sName, static_cast< cppu::OWeakObject * >(this));
@@ -173,6 +178,32 @@ BridgeFactory::getExistingBridges() throw (css::uno::RuntimeException, std::exce
     return s;
 }
 
+void BridgeFactory::disposing() {
+    BridgeList l1;
+    BridgeMap l2;
+    {
+        osl::MutexGuard g(m_aMutex);
+        l1.swap(unnamed_);
+        l2.swap(named_);
+    }
+    for (BridgeList::iterator i(l1.begin()); i != l1.end(); ++i) {
+        try {
+            css::uno::Reference<css::lang::XComponent>(
+                *i, css::uno::UNO_QUERY_THROW)->dispose();
+        } catch (css::uno::Exception & e) {
+            SAL_WARN("binaryurp", "ignoring Exception " << e.Message);
+        }
+    }
+    for (BridgeMap::iterator i(l2.begin()); i != l2.end(); ++i) {
+        try {
+            css::uno::Reference<css::lang::XComponent>(
+                i->second, css::uno::UNO_QUERY_THROW)->dispose();
+        } catch (css::uno::Exception & e) {
+            SAL_WARN("binaryurp", "ignoring Exception " << e.Message);
+        }
+    }
+}
+
 }
 
 namespace {
diff --git a/binaryurp/source/bridgefactory.hxx b/binaryurp/source/bridgefactory.hxx
index cb8f9f3..8607626 100644
--- a/binaryurp/source/bridgefactory.hxx
+++ b/binaryurp/source/bridgefactory.hxx
@@ -117,6 +117,8 @@ private:
         com::sun::star::uno::Reference< com::sun::star::bridge::XBridge > >
     SAL_CALL getExistingBridges() throw (com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
 
+    void SAL_CALL disposing() SAL_OVERRIDE;
+
     typedef
         std::list<
             com::sun::star::uno::Reference< com::sun::star::bridge::XBridge > >


More information about the Libreoffice-commits mailing list