summaryrefslogtreecommitdiff
path: root/configmgr
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@collabora.com>2014-06-28 14:18:32 +0100
committerMichael Meeks <michael.meeks@collabora.com>2014-06-28 14:37:24 +0100
commit879aa54e895a56cb65f93ae98e6a9e7b08981a47 (patch)
treeaa45237fb0ad9bb45d563d32e2fd7b789581c1d2 /configmgr
parente820df579d9be4c1f9bb1ad8f02a8072c69b52da (diff)
configmgr: accelerate simple config key fetches.
Avoid heap allocating UNO object wrappers for the underlying Node structures only to convert to Any and immediately free them agian when we can. Change-Id: Iae4612e9602f872f5d8cca2e516df594c9f1118c
Diffstat (limited to 'configmgr')
-rw-r--r--configmgr/source/access.cxx67
-rw-r--r--configmgr/source/access.hxx8
-rw-r--r--configmgr/source/childaccess.cxx41
-rw-r--r--configmgr/source/childaccess.hxx5
4 files changed, 92 insertions, 29 deletions
diff --git a/configmgr/source/access.cxx b/configmgr/source/access.cxx
index 665b3cdd422f..6aeabb41abab 100644
--- a/configmgr/source/access.cxx
+++ b/configmgr/source/access.cxx
@@ -344,6 +344,42 @@ sal_Bool Access::hasElements() throw (css::uno::RuntimeException, std::exception
return !getAllChildren().empty(); //TODO: optimize
}
+bool Access::getByNameFast(const OUString & name, css::uno::Any & value)
+{
+ bool bGotValue = false;
+ rtl::Reference< ChildAccess > child;
+
+ if (getNode()->kind() != Node::KIND_LOCALIZED_PROPERTY)
+ { // try to get it directly
+ ModifiedChildren::iterator i(modifiedChildren_.find(name));
+ if (i != modifiedChildren_.end())
+ {
+ child = getModifiedChild(i);
+ if (child.is())
+ {
+ value = child->asValue();
+ bGotValue = true;
+ }
+ }
+ else
+ {
+ rtl::Reference< Node > node(getNode()->getMember(name));
+ if (!node.is())
+ return false;
+ bGotValue = ChildAccess::asSimpleValue(node, value, components_);
+ }
+ }
+
+ if (!bGotValue)
+ {
+ child = getChild(name);
+ if (!child.is())
+ return false;
+ value = child->asValue();
+ }
+ return true;
+}
+
css::uno::Any Access::getByName(OUString const & aName)
throw (
css::container::NoSuchElementException,
@@ -352,12 +388,11 @@ css::uno::Any Access::getByName(OUString const & aName)
assert(thisIs(IS_ANY));
osl::MutexGuard g(*lock_);
checkLocalizedPropertyAccess();
- rtl::Reference< ChildAccess > child(getChild(aName));
- if (!child.is()) {
+ css::uno::Any value;
+ if (!getByNameFast(aName, value))
throw css::container::NoSuchElementException(
aName, static_cast< cppu::OWeakObject * >(this));
- }
- return child->asValue();
+ return value;
}
css::uno::Sequence< OUString > Access::getElementNames()
@@ -852,15 +887,15 @@ css::uno::Sequence< css::uno::Any > Access::getPropertyValues(
assert(thisIs(IS_GROUP));
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]));
- if (!child.is()) {
+
+ for (sal_Int32 i = 0; i < aPropertyNames.getLength(); ++i)
+ {
+ if (!getByNameFast(aPropertyNames[i], vals[i]))
throw css::uno::RuntimeException(
"configmgr getPropertyValues inappropriate property name",
static_cast< cppu::OWeakObject * >(this));
- }
- vals[i] = child->asValue();
}
+
return vals;
}
@@ -1988,6 +2023,15 @@ rtl::Reference< ChildAccess > Access::getModifiedChild(
? childIterator->second.child : rtl::Reference< ChildAccess >();
}
+rtl::Reference< ChildAccess > Access::createUnmodifiedChild(
+ const OUString &name, const rtl::Reference< Node > &node)
+{
+ rtl::Reference< ChildAccess > child(
+ new ChildAccess(components_, getRootAccess(), this, name, node));
+ cachedChildren_[name] = child.get();
+ return child;
+}
+
rtl::Reference< ChildAccess > Access::getUnmodifiedChild(
OUString const & name)
{
@@ -2008,10 +2052,7 @@ rtl::Reference< ChildAccess > Access::getUnmodifiedChild(
return child;
}
}
- rtl::Reference< ChildAccess > child(
- new ChildAccess(components_, getRootAccess(), this, name, node));
- cachedChildren_[name] = child.get();
- return child;
+ return createUnmodifiedChild(name,node);
}
rtl::Reference< ChildAccess > Access::getSubChild(OUString const & path) {
diff --git a/configmgr/source/access.hxx b/configmgr/source/access.hxx
index 4dbc14e9adca..de35555522dc 100644
--- a/configmgr/source/access.hxx
+++ b/configmgr/source/access.hxx
@@ -497,10 +497,14 @@ private:
rtl::Reference< ChildAccess > getSubChild(OUString const & path);
bool setChildProperty(
- OUString const & name, com::sun::star::uno::Any const & value,
+ OUString const & name, css::uno::Any const & value,
Modifications * localModifications);
- com::sun::star::beans::Property asProperty();
+ css::beans::Property asProperty();
+
+ bool getByNameFast(const OUString & name, css::uno::Any & value);
+ rtl::Reference< ChildAccess > createUnmodifiedChild(const OUString &name,
+ const rtl::Reference< Node > &node);
void checkFinalized();
diff --git a/configmgr/source/childaccess.cxx b/configmgr/source/childaccess.cxx
index dc7822e00926..259d968d76ee 100644
--- a/configmgr/source/childaccess.cxx
+++ b/configmgr/source/childaccess.cxx
@@ -252,33 +252,48 @@ void ChildAccess::setProperty(
localModifications->add(getRelativePath());
}
-css::uno::Any ChildAccess::asValue() {
+
+css::uno::Any ChildAccess::asValue()
+{
if (changedValue_.get() != 0) {
return *changedValue_;
}
- switch (node_->kind()) {
- case Node::KIND_PROPERTY:
- return static_cast< PropertyNode * >(node_.get())->getValue(
- getComponents());
- case Node::KIND_LOCALIZED_PROPERTY:
+ css::uno::Any value;
+ if (!asSimpleValue(node_, value, getComponents()))
+ {
+ if (node_->kind() == Node::KIND_LOCALIZED_PROPERTY)
{
OUString locale(getRootAccess()->getLocale());
if (!Components::allLocales(locale)) {
rtl::Reference< ChildAccess > child(getChild("*" + locale));
// As a last resort, return a nil value even though it may be
// illegal for the given property:
- return child.is() ? child->asValue() : css::uno::Any();
+ if (child.is())
+ return child->asValue();
}
}
- break;
+ value = css::uno::makeAny(
+ css::uno::Reference< css::uno::XInterface >(
+ static_cast< cppu::OWeakObject * >(this)));
+ }
+ return value;
+}
+
+/// Can we quickly extract a simple value into value ? if so returns true
+bool ChildAccess::asSimpleValue(const rtl::Reference< Node > &rNode,
+ css::uno::Any &value,
+ Components &components)
+{
+ switch (rNode->kind()) {
+ case Node::KIND_PROPERTY:
+ value = static_cast< PropertyNode * >(rNode.get())->getValue(components);
+ return true;
case Node::KIND_LOCALIZED_VALUE:
- return static_cast< LocalizedValueNode * >(node_.get())->getValue();
+ value = static_cast< LocalizedValueNode * >(rNode.get())->getValue();
+ return true;
default:
- break;
+ return false;
}
- return css::uno::makeAny(
- css::uno::Reference< css::uno::XInterface >(
- static_cast< cppu::OWeakObject * >(this)));
}
void ChildAccess::commitChanges(bool valid, Modifications * globalModifications)
diff --git a/configmgr/source/childaccess.hxx b/configmgr/source/childaccess.hxx
index 1f14d672ac51..ee336fac20e1 100644
--- a/configmgr/source/childaccess.hxx
+++ b/configmgr/source/childaccess.hxx
@@ -113,7 +113,10 @@ public:
com::sun::star::uno::Any const & value,
Modifications * localModifications);
- com::sun::star::uno::Any asValue();
+ css::uno::Any asValue();
+ static bool asSimpleValue(const rtl::Reference< Node > &rNode,
+ css::uno::Any &value,
+ Components &components);
void commitChanges(bool valid, Modifications * globalModifications);