[Libreoffice-commits] core.git: cppuhelper/source
Matthew J. Francis
mjay.francis at gmail.com
Thu Sep 25 01:46:02 PDT 2014
cppuhelper/source/servicemanager.cxx | 31 ++++++++++++++++++++-----------
1 file changed, 20 insertions(+), 11 deletions(-)
New commits:
commit 0af1c09b3ad23790d9992ec329a2c3f28b820050
Author: Matthew J. Francis <mjay.francis at gmail.com>
Date: Wed Sep 24 23:30:23 2014 +0800
Eliminate memory leak due to circular shared_ptr
Without this, a Data::Implementation can have a circular reference of
shared_ptr to itself through .factory1
Change-Id: Ie05545e7ecc0ae85256d2c374fe79f0c678ccf64
Signed-off-by: Stephan Bergmann <sbergman at redhat.com>
diff --git a/cppuhelper/source/servicemanager.cxx b/cppuhelper/source/servicemanager.cxx
index 84b29b3..ed8e9ec 100644
--- a/cppuhelper/source/servicemanager.cxx
+++ b/cppuhelper/source/servicemanager.cxx
@@ -15,6 +15,7 @@
#include <boost/noncopyable.hpp>
#include <boost/shared_ptr.hpp>
+#include <boost/weak_ptr.hpp>
#include <com/sun/star/beans/NamedValue.hpp>
#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <com/sun/star/container/ElementExistException.hpp>
@@ -586,7 +587,7 @@ private:
getSupportedServiceNames() throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
rtl::Reference< cppuhelper::ServiceManager > manager_;
- boost::shared_ptr< cppuhelper::ServiceManager::Data::Implementation >
+ boost::weak_ptr< cppuhelper::ServiceManager::Data::Implementation >
implementation_;
};
@@ -595,8 +596,10 @@ ImplementationWrapper::createInstanceWithContext(
css::uno::Reference< css::uno::XComponentContext > const & Context)
throw (css::uno::Exception, css::uno::RuntimeException, std::exception)
{
- manager_->loadImplementation(Context, implementation_);
- return implementation_->createInstance(Context, false);
+ boost::shared_ptr< cppuhelper::ServiceManager::Data::Implementation > impl = implementation_.lock();
+ assert(impl);
+ manager_->loadImplementation(Context, impl);
+ return impl->createInstance(Context, false);
}
css::uno::Reference< css::uno::XInterface >
@@ -605,8 +608,10 @@ ImplementationWrapper::createInstanceWithArgumentsAndContext(
css::uno::Reference< css::uno::XComponentContext > const & Context)
throw (css::uno::Exception, css::uno::RuntimeException, std::exception)
{
- manager_->loadImplementation(Context, implementation_);
- return implementation_->createInstanceWithArguments(
+ boost::shared_ptr< cppuhelper::ServiceManager::Data::Implementation > impl = implementation_.lock();
+ assert(impl);
+ manager_->loadImplementation(Context, impl);
+ return impl->createInstanceWithArguments(
Context, false, Arguments);
}
@@ -629,7 +634,9 @@ ImplementationWrapper::createInstanceWithArguments(
rtl::OUString ImplementationWrapper::getImplementationName()
throw (css::uno::RuntimeException, std::exception)
{
- return implementation_->info->name;
+ boost::shared_ptr< cppuhelper::ServiceManager::Data::Implementation > impl = implementation_.lock();
+ assert(impl);
+ return impl->info->name;
}
sal_Bool ImplementationWrapper::supportsService(rtl::OUString const & ServiceName)
@@ -642,20 +649,22 @@ css::uno::Sequence< rtl::OUString >
ImplementationWrapper::getSupportedServiceNames()
throw (css::uno::RuntimeException, std::exception)
{
- if (implementation_->info->services.size()
+ boost::shared_ptr< cppuhelper::ServiceManager::Data::Implementation > impl = implementation_.lock();
+ assert(impl);
+ if (impl->info->services.size()
> static_cast< sal_uInt32 >(SAL_MAX_INT32))
{
throw css::uno::RuntimeException(
- ("Implementation " + implementation_->info->name
+ ("Implementation " + impl->info->name
+ " supports too many services"),
static_cast< cppu::OWeakObject * >(this));
}
css::uno::Sequence< rtl::OUString > names(
- static_cast< sal_Int32 >(implementation_->info->services.size()));
+ static_cast< sal_Int32 >(impl->info->services.size()));
sal_Int32 i = 0;
for (std::vector< rtl::OUString >::const_iterator j(
- implementation_->info->services.begin());
- j != implementation_->info->services.end(); ++j)
+ impl->info->services.begin());
+ j != impl->info->services.end(); ++j)
{
names[i++] = *j;
}
More information about the Libreoffice-commits
mailing list