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

Michael Stahl mstahl at redhat.com
Thu Jan 15 13:03:14 PST 2015


 ucb/source/ucp/tdoc/tdoc_docmgr.cxx |    9 ++++++---
 ucb/source/ucp/tdoc/tdoc_docmgr.hxx |    9 ++++++---
 2 files changed, 12 insertions(+), 6 deletions(-)

New commits:
commit 0ffa3abc7d6c0437ece30cfb1430d28ffcc9f5c1
Author: Michael Stahl <mstahl at redhat.com>
Date:   Thu Jan 15 21:47:44 2015 +0100

    rhbz#1163106: tdoc_ucp: fix life cycle of OfficeDocumentsCloseListener
    
    The tdoc_ucp::OfficeDocumentsManager lives until the service manager
    is disposed on shutdown, but if the database stuff isn't disposed in due
    time then a document may call the notifyClosing() on the listener after
    the OfficeDocumentsManager dies; probably something is leaking the
    ODatabaseContext...
    
    Change-Id: I59662b910589d7270697452b2f4ca6c960d22f22

diff --git a/ucb/source/ucp/tdoc/tdoc_docmgr.cxx b/ucb/source/ucp/tdoc/tdoc_docmgr.cxx
index f6da87a3..79e4e2b 100644
--- a/ucb/source/ucp/tdoc/tdoc_docmgr.cxx
+++ b/ucb/source/ucp/tdoc/tdoc_docmgr.cxx
@@ -74,6 +74,8 @@ void SAL_CALL OfficeDocumentsManager::OfficeDocumentsCloseListener::notifyClosin
          const lang::EventObject& Source )
     throw ( uno::RuntimeException, std::exception )
 {
+    if (!m_pManager) return; // disposed?
+
     document::DocumentEvent aDocEvent;
     aDocEvent.Source = Source.Source;
     aDocEvent.EventName = "OfficeDocumentsListener::notifyClosing";
@@ -124,6 +126,7 @@ OfficeDocumentsManager::~OfficeDocumentsManager()
     // objects are actually released/destroyed upon shutdown is not defined. And when we arrive *here*,
     // OOo *is* shutting down currently, since we're held by the TDOC provider, which is disposed
     // upon shutdown.
+    m_xDocCloseListener->Dispose();
 }
 
 
@@ -235,7 +238,7 @@ void SAL_CALL OfficeDocumentsManager::documentEventOccured(
                     "OnLoadFinished/OnCreate event: got no close broadcaster!" );
 
                 if ( xCloseBroadcaster.is() )
-                    xCloseBroadcaster->addCloseListener( m_xDocCloseListener );
+                    xCloseBroadcaster->addCloseListener(m_xDocCloseListener.get());
 
                 // Propagate document closure.
                 OSL_ENSURE( m_pDocEventListener,
@@ -294,7 +297,7 @@ void SAL_CALL OfficeDocumentsManager::documentEventOccured(
                     "OnUnload event: got no XCloseBroadcaster from XModel" );
 
                 if ( xCloseBroadcaster.is() )
-                    xCloseBroadcaster->removeCloseListener( m_xDocCloseListener );
+                    xCloseBroadcaster->removeCloseListener(m_xDocCloseListener.get());
 
                 m_aDocs.erase( it );
             }
@@ -501,7 +504,7 @@ void OfficeDocumentsManager::buildDocumentsList()
                             "buildDocumentsList: got no close broadcaster!" );
 
                         if ( xCloseBroadcaster.is() )
-                            xCloseBroadcaster->addCloseListener( m_xDocCloseListener );
+                            xCloseBroadcaster->addCloseListener(m_xDocCloseListener.get());
                     }
                 }
             }
diff --git a/ucb/source/ucp/tdoc/tdoc_docmgr.hxx b/ucb/source/ucp/tdoc/tdoc_docmgr.hxx
index 003e784..f71f0c7 100644
--- a/ucb/source/ucp/tdoc/tdoc_docmgr.hxx
+++ b/ucb/source/ucp/tdoc/tdoc_docmgr.hxx
@@ -22,6 +22,7 @@
 
 #include <map>
 
+#include <rtl/ref.hxx>
 #include "osl/mutex.hxx"
 
 #include "cppuhelper/implbase1.hxx"
@@ -90,7 +91,7 @@ namespace tdoc_ucp {
         {
         public:
             OfficeDocumentsCloseListener( OfficeDocumentsManager * pMgr )
-            : m_pManager( pMgr ) {};
+                : m_pManager( pMgr ) {}
 
             // util::XCloseListener
             virtual void SAL_CALL queryClosing(
@@ -107,6 +108,9 @@ namespace tdoc_ucp {
             virtual void SAL_CALL disposing(
                     const com::sun::star::lang::EventObject & Source )
                 throw ( com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
+
+            void Dispose() { m_pManager = 0; }
+
         private:
             OfficeDocumentsManager * m_pManager;
         };
@@ -185,8 +189,7 @@ namespace tdoc_ucp {
             com::sun::star::frame::XModuleManager2 >        m_xModuleMgr;
         DocumentList                                        m_aDocs;
         OfficeDocumentsEventListener *                      m_pDocEventListener;
-        com::sun::star::uno::Reference<
-            com::sun::star::util::XCloseListener >          m_xDocCloseListener;
+        ::rtl::Reference<OfficeDocumentsCloseListener> m_xDocCloseListener;
     };
 
 } // namespace tdoc_ucp


More information about the Libreoffice-commits mailing list