summaryrefslogtreecommitdiff
path: root/configmgr
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@suse.com>2011-08-31 00:37:22 -0400
committerKohei Yoshida <kohei.yoshida@suse.com>2011-08-31 00:51:19 -0400
commit4580e570bd8ae86b509c7d566e4ff4b144fa8ed4 (patch)
tree75cde3bdddfb4d64c743eb915394224449753f12 /configmgr
parentb19dcd453aad3a43331141adc7e859a840bbfc4c (diff)
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.
Diffstat (limited to 'configmgr')
-rw-r--r--configmgr/source/components.cxx8
-rw-r--r--configmgr/source/rootaccess.cxx21
-rw-r--r--configmgr/source/rootaccess.hxx8
3 files changed, 20 insertions, 17 deletions
diff --git a/configmgr/source/components.cxx b/configmgr/source/components.cxx
index d4b3130ca9ed..ec2c0a6d00bb 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 4ae38c43797a..47f2c2a97992 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 c1751210c50c..1290519b5d99 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;
};
}