summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2014-08-15 14:14:51 +0100
committerCaolán McNamara <caolanm@redhat.com>2014-08-15 15:40:06 +0100
commit174e6796dfc910dc4b95673fcf9ec0704967acfd (patch)
treee7e1cf1473078f8ec077f585c140b446a9239f67 /sc
parente961d99b959677d9aef92df49501d9284ab802b3 (diff)
Revert "another memory leak based on release().release()"
This reverts commit 1e9baadcb71cb393864be4e8580a50183cb7152e. because JunitTest_sc_unoapi now fails
Diffstat (limited to 'sc')
-rw-r--r--sc/source/core/tool/chartlis.cxx38
1 files changed, 32 insertions, 6 deletions
diff --git a/sc/source/core/tool/chartlis.cxx b/sc/source/core/tool/chartlis.cxx
index 57778a6c6a54..be5632533959 100644
--- a/sc/source/core/tool/chartlis.cxx
+++ b/sc/source/core/tool/chartlis.cxx
@@ -499,6 +499,24 @@ void ScChartListenerCollection::ChangeListening( const OUString& rName,
pCL->SetDirty( true );
}
+namespace {
+
+class InsertChartListener : public std::unary_function<ScChartListener*, void>
+{
+ ScChartListenerCollection::ListenersType& mrListeners;
+public:
+ InsertChartListener(ScChartListenerCollection::ListenersType& rListeners) :
+ mrListeners(rListeners) {}
+
+ void operator() (ScChartListener* p)
+ {
+ OUString aName = p->GetName();
+ mrListeners.insert(aName, p);
+ }
+};
+
+}
+
void ScChartListenerCollection::FreeUnused()
{
ListenersType aUsed, aUnused;
@@ -532,21 +550,29 @@ void ScChartListenerCollection::FreeUnused()
void ScChartListenerCollection::FreeUno( const uno::Reference< chart::XChartDataChangeEventListener >& rListener,
const uno::Reference< chart::XChartData >& rSource )
{
- ListenersType aUsed, aUnused;
+ std::vector<ScChartListener*> aUsed, aUnused;
// First, filter each listener into 'used' and 'unused' categories.
{
- while(!maListeners.empty())
+ ListenersType::iterator it = maListeners.begin(), itEnd = maListeners.end();
+ for (; it != itEnd; ++it)
{
- ScChartListener* p = maListeners.begin()->second;
+ ScChartListener* p = it->second;
if (p->IsUno() && p->GetUnoListener() == rListener && p->GetUnoSource() == rSource)
- aUnused.transfer(maListeners.begin(), maListeners);
+ aUnused.push_back(p);
else
- aUsed.transfer(maListeners.begin(), maListeners);
+ aUsed.push_back(p);
}
}
- std::swap(aUsed, maListeners);
+ // Release all pointers currently managed by the ptr_map container.
+ maListeners.release().release();
+
+ // Re-insert the listeners we need to keep.
+ std::for_each(aUsed.begin(), aUsed.end(), InsertChartListener(maListeners));
+
+ // Now, delete the ones no longer needed.
+ std::for_each(aUnused.begin(), aUnused.end(), boost::checked_deleter<ScChartListener>());
}
void ScChartListenerCollection::StartTimer()