[Libreoffice-commits] core.git: Branch 'private/kohei/headless-perf' - 2 commits - basic/source desktop/Library_sofficeapp.mk desktop/source include/basic unotest/Library_unotest.mk unotest/source

Kohei Yoshida kohei.yoshida at collabora.com
Wed May 28 19:36:23 PDT 2014


 basic/source/classes/sb.cxx                 |   20 ++++++++++++++++++--
 basic/source/classes/sbunoobj.cxx           |   26 +++++++++++++++++++-------
 desktop/Library_sofficeapp.mk               |    1 +
 desktop/source/app/app.cxx                  |    2 ++
 include/basic/sbstar.hxx                    |    2 ++
 unotest/Library_unotest.mk                  |    1 +
 unotest/source/cpp/bootstrapfixturebase.cxx |    2 ++
 7 files changed, 45 insertions(+), 9 deletions(-)

New commits:
commit b8e9e78457f8a32194b9129a8e30571e201b6348
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Wed May 28 22:33:29 2014 -0400

    Detach all DocBasicItem objects upon process termination.
    
    To prevent rogue DocBasicItem objects (which are global objects) from
    attempting to stop listening after the main app is dead.
    
    Change-Id: I68a667137ca4e0eff18278f4d2d5dd67466eaf34

diff --git a/basic/source/classes/sb.cxx b/basic/source/classes/sb.cxx
index 3d38428..922df3e 100644
--- a/basic/source/classes/sb.cxx
+++ b/basic/source/classes/sb.cxx
@@ -80,6 +80,11 @@ public:
     void startListening();
     void stopListening();
 
+    void setDisposed( bool bDisposed )
+    {
+        mbDisposed = bDisposed;
+    }
+
     virtual void SAL_CALL queryClosing( const lang::EventObject& rSource, sal_Bool bGetsOwnership ) throw (util::CloseVetoException, uno::RuntimeException, std::exception) SAL_OVERRIDE;
     virtual void SAL_CALL notifyClosing( const lang::EventObject& rSource ) throw (uno::RuntimeException, std::exception) SAL_OVERRIDE;
     virtual void SAL_CALL disposing( const lang::EventObject& rSource ) throw (uno::RuntimeException, std::exception) SAL_OVERRIDE;
@@ -2007,7 +2012,16 @@ Reference< frame::XModel > StarBASIC::GetModelFromBasic( SbxObject* pBasic )
     return xModel;
 }
 
-
+void StarBASIC::DetachAllDocBasicItems()
+{
+    DocBasicItemMap& rItems = GaDocBasicItems::get();
+    DocBasicItemMap::iterator it = rItems.begin(), itEnd = rItems.end();
+    for (; it != itEnd; ++it)
+    {
+        DocBasicItemRef xItem = it->second;
+        xItem->setDisposed(true);
+    }
+}
 
 // #118116 Implementation Collection object
 
diff --git a/desktop/Library_sofficeapp.mk b/desktop/Library_sofficeapp.mk
index 0c6c3e7..01950fc 100644
--- a/desktop/Library_sofficeapp.mk
+++ b/desktop/Library_sofficeapp.mk
@@ -39,6 +39,7 @@ $(eval $(call gb_Library_use_libraries,sofficeapp,\
     i18nlangtag \
     sal \
     salhelper \
+    sb \
     sfx \
     svl \
     svt \
diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx
index bb14e03..9fa787c 100644
--- a/desktop/source/app/app.cxx
+++ b/desktop/source/app/app.cxx
@@ -98,6 +98,7 @@
 #include <sfx2/app.hxx>
 #include <svl/itemset.hxx>
 #include <svl/eitem.hxx>
+#include <basic/sbstar.hxx>
 
 #include <svtools/fontsubstconfig.hxx>
 #include <svtools/accessibilityoptions.hxx>
@@ -1766,6 +1767,7 @@ int Desktop::doShutdown()
     // with the solar mutex unlocked, to avoid deadlock:
     sal_uLong nAcquireCount = Application::ReleaseSolarMutex();
     DeregisterServices();
+    StarBASIC::DetachAllDocBasicItems();
     Application::AcquireSolarMutex(nAcquireCount);
     // be sure that path/language options gets destroyed before
     // UCB is deinitialized
diff --git a/include/basic/sbstar.hxx b/include/basic/sbstar.hxx
index 2eec72b..cb1d49a 100644
--- a/include/basic/sbstar.hxx
+++ b/include/basic/sbstar.hxx
@@ -174,6 +174,8 @@ public:
 
     static ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >
         GetModelFromBasic( SbxObject* pBasic );
+
+    static void DetachAllDocBasicItems();
 };
 
 typedef tools::SvRef<StarBASIC> StarBASICRef;
diff --git a/unotest/Library_unotest.mk b/unotest/Library_unotest.mk
index cfc6fc1..3f9d99b 100644
--- a/unotest/Library_unotest.mk
+++ b/unotest/Library_unotest.mk
@@ -21,6 +21,7 @@ $(eval $(call gb_Library_use_libraries,unotest,\
 	cppu \
 	cppuhelper \
 	sal \
+	sb \
 	$(gb_UWINAPI) \
 ))
 
diff --git a/unotest/source/cpp/bootstrapfixturebase.cxx b/unotest/source/cpp/bootstrapfixturebase.cxx
index 87a72a7..c407dc6 100644
--- a/unotest/source/cpp/bootstrapfixturebase.cxx
+++ b/unotest/source/cpp/bootstrapfixturebase.cxx
@@ -15,6 +15,7 @@
 #include <rtl/bootstrap.hxx>
 #include <cppuhelper/bootstrap.hxx>
 #include <comphelper/processfactory.hxx>
+#include <basic/sbstar.hxx>
 
 #include <com/sun/star/lang/Locale.hpp>
 #include <com/sun/star/lang/XComponent.hpp>
@@ -105,6 +106,7 @@ void test::BootstrapFixtureBase::setUp()
 
 void test::BootstrapFixtureBase::tearDown()
 {
+    StarBASIC::DetachAllDocBasicItems();
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 424c84371c89db0d843dd42a1d534972a1d5d7e9
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Wed May 28 20:54:50 2014 -0400

    Avoid static local of a singleton.  This crashed writer unit tests.
    
    Change-Id: I7c5f2d372676cdb317a8dad636bf1aab7dd5db37

diff --git a/basic/source/classes/sb.cxx b/basic/source/classes/sb.cxx
index 5a37bbc..3d38428 100644
--- a/basic/source/classes/sb.cxx
+++ b/basic/source/classes/sb.cxx
@@ -128,7 +128,9 @@ void DocBasicItem::stopListening()
     if( mbDisposed ) return;
     mbDisposed = true;
     Any aThisComp;
-    mrDocBasic.GetUNOConstant( "ThisComponent", aThisComp );
+    if (!mrDocBasic.GetUNOConstant("ThisComponent", aThisComp))
+        return;
+
     Reference< util::XCloseBroadcaster > xCloseBC( aThisComp, UNO_QUERY );
     if( xCloseBC.is() )
     {
diff --git a/basic/source/classes/sbunoobj.cxx b/basic/source/classes/sbunoobj.cxx
index 7e5dcfd..e519cb7 100644
--- a/basic/source/classes/sbunoobj.cxx
+++ b/basic/source/classes/sbunoobj.cxx
@@ -2443,19 +2443,31 @@ SbUnoObject::~SbUnoObject()
 // pass the introspection on Demand
 void SbUnoObject::doIntrospection( void )
 {
-    static Reference< XIntrospection > xIntrospection;
-
     if( !bNeedIntrospection )
         return;
-    bNeedIntrospection = false;
 
-    if( !xIntrospection.is() )
+    Reference<XComponentContext> xContext = comphelper::getProcessComponentContext();
+
+    if (!xContext.is())
+        return;
+
+
+    // get the introspection service
+    Reference<XIntrospection> xIntrospection;
+
+    try
+    {
+        xIntrospection = theIntrospection::get(xContext);
+    }
+    catch ( const css::uno::DeploymentException& ex )
     {
-        // get the introspection service
-        Reference< XComponentContext > xContext( comphelper::getProcessComponentContext() );
-        xIntrospection = theIntrospection::get( xContext );
     }
 
+    if (!xIntrospection.is())
+        return;
+
+    bNeedIntrospection = false;
+
     // pass the introspection
     try
     {


More information about the Libreoffice-commits mailing list