summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2010-11-25 20:36:03 +0000
committerCaolán McNamara <caolanm@redhat.com>2010-11-25 20:36:03 +0000
commite34373935bff7f1ed8e8bfd06b54383917b1177a (patch)
tree04ca50fe43a29ea94b18235608a8a5c1eff45aa7
parent942df6544106661aba8c23e37a19cec8b188a5fb (diff)
Resolves: fdo#31494# get ownership right
Ensure that the mutex lives as long as all its consumers. And avoid launching threads if they have no work to do.
-rw-r--r--configmgr/source/access.cxx96
-rw-r--r--configmgr/source/access.hxx3
-rw-r--r--configmgr/source/childaccess.cxx12
-rw-r--r--configmgr/source/childaccess.hxx2
-rw-r--r--configmgr/source/components.cxx18
-rw-r--r--configmgr/source/components.hxx4
-rw-r--r--configmgr/source/configurationprovider.cxx10
-rw-r--r--configmgr/source/defaultprovider.cxx10
-rw-r--r--configmgr/source/lock.cxx8
-rw-r--r--configmgr/source/lock.hxx4
-rw-r--r--configmgr/source/rootaccess.cxx18
-rw-r--r--configmgr/source/rootaccess.hxx3
-rw-r--r--configmgr/source/update.cxx16
13 files changed, 128 insertions, 76 deletions
diff --git a/configmgr/source/access.cxx b/configmgr/source/access.cxx
index fda967a284..0382054533 100644
--- a/configmgr/source/access.cxx
+++ b/configmgr/source/access.cxx
@@ -166,7 +166,9 @@ void Access::initBroadcaster(
Access::Access(Components & components):
components_(components), disposed_(false)
-{}
+{
+ lock_ = lock();
+}
Access::~Access() {}
@@ -851,7 +853,7 @@ css::uno::Sequence< css::uno::Type > Access::getTypes()
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
comphelper::SequenceAsVector< css::uno::Type > types;
types.push_back(cppu::UnoType< css::uno::XInterface >::get());
@@ -900,7 +902,7 @@ css::uno::Sequence< sal_Int8 > Access::getImplementationId()
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
return css::uno::Sequence< sal_Int8 >();
}
@@ -908,7 +910,7 @@ css::uno::Sequence< sal_Int8 > Access::getImplementationId()
rtl::OUString Access::getImplementationName() throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
throw css::uno::RuntimeException(
rtl::OUString(
@@ -921,7 +923,7 @@ sal_Bool Access::supportsService(rtl::OUString const & ServiceName)
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
css::uno::Sequence< rtl::OUString > names(getSupportedServiceNames());
for (sal_Int32 i = 0; i < names.getLength(); ++i) {
@@ -936,7 +938,7 @@ css::uno::Sequence< rtl::OUString > Access::getSupportedServiceNames()
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
comphelper::SequenceAsVector< rtl::OUString > services;
services.push_back(
@@ -1000,7 +1002,7 @@ void Access::dispose() throw (css::uno::RuntimeException) {
OSL_ASSERT(thisIs(IS_ANY));
Broadcaster bc;
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
if (getParentAccess().is()) {
throw css::uno::RuntimeException(
@@ -1025,7 +1027,7 @@ void Access::addEventListener(
{
OSL_ASSERT(thisIs(IS_ANY));
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
if (!xListener.is()) {
throw css::uno::RuntimeException(
@@ -1048,7 +1050,7 @@ void Access::removeEventListener(
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
DisposeListeners::iterator i(disposeListeners_.find(aListener));
if (i != disposeListeners_.end()) {
@@ -1058,7 +1060,7 @@ void Access::removeEventListener(
css::uno::Type Access::getElementType() throw (css::uno::RuntimeException) {
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
rtl::Reference< Node > p(getNode());
switch (p->kind()) {
@@ -1082,7 +1084,7 @@ css::uno::Type Access::getElementType() throw (css::uno::RuntimeException) {
sal_Bool Access::hasElements() throw (css::uno::RuntimeException) {
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
return !getAllChildren().empty(); //TODO: optimize
}
@@ -1093,7 +1095,7 @@ css::uno::Any Access::getByName(rtl::OUString const & aName)
css::lang::WrappedTargetException, css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
rtl::Reference< ChildAccess > child(getChild(aName));
if (!child.is()) {
@@ -1107,7 +1109,7 @@ css::uno::Sequence< rtl::OUString > Access::getElementNames()
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
std::vector< rtl::Reference< ChildAccess > > children(getAllChildren());
comphelper::SequenceAsVector< rtl::OUString > names;
@@ -1124,7 +1126,7 @@ sal_Bool Access::hasByName(rtl::OUString const & aName)
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
return getChild(aName).is();
}
@@ -1133,7 +1135,7 @@ css::uno::Any Access::getByHierarchicalName(rtl::OUString const & aName)
throw (css::container::NoSuchElementException, css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
rtl::Reference< ChildAccess > child(getSubChild(aName));
if (!child.is()) {
@@ -1147,7 +1149,7 @@ sal_Bool Access::hasByHierarchicalName(rtl::OUString const & aName)
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
return getSubChild(aName).is();
}
@@ -1158,7 +1160,7 @@ void Access::addContainerListener(
{
OSL_ASSERT(thisIs(IS_ANY));
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
if (!xListener.is()) {
throw css::uno::RuntimeException(
@@ -1181,7 +1183,7 @@ void Access::removeContainerListener(
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
ContainerListeners::iterator i(containerListeners_.find(xListener));
if (i != containerListeners_.end()) {
@@ -1193,7 +1195,7 @@ rtl::OUString Access::getExactName(rtl::OUString const & aApproximateName)
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
return aApproximateName;
}
@@ -1202,7 +1204,7 @@ css::uno::Sequence< css::beans::Property > Access::getProperties()
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
std::vector< rtl::Reference< ChildAccess > > children(getAllChildren());
comphelper::SequenceAsVector< css::beans::Property > properties;
for (std::vector< rtl::Reference< ChildAccess > >::iterator i(
@@ -1218,7 +1220,7 @@ css::beans::Property Access::getPropertyByName(rtl::OUString const & aName)
throw (css::beans::UnknownPropertyException, css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
rtl::Reference< ChildAccess > child(getChild(aName));
if (!child.is()) {
throw css::beans::UnknownPropertyException(
@@ -1231,13 +1233,13 @@ sal_Bool Access::hasPropertyByName(rtl::OUString const & Name)
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
return getChild(Name).is();
}
rtl::OUString Access::getHierarchicalName() throw (css::uno::RuntimeException) {
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
// For backwards compatibility, return an absolute path representation where
// available:
@@ -1261,7 +1263,7 @@ rtl::OUString Access::composeHierarchicalName(
css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
if (aRelativeName.getLength() == 0 || aRelativeName[0] == '/') {
throw css::lang::IllegalArgumentException(
@@ -1281,7 +1283,7 @@ rtl::OUString Access::composeHierarchicalName(
rtl::OUString Access::getName() throw (css::uno::RuntimeException) {
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
return getNameInternal();
}
@@ -1292,7 +1294,7 @@ void Access::setName(rtl::OUString const & aName)
OSL_ASSERT(thisIs(IS_ANY));
Broadcaster bc;
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
checkFinalized();
Modifications localMods;
@@ -1356,7 +1358,7 @@ void Access::setName(rtl::OUString const & aName)
css::beans::Property Access::getAsProperty() throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
return asProperty();
}
@@ -1378,7 +1380,7 @@ void Access::setPropertyValue(
OSL_ASSERT(thisIs(IS_GROUP));
Broadcaster bc;
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
if (!getRootAccess()->isUpdate()) {
throw css::uno::RuntimeException(
rtl::OUString(
@@ -1402,7 +1404,7 @@ css::uno::Any Access::getPropertyValue(rtl::OUString const & PropertyName)
css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
rtl::Reference< ChildAccess > child(getChild(PropertyName));
if (!child.is()) {
throw css::beans::UnknownPropertyException(
@@ -1421,7 +1423,7 @@ void Access::addPropertyChangeListener(
{
OSL_ASSERT(thisIs(IS_GROUP));
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
if (!xListener.is()) {
throw css::uno::RuntimeException(
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("null listener")),
@@ -1448,7 +1450,7 @@ void Access::removePropertyChangeListener(
css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkKnownProperty(aPropertyName);
PropertyChangeListeners::iterator i(
propertyChangeListeners_.find(aPropertyName));
@@ -1473,7 +1475,7 @@ void Access::addVetoableChangeListener(
{
OSL_ASSERT(thisIs(IS_GROUP));
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
if (!aListener.is()) {
throw css::uno::RuntimeException(
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("null listener")),
@@ -1501,7 +1503,7 @@ void Access::removeVetoableChangeListener(
css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkKnownProperty(PropertyName);
VetoableChangeListeners::iterator i(
vetoableChangeListeners_.find(PropertyName));
@@ -1526,7 +1528,7 @@ void Access::setPropertyValues(
OSL_ASSERT(thisIs(IS_GROUP));
Broadcaster bc;
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
if (!getRootAccess()->isUpdate()) {
throw css::uno::RuntimeException(
rtl::OUString(
@@ -1563,7 +1565,7 @@ css::uno::Sequence< css::uno::Any > Access::getPropertyValues(
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
css::uno::Sequence< css::uno::Any > vals(aPropertyNames.getLength());
for (sal_Int32 i = 0; i < aPropertyNames.getLength(); ++i) {
rtl::Reference< ChildAccess > child(getChild(aPropertyNames[i]));
@@ -1588,7 +1590,7 @@ void Access::addPropertiesChangeListener(
{
OSL_ASSERT(thisIs(IS_GROUP));
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
if (!xListener.is()) {
throw css::uno::RuntimeException(
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("null listener")),
@@ -1611,7 +1613,7 @@ void Access::removePropertiesChangeListener(
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
PropertiesChangeListeners::iterator i(
propertiesChangeListeners_.find(xListener));
if (i != propertiesChangeListeners_.end()) {
@@ -1654,7 +1656,7 @@ void Access::setHierarchicalPropertyValue(
OSL_ASSERT(thisIs(IS_GROUP));
Broadcaster bc;
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
if (!getRootAccess()->isUpdate()) {
throw css::uno::RuntimeException(
rtl::OUString(
@@ -1686,7 +1688,7 @@ css::uno::Any Access::getHierarchicalPropertyValue(
css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
rtl::Reference< ChildAccess > child(getSubChild(aHierarchicalPropertyName));
if (!child.is()) {
throw css::beans::UnknownPropertyException(
@@ -1706,7 +1708,7 @@ void Access::setHierarchicalPropertyValues(
OSL_ASSERT(thisIs(IS_GROUP));
Broadcaster bc;
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
if (!getRootAccess()->isUpdate()) {
throw css::uno::RuntimeException(
rtl::OUString(
@@ -1750,7 +1752,7 @@ css::uno::Sequence< css::uno::Any > Access::getHierarchicalPropertyValues(
css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
css::uno::Sequence< css::uno::Any > vals(
aHierarchicalPropertyNames.getLength());
for (sal_Int32 i = 0; i < aHierarchicalPropertyNames.getLength(); ++i) {
@@ -1774,7 +1776,7 @@ css::beans::Property Access::getPropertyByHierarchicalName(
throw (css::beans::UnknownPropertyException, css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
rtl::Reference< ChildAccess > child(getSubChild(aHierarchicalName));
if (!child.is()) {
throw css::beans::UnknownPropertyException(
@@ -1788,7 +1790,7 @@ sal_Bool Access::hasPropertyByHierarchicalName(
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_GROUP));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
return getSubChild(aHierarchicalName).is();
}
@@ -1802,7 +1804,7 @@ void Access::replaceByName(
OSL_ASSERT(thisIs(IS_UPDATE));
Broadcaster bc;
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
rtl::Reference< ChildAccess > child(getChild(aName));
if (!child.is()) {
@@ -1846,7 +1848,7 @@ void Access::insertByName(
OSL_ASSERT(thisIs(IS_EXTENSIBLE|IS_UPDATE));
Broadcaster bc;
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
checkFinalized();
if (getChild(aName).is()) {
@@ -1896,7 +1898,7 @@ void Access::removeByName(rtl::OUString const & aName)
OSL_ASSERT(thisIs(IS_EXTENSIBLE|IS_UPDATE));
Broadcaster bc;
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
rtl::Reference< ChildAccess > child(getChild(aName));
if (!child.is() || child->isFinalized() ||
@@ -2189,7 +2191,7 @@ rtl::Reference< Access > Access::getNotificationRoot() {
#if OSL_DEBUG_LEVEL > 0
bool Access::thisIs(int what) {
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
rtl::Reference< Node > p(getNode());
Node::Kind k(p->kind());
return k != Node::KIND_PROPERTY && k != Node::KIND_LOCALIZED_VALUE &&
diff --git a/configmgr/source/access.hxx b/configmgr/source/access.hxx
index 32c0ea9e8a..8a05329683 100644
--- a/configmgr/source/access.hxx
+++ b/configmgr/source/access.hxx
@@ -36,6 +36,7 @@
#include <vector>
#include "boost/noncopyable.hpp"
+#include "boost/shared_ptr.hpp"
#include "com/sun/star/beans/PropertyVetoException.hpp"
#include "com/sun/star/beans/UnknownPropertyException.hpp"
#include "com/sun/star/beans/XExactName.hpp"
@@ -569,6 +570,8 @@ private:
PropertiesChangeListeners propertiesChangeListeners_;
bool disposed_;
+ boost::shared_ptr<osl::Mutex> lock_;
+
#if OSL_DEBUG_LEVEL > 0
protected:
enum {
diff --git a/configmgr/source/childaccess.cxx b/configmgr/source/childaccess.cxx
index 3ec23b73f1..3d9c40bc07 100644
--- a/configmgr/source/childaccess.cxx
+++ b/configmgr/source/childaccess.cxx
@@ -95,6 +95,7 @@ ChildAccess::ChildAccess(
Access(components), root_(root), parent_(parent), name_(name), node_(node),
inTransaction_(false)
{
+ lock_ = lock();
OSL_ASSERT(root.is() && parent.is() && node.is());
}
@@ -103,6 +104,7 @@ ChildAccess::ChildAccess(
rtl::Reference< Node > const & node):
Access(components), root_(root), node_(node), inTransaction_(false)
{
+ lock_ = lock();
OSL_ASSERT(root.is() && node.is());
}
@@ -169,7 +171,7 @@ css::uno::Reference< css::uno::XInterface > ChildAccess::getParent()
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
return static_cast< cppu::OWeakObject * >(parent_.get());
}
@@ -178,7 +180,7 @@ void ChildAccess::setParent(css::uno::Reference< css::uno::XInterface > const &)
throw (css::lang::NoSupportException, css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
throw css::lang::NoSupportException(
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("setParent")),
@@ -190,7 +192,7 @@ sal_Int64 ChildAccess::getSomething(
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
return aIdentifier == getTunnelId()
? reinterpret_cast< sal_Int64 >(this) : 0;
@@ -360,7 +362,7 @@ void ChildAccess::commitChanges(bool valid, Modifications * globalModifications)
}
ChildAccess::~ChildAccess() {
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
if (parent_.is()) {
parent_->releaseChild(name_);
}
@@ -390,7 +392,7 @@ css::uno::Any ChildAccess::queryInterface(css::uno::Type const & aType)
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
css::uno::Any res(Access::queryInterface(aType));
return res.hasValue()
diff --git a/configmgr/source/childaccess.hxx b/configmgr/source/childaccess.hxx
index 3d9b2fc6b3..977d97e307 100644
--- a/configmgr/source/childaccess.hxx
+++ b/configmgr/source/childaccess.hxx
@@ -40,6 +40,7 @@
#include "com/sun/star/uno/Reference.hxx"
#include "com/sun/star/uno/RuntimeException.hpp"
#include "com/sun/star/uno/Sequence.hxx"
+#include "boost/shared_ptr.hpp"
#include "rtl/ref.hxx"
#include "sal/types.h"
@@ -151,6 +152,7 @@ private:
std::auto_ptr< com::sun::star::uno::Any > changedValue_;
bool inTransaction_;
// to determine if a free node can be inserted underneath some root
+ boost::shared_ptr<osl::Mutex> lock_;
};
}
diff --git a/configmgr/source/components.cxx b/configmgr/source/components.cxx
index 2e07320725..e6cfb10314 100644
--- a/configmgr/source/components.cxx
+++ b/configmgr/source/components.cxx
@@ -183,6 +183,7 @@ private:
rtl::OUString url_;
Data const & data_;
osl::Condition delay_;
+ boost::shared_ptr<osl::Mutex> lock_;
};
Components::WriteThread::WriteThread(
@@ -190,6 +191,7 @@ Components::WriteThread::WriteThread(
rtl::OUString const & url, Data const & data):
reference_(reference), components_(components), url_(url), data_(data)
{
+ lock_ = lock();
OSL_ASSERT(reference != 0);
acquire();
}
@@ -197,7 +199,7 @@ Components::WriteThread::WriteThread(
void Components::WriteThread::run() {
TimeValue t = { 1, 0 }; // 1 sec
delay_.wait(&t); // must not throw; result_error is harmless and ignored
- osl::MutexGuard g(lock); // must not throw
+ osl::MutexGuard g(*lock_); // must not throw
try {
try {
writeModFile(components_, url_, data_);
@@ -304,7 +306,17 @@ void Components::addModification(Path const & path) {
data_.modifications.add(path);
}
+bool Components::hasModifications() const
+{
+ return data_.modifications.getRoot().children.begin() !=
+ data_.modifications.getRoot().children.end();
+}
+
void Components::writeModifications() {
+
+ if (!hasModifications())
+ return;
+
if (!writeThread_.is()) {
writeThread_ = new WriteThread(
&writeThread_, *this, getModificationFileUrl(), data_);
@@ -315,7 +327,7 @@ void Components::writeModifications() {
void Components::flushModifications() {
rtl::Reference< WriteThread > thread;
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
thread = writeThread_;
}
if (thread.is()) {
@@ -506,6 +518,8 @@ Components::Components(
css::uno::Reference< css::uno::XComponentContext > const & context):
context_(context)
{
+ lock_ = lock();
+
OSL_ASSERT(context.is());
RTL_LOGFILE_TRACE_AUTHOR("configmgr", "sb", "begin parsing");
parseXcsXcuLayer(
diff --git a/configmgr/source/components.hxx b/configmgr/source/components.hxx
index 2d0843b208..e810c6aee2 100644
--- a/configmgr/source/components.hxx
+++ b/configmgr/source/components.hxx
@@ -35,6 +35,7 @@
#include <set>
#include "boost/noncopyable.hpp"
+#include "boost/shared_ptr.hpp"
#include "com/sun/star/beans/Optional.hpp"
#include "com/sun/star/uno/Reference.hxx"
#include "rtl/ref.hxx"
@@ -95,6 +96,8 @@ public:
void writeModifications();
+ bool hasModifications() const;
+
void flushModifications();
// must be called with configmgr::lock unaquired; must be called before
// shutdown if writeModifications has ever been called (probably
@@ -174,6 +177,7 @@ private:
WeakRootSet roots_;
ExternalServices externalServices_;
rtl::Reference< WriteThread > writeThread_;
+ boost::shared_ptr<osl::Mutex> lock_;
};
}
diff --git a/configmgr/source/configurationprovider.cxx b/configmgr/source/configurationprovider.cxx
index ed50642994..cccb74658c 100644
--- a/configmgr/source/configurationprovider.cxx
+++ b/configmgr/source/configurationprovider.cxx
@@ -109,6 +109,7 @@ public:
ServiceBase(*static_cast< osl::Mutex * >(this)), context_(context),
locale_(locale)
{
+ lock_ = lock();
OSL_ASSERT(context.is());
}
@@ -173,6 +174,7 @@ private:
css::uno::Reference< css::uno::XComponentContext > context_;
rtl::OUString locale_;
+ boost::shared_ptr<osl::Mutex> lock_;
};
css::uno::Reference< css::uno::XInterface > Service::createInstance(
@@ -276,7 +278,7 @@ Service::createInstanceWithArguments(
ServiceSpecifier),
static_cast< cppu::OWeakObject * >(this));
}
- osl::MutexGuard guard(lock);
+ osl::MutexGuard guard(*lock_);
Components::initSingleton(context_);
Components & components = Components::getSingleton();
rtl::Reference< RootAccess > root(
@@ -358,13 +360,13 @@ void Service::removeFlushListener(
void Service::setLocale(css::lang::Locale const & eLocale)
throw (css::uno::RuntimeException)
{
- osl::MutexGuard guard(lock);
+ osl::MutexGuard guard(*lock_);
locale_ = comphelper::Locale(
eLocale.Language, eLocale.Country, eLocale.Variant).toISO();
}
css::lang::Locale Service::getLocale() throw (css::uno::RuntimeException) {
- osl::MutexGuard guard(lock);
+ osl::MutexGuard guard(*lock_);
css::lang::Locale loc;
if (locale_.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("*"))) {
loc.Language = locale_;
@@ -388,7 +390,7 @@ css::lang::Locale Service::getLocale() throw (css::uno::RuntimeException) {
void Service::flushModifications() const {
Components * components;
{
- osl::MutexGuard guard(lock);
+ osl::MutexGuard guard(*lock_);
Components::initSingleton(context_);
components = &Components::getSingleton();
}
diff --git a/configmgr/source/defaultprovider.cxx b/configmgr/source/defaultprovider.cxx
index aa928d7261..16cf66df0d 100644
--- a/configmgr/source/defaultprovider.cxx
+++ b/configmgr/source/defaultprovider.cxx
@@ -30,6 +30,7 @@
#include "sal/config.h"
#include "boost/noncopyable.hpp"
+#include "boost/shared_ptr.hpp"
#include "com/sun/star/lang/XSingleComponentFactory.hpp"
#include "com/sun/star/uno/Any.hxx"
#include "com/sun/star/uno/Exception.hpp"
@@ -60,7 +61,10 @@ class Factory:
private boost::noncopyable
{
public:
- Factory() {}
+ Factory()
+ {
+ lock_ = lock();
+ }
private:
virtual ~Factory() {}
@@ -75,6 +79,8 @@ private:
css::uno::Sequence< css::uno::Any > const & Arguments,
css::uno::Reference< css::uno::XComponentContext > const & Context)
throw (css::uno::Exception, css::uno::RuntimeException);
+
+ boost::shared_ptr<osl::Mutex> lock_;
};
css::uno::Reference< css::uno::XInterface > Factory::createInstanceWithContext(
@@ -99,7 +105,7 @@ Factory::createInstanceWithArgumentsAndContext(
" instantiated without arguments")),
static_cast< cppu::OWeakObject * >(this));
}
- osl::MutexGuard guard(lock);
+ osl::MutexGuard guard(*lock_);
static css::uno::Reference< css::uno::XInterface > singleton(
configuration_provider::createDefault(Context));
return singleton;
diff --git a/configmgr/source/lock.cxx b/configmgr/source/lock.cxx
index 4894ab260a..3950a2d5e3 100644
--- a/configmgr/source/lock.cxx
+++ b/configmgr/source/lock.cxx
@@ -35,7 +35,13 @@
namespace configmgr {
-osl::Mutex lock;
+boost::shared_ptr<osl::Mutex> lock()
+{
+ static boost::shared_ptr<osl::Mutex> theLock;
+ if (!theLock.get())
+ theLock.reset(new osl::Mutex);
+ return theLock;
+}
}
diff --git a/configmgr/source/lock.hxx b/configmgr/source/lock.hxx
index 8b3c7b487c..b37e83a44e 100644
--- a/configmgr/source/lock.hxx
+++ b/configmgr/source/lock.hxx
@@ -30,12 +30,12 @@
#define INCLUDED_CONFIGMGR_SOURCE_LOCK_HXX
#include "sal/config.h"
-
#include "osl/mutex.hxx"
+#include "boost/shared_ptr.hpp"
namespace configmgr {
-extern osl::Mutex lock;
+boost::shared_ptr<osl::Mutex> lock();
}
diff --git a/configmgr/source/rootaccess.cxx b/configmgr/source/rootaccess.cxx
index 72716aac35..27f3884f2f 100644
--- a/configmgr/source/rootaccess.cxx
+++ b/configmgr/source/rootaccess.cxx
@@ -78,7 +78,9 @@ RootAccess::RootAccess(
rtl::OUString const & locale, bool update):
Access(components), pathRepresentation_(pathRepresentation),
locale_(locale), update_(update)
-{}
+{
+ lock_ = lock();
+}
Path RootAccess::getAbsolutePath() {
getNode();
@@ -129,7 +131,7 @@ bool RootAccess::isUpdate() const {
}
RootAccess::~RootAccess() {
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
getComponents().removeRootAccess(this);
}
@@ -227,7 +229,7 @@ css::uno::Any RootAccess::queryInterface(css::uno::Type const & aType)
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
css::uno::Any res(Access::queryInterface(aType));
if (res.hasValue()) {
@@ -251,7 +253,7 @@ void RootAccess::addChangesListener(
{
OSL_ASSERT(thisIs(IS_ANY));
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
if (!aListener.is()) {
throw css::uno::RuntimeException(
@@ -274,7 +276,7 @@ void RootAccess::removeChangesListener(
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_ANY));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
ChangesListeners::iterator i(changesListeners_.find(aListener));
if (i != changesListeners_.end()) {
@@ -288,7 +290,7 @@ void RootAccess::commitChanges()
OSL_ASSERT(thisIs(IS_UPDATE));
Broadcaster bc;
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
int finalizedLayer;
Modifications globalMods;
@@ -306,7 +308,7 @@ void RootAccess::commitChanges()
sal_Bool RootAccess::hasPendingChanges() throw (css::uno::RuntimeException) {
OSL_ASSERT(thisIs(IS_UPDATE));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
//TODO: Optimize:
std::vector< css::util::ElementChange > changes;
@@ -318,7 +320,7 @@ css::util::ChangesSet RootAccess::getPendingChanges()
throw (css::uno::RuntimeException)
{
OSL_ASSERT(thisIs(IS_UPDATE));
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
comphelper::SequenceAsVector< css::util::ElementChange > changes;
reportChildChanges(&changes);
diff --git a/configmgr/source/rootaccess.hxx b/configmgr/source/rootaccess.hxx
index c7300c4620..4d74167c85 100644
--- a/configmgr/source/rootaccess.hxx
+++ b/configmgr/source/rootaccess.hxx
@@ -39,6 +39,7 @@
#include "com/sun/star/util/ChangesSet.hpp"
#include "com/sun/star/util/XChangesBatch.hpp"
#include "com/sun/star/util/XChangesNotifier.hpp"
+#include "boost/shared_ptr.hpp"
#include "rtl/ref.hxx"
#include "rtl/ustring.hxx"
#include "sal/types.h"
@@ -151,6 +152,8 @@ private:
rtl::OUString name_;
bool finalized_;
ChangesListeners changesListeners_;
+
+ boost::shared_ptr<osl::Mutex> lock_;
};
}
diff --git a/configmgr/source/update.cxx b/configmgr/source/update.cxx
index 53eff2c239..7208eb3f8c 100644
--- a/configmgr/source/update.cxx
+++ b/configmgr/source/update.cxx
@@ -32,6 +32,7 @@
#include <set>
#include "boost/noncopyable.hpp"
+#include "boost/shared_ptr.hpp"
#include "com/sun/star/configuration/XUpdate.hpp"
#include "com/sun/star/lang/XSingleComponentFactory.hpp"
#include "com/sun/star/uno/Any.hxx"
@@ -77,7 +78,10 @@ class Service:
private boost::noncopyable
{
public:
- Service() {}
+ Service()
+ {
+ lock_ = lock();
+ }
private:
virtual ~Service() {}
@@ -98,13 +102,15 @@ private:
css::uno::Sequence< rtl::OUString > const & includedPaths,
css::uno::Sequence< rtl::OUString > const & excludedPaths)
throw (css::uno::RuntimeException);
+
+ boost::shared_ptr<osl::Mutex> lock_;
};
void Service::insertExtensionXcsFile(
sal_Bool shared, rtl::OUString const & fileUri)
throw (css::uno::RuntimeException)
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
Components::getSingleton().insertExtensionXcsFile(shared, fileUri);
}
@@ -114,7 +120,7 @@ void Service::insertExtensionXcuFile(
{
Broadcaster bc;
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
Modifications mods;
Components::getSingleton().insertExtensionXcuFile(
shared, fileUri, &mods);
@@ -129,7 +135,7 @@ void Service::removeExtensionXcuFile(rtl::OUString const & fileUri)
{
Broadcaster bc;
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
Modifications mods;
Components::getSingleton().removeExtensionXcuFile(fileUri, &mods);
Components::getSingleton().initGlobalBroadcaster(
@@ -146,7 +152,7 @@ void Service::insertModificationXcuFile(
{
Broadcaster bc;
{
- osl::MutexGuard g(lock);
+ osl::MutexGuard g(*lock_);
Modifications mods;
Components::getSingleton().insertModificationXcuFile(
fileUri, seqToSet(includedPaths), seqToSet(excludedPaths), &mods);