summaryrefslogtreecommitdiff
path: root/filter
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2011-05-19 16:17:07 +0100
committerCaolán McNamara <caolanm@redhat.com>2011-05-20 09:49:30 +0100
commit7e4f1b45e1cb49f737f52fb8c756bc8daccecd26 (patch)
tree158da8b572efed0673af298774ffbc9a77f8ca39 /filter
parent7edb5f736115732fe27f4f80d7559aed46b03dab (diff)
remove circular dependency to fix leak
Diffstat (limited to 'filter')
-rw-r--r--filter/source/config/cache/basecontainer.cxx1
-rw-r--r--filter/source/config/cache/cacheupdatelistener.cxx23
-rw-r--r--filter/source/config/cache/cacheupdatelistener.hxx9
-rw-r--r--filter/source/config/cache/filtercache.cxx34
-rw-r--r--filter/source/config/cache/filtercache.hxx6
5 files changed, 41 insertions, 32 deletions
diff --git a/filter/source/config/cache/basecontainer.cxx b/filter/source/config/cache/basecontainer.cxx
index 5bd4857d7261..3936dfadf35e 100644
--- a/filter/source/config/cache/basecontainer.cxx
+++ b/filter/source/config/cache/basecontainer.cxx
@@ -72,7 +72,6 @@ BaseContainer::BaseContainer()
, m_lListener (m_aLock)
{
m_rCache->load(FilterCache::E_CONTAINS_STANDARD);
-
thePerformanceOptimizer::get();
}
diff --git a/filter/source/config/cache/cacheupdatelistener.cxx b/filter/source/config/cache/cacheupdatelistener.cxx
index 68aaadbf6172..9901c812e85a 100644
--- a/filter/source/config/cache/cacheupdatelistener.cxx
+++ b/filter/source/config/cache/cacheupdatelistener.cxx
@@ -53,25 +53,22 @@ namespace css = ::com::sun::star;
-CacheUpdateListener::CacheUpdateListener(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR ,
- const css::uno::Reference< css::uno::XInterface >& xConfigAccess,
- FilterCache::EItemType eConfigType )
- : BaseLock ( )
- , m_xSMGR (xSMGR )
- , m_rCache ( )
- , m_xConfig (xConfigAccess)
- , m_eConfigType(eConfigType )
+CacheUpdateListener::CacheUpdateListener(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR,
+ FilterCache &rFilterCache,
+ const css::uno::Reference< css::uno::XInterface >& xConfigAccess,
+ FilterCache::EItemType eConfigType)
+ : BaseLock()
+ , m_xSMGR(xSMGR)
+ , m_rCache(rFilterCache)
+ , m_xConfig(xConfigAccess)
+ , m_eConfigType(eConfigType)
{
}
-
-
CacheUpdateListener::~CacheUpdateListener()
{
}
-
-
void CacheUpdateListener::startListening()
{
// SAFE ->
@@ -201,7 +198,7 @@ void SAL_CALL CacheUpdateListener::changesOccurred(const css::util::ChangesEven
const ::rtl::OUString& sItem = *pIt;
try
{
- m_rCache->refreshItem(eType, sItem);
+ m_rCache.refreshItem(eType, sItem);
}
catch(const css::container::NoSuchElementException&)
{
diff --git a/filter/source/config/cache/cacheupdatelistener.hxx b/filter/source/config/cache/cacheupdatelistener.hxx
index e31eb030da42..4b3214aac080 100644
--- a/filter/source/config/cache/cacheupdatelistener.hxx
+++ b/filter/source/config/cache/cacheupdatelistener.hxx
@@ -67,7 +67,7 @@ class CacheUpdateListener : public BaseLock // must be the first one to guarante
/** @short reference to the singleton(!) filter cache implementation,
which should be updated by this thread. */
- ::salhelper::SingletonRef< FilterCache > m_rCache;
+ FilterCache &m_rCache;
/** @short holds the configuration access, where we listen alive. */
css::uno::Reference< css::uno::XInterface > m_xConfig;
@@ -103,9 +103,10 @@ class CacheUpdateListener : public BaseLock // must be the first one to guarante
@param eConfigType
specify the type of configuration.
*/
- CacheUpdateListener(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR ,
- const css::uno::Reference< css::uno::XInterface >& xConfigAccess,
- FilterCache::EItemType eConfigType );
+ CacheUpdateListener(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR,
+ FilterCache &rFilterCache,
+ const css::uno::Reference< css::uno::XInterface >& xConfigAccess,
+ FilterCache::EItemType eConfigType);
//---------------------------------------
diff --git a/filter/source/config/cache/filtercache.cxx b/filter/source/config/cache/filtercache.cxx
index 3a2ee0169e09..d0de462e5e8a 100644
--- a/filter/source/config/cache/filtercache.cxx
+++ b/filter/source/config/cache/filtercache.cxx
@@ -94,6 +94,10 @@ FilterCache::FilterCache()
FilterCache::~FilterCache()
{
RTL_LOGFILE_TRACE("} (as96863) FilterCache lifetime");
+ if (m_xTypesChglisteners.is())
+ m_xTypesChglisteners->stopListening();
+ if (m_xFiltersChgListener.is())
+ m_xFiltersChgListener->stopListening();
}
@@ -822,15 +826,12 @@ CacheItemList& FilterCache::impl_getItemList(EItemType eType) const
css::uno::Reference< css::uno::XInterface > FilterCache::impl_openConfig(EConfigProvider eProvider)
throw(css::uno::Exception)
{
- // SAFE ->
::osl::ResettableMutexGuard aLock(m_aLock);
::rtl::OUString sPath ;
css::uno::Reference< css::uno::XInterface >* pConfig = 0;
css::uno::Reference< css::uno::XInterface > xOld ;
::rtl::OString sRtlLog ;
- FilterCache::EItemType eItemType( FilterCache::E_TYPE ) ;
- sal_Bool bStartListening = sal_False;
switch(eProvider)
{
@@ -840,8 +841,6 @@ css::uno::Reference< css::uno::XInterface > FilterCache::impl_openConfig(EConfig
return m_xConfigTypes;
sPath = CFGPACKAGE_TD_TYPES;
pConfig = &m_xConfigTypes;
- eItemType = FilterCache::E_TYPE;
- bStartListening = sal_True;
sRtlLog = ::rtl::OString("framework (as96863) ::FilterCache::impl_openconfig(E_PROVIDER_TYPES)");
}
break;
@@ -852,8 +851,6 @@ css::uno::Reference< css::uno::XInterface > FilterCache::impl_openConfig(EConfig
return m_xConfigFilters;
sPath = CFGPACKAGE_TD_FILTERS;
pConfig = &m_xConfigFilters;
- eItemType = FilterCache::E_FILTER;
- bStartListening = sal_True;
sRtlLog = ::rtl::OString("framework (as96863) ::FilterCache::impl_openconfig(E_PROVIDER_FILTERS)");
}
break;
@@ -864,7 +861,6 @@ css::uno::Reference< css::uno::XInterface > FilterCache::impl_openConfig(EConfig
return m_xConfigOthers;
sPath = CFGPACKAGE_TD_OTHERS;
pConfig = &m_xConfigOthers;
- eItemType = FilterCache::E_TYPE;
sRtlLog = ::rtl::OString("framework (as96863) ::FilterCache::impl_openconfig(E_PROVIDER_OTHERS)");
}
break;
@@ -889,17 +885,27 @@ css::uno::Reference< css::uno::XInterface > FilterCache::impl_openConfig(EConfig
sal_True ); // bLocalesMode
}
+
// Start listening for changes on that configuration access.
- // We must not control the lifetime of this listener. Itself
- // checks, when ist time to die :-)
- if (bStartListening)
+ switch(eProvider)
{
- CacheUpdateListener* pListener = new CacheUpdateListener(m_xSMGR, *pConfig, eItemType);
- pListener->startListening();
+ case E_PROVIDER_TYPES:
+ {
+ m_xTypesChglisteners.set(new CacheUpdateListener(m_xSMGR, *this, *pConfig, FilterCache::E_TYPE));
+ m_xTypesChglisteners->startListening();
+ }
+ break;
+ case E_PROVIDER_FILTERS:
+ {
+ m_xFiltersChgListener.set(new CacheUpdateListener(m_xSMGR, *this, *pConfig, FilterCache::E_FILTER));
+ m_xFiltersChgListener->startListening();
+ }
+ break;
+ default:
+ break;
}
return *pConfig;
- // <- SAFE
}
diff --git a/filter/source/config/cache/filtercache.hxx b/filter/source/config/cache/filtercache.hxx
index c0623fc8cbae..ba4eb7903ebd 100644
--- a/filter/source/config/cache/filtercache.hxx
+++ b/filter/source/config/cache/filtercache.hxx
@@ -43,6 +43,7 @@
#include <com/sun/star/util/ChangesEvent.hpp>
#include <com/sun/star/uno/Reference.h>
#include <com/sun/star/uno/Any.h>
+#include <rtl/ref.hxx>
#include <rtl/ustring.hxx>
//_______________________________________________
@@ -51,6 +52,8 @@
namespace filter{
namespace config{
+class CacheUpdateListener;
+
//_______________________________________________
// definitions
@@ -273,6 +276,9 @@ class FilterCache : public BaseLock
/// readonly acccess to the module configuration of OOo
css::uno::Reference< css::container::XNameAccess > m_xModuleCfg;
+ rtl::Reference< CacheUpdateListener > m_xTypesChglisteners;
+ rtl::Reference< CacheUpdateListener > m_xFiltersChgListener;
+
//-------------------------------------------
// interface