diff options
author | Caolán McNamara <caolanm@redhat.com> | 2011-05-19 16:17:07 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2011-05-20 09:49:30 +0100 |
commit | 7e4f1b45e1cb49f737f52fb8c756bc8daccecd26 (patch) | |
tree | 158da8b572efed0673af298774ffbc9a77f8ca39 /filter | |
parent | 7edb5f736115732fe27f4f80d7559aed46b03dab (diff) |
remove circular dependency to fix leak
Diffstat (limited to 'filter')
-rw-r--r-- | filter/source/config/cache/basecontainer.cxx | 1 | ||||
-rw-r--r-- | filter/source/config/cache/cacheupdatelistener.cxx | 23 | ||||
-rw-r--r-- | filter/source/config/cache/cacheupdatelistener.hxx | 9 | ||||
-rw-r--r-- | filter/source/config/cache/filtercache.cxx | 34 | ||||
-rw-r--r-- | filter/source/config/cache/filtercache.hxx | 6 |
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 |