[Libreoffice-commits] .: configmgr/source

Kohei Yoshida kohei at kemper.freedesktop.org
Tue Aug 30 21:52:20 PDT 2011


 configmgr/source/components.cxx |    8 +++-----
 configmgr/source/rootaccess.cxx |   21 +++++++++++----------
 configmgr/source/rootaccess.hxx |    8 ++++++--
 3 files changed, 20 insertions(+), 17 deletions(-)

New commits:
commit 4580e570bd8ae86b509c7d566e4ff4b144fa8ed4
Author: Kohei Yoshida <kohei.yoshida at suse.com>
Date:   Wed Aug 31 00:37:22 2011 -0400

    Tell RootAccess when Components instance is destroyed.
    
    This is to avoid RootAccess instances, which are ref-counted, to
    avoid accessing the Components instance, which is a singleton.
    
    The problem may arise when shutting down the entire app where it's
    entirely unclear whether the RootAccess instances get destroyed first
    or the Components instance does.  In fact, on my Windows XP environment
    this repeatedly caused crash-on-close issue which would lead to "DDE
    server error" Windows system error dialog popping up afterwards.

diff --git a/configmgr/source/components.cxx b/configmgr/source/components.cxx
index d4b3130..ec2c0a6 100644
--- a/configmgr/source/components.cxx
+++ b/configmgr/source/components.cxx
@@ -504,16 +504,12 @@ css::beans::Optional< css::uno::Any > Components::getExternalValue(
     return value;
 }
 
-int tempHACK = 0;
-
 Components::Components(
     css::uno::Reference< css::uno::XComponentContext > const & context):
     context_(context)
 {
     lock_ = lock();
 
-    tempHACK = 1;
-
     OSL_ASSERT(context.is());
     RTL_LOGFILE_TRACE_AUTHOR("configmgr", "sb", "begin parsing");
     parseXcsXcuLayer(
@@ -592,7 +588,9 @@ Components::Components(
 Components::~Components()
 {
     flushModifications();
-    tempHACK = 0;
+    for (WeakRootSet::iterator i(roots_.begin()); i != roots_.end(); ++i) {
+        (*i)->setAlive(false);
+    }
 }
 
 void Components::parseFileLeniently(
diff --git a/configmgr/source/rootaccess.cxx b/configmgr/source/rootaccess.cxx
index 4ae38c4..47f2c2a 100644
--- a/configmgr/source/rootaccess.cxx
+++ b/configmgr/source/rootaccess.cxx
@@ -77,7 +77,7 @@ RootAccess::RootAccess(
     Components & components, rtl::OUString const & pathRepresentation,
     rtl::OUString const & locale, bool update):
     Access(components), pathRepresentation_(pathRepresentation),
-    locale_(locale), update_(update)
+    locale_(locale), update_(update), finalized_(false), alive_(true)
 {
     lock_ = lock();
 }
@@ -130,10 +130,15 @@ bool RootAccess::isUpdate() const {
     return update_;
 }
 
+void RootAccess::setAlive(bool b) {
+    alive_ = b;
+}
+
 RootAccess::~RootAccess()
 {
     osl::MutexGuard g(*lock_);
-    getComponents().removeRootAccess(this);
+    if (alive_)
+        getComponents().removeRootAccess(this);
 }
 
 Path RootAccess::getRelativePath() {
@@ -291,24 +296,20 @@ void RootAccess::removeChangesListener(
     }
 }
 
-extern int tempHACK;
-
 void RootAccess::commitChanges()
     throw (css::lang::WrappedTargetException, css::uno::RuntimeException)
 {
 #if OSL_DEBUG_LEVEL > 0
     OSL_ASSERT(thisIs(IS_UPDATE));
 #endif
+    if (!alive_)
+    {
+        return;
+    }
     Broadcaster bc;
     {
         osl::MutexGuard g(*lock_);
 
-        // OSL_ENSURE(tempHACK, "fucktastic!, seriously busted lifecycles\n");
-        if (!tempHACK)
-        {
-            return;
-        }
-
         checkLocalizedPropertyAccess();
         int finalizedLayer;
         Modifications globalMods;
diff --git a/configmgr/source/rootaccess.hxx b/configmgr/source/rootaccess.hxx
index c175121..1290519 100644
--- a/configmgr/source/rootaccess.hxx
+++ b/configmgr/source/rootaccess.hxx
@@ -86,6 +86,8 @@ public:
 
     bool isUpdate() const;
 
+    void setAlive(bool b);
+
 protected:
 
     virtual rtl::OUString SAL_CALL getImplementationName()
@@ -151,14 +153,16 @@ private:
 
     rtl::OUString pathRepresentation_;
     rtl::OUString locale_;
-    bool update_;
     Path path_;
     rtl::Reference< Node > node_;
     rtl::OUString name_;
-    bool finalized_;
     ChangesListeners changesListeners_;
 
     boost::shared_ptr<osl::Mutex> lock_;
+
+    bool update_:1;
+    bool finalized_:1;
+    bool alive_:1;
 };
 
 }


More information about the Libreoffice-commits mailing list