diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2014-06-28 14:18:32 +0100 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2014-06-28 14:37:24 +0100 |
commit | 879aa54e895a56cb65f93ae98e6a9e7b08981a47 (patch) | |
tree | aa45237fb0ad9bb45d563d32e2fd7b789581c1d2 /configmgr | |
parent | e820df579d9be4c1f9bb1ad8f02a8072c69b52da (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.cxx | 67 | ||||
-rw-r--r-- | configmgr/source/access.hxx | 8 | ||||
-rw-r--r-- | configmgr/source/childaccess.cxx | 41 | ||||
-rw-r--r-- | configmgr/source/childaccess.hxx | 5 |
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); |