diff options
author | Caolán McNamara <caolanm@redhat.com> | 2016-06-16 16:52:55 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2016-06-16 17:12:11 +0100 |
commit | 1c0d1199fe02666de0d162f071ce7e6e812a23df (patch) | |
tree | 8ef1f918cb1fda9f4302999ca69cf6edc1b8e3cd | |
parent | fe4dbade94c1170da402348aa8ade9885c5f4e3f (diff) |
Resolves: tdf#82532 parent mutex dtored before child dtor uses it
Mutex belonged to DisposeListenerGridBridge which inherits from
FmXDisposeListener, FmXDisposeListener dtor accesses a reference
to the parent mutex in its dtor, but the mutex has been destroyed
at this point.
Move the mutex from parent to child. FWIW these classes are on
the candidate list to merge.
(cherry picked from commit e841ed93d6c6d817be1f7fdc18ff971325c861cc)
Change-Id: Ic639eaed97c2b0625c368ed249f09920af37f94e
-rw-r--r-- | include/svx/fmtools.hxx | 4 | ||||
-rw-r--r-- | svx/source/fmcomp/gridctrl.cxx | 3 | ||||
-rw-r--r-- | svx/source/form/fmtools.cxx | 9 |
3 files changed, 5 insertions, 11 deletions
diff --git a/include/svx/fmtools.hxx b/include/svx/fmtools.hxx index e029b9913cda..99ff0577e0da 100644 --- a/include/svx/fmtools.hxx +++ b/include/svx/fmtools.hxx @@ -158,10 +158,10 @@ class SAL_WARN_UNUSED FmXDisposeListener friend class FmXDisposeMultiplexer; FmXDisposeMultiplexer* m_pAdapter; - ::osl::Mutex& m_rMutex; + osl::Mutex m_aMutex; public: - FmXDisposeListener(::osl::Mutex& _rMutex) : m_pAdapter(nullptr), m_rMutex(_rMutex) { } + FmXDisposeListener() : m_pAdapter(nullptr) { } virtual ~FmXDisposeListener(); virtual void disposing(const css::lang::EventObject& _rEvent, sal_Int16 _nId) throw( css::uno::RuntimeException ) = 0; diff --git a/svx/source/fmcomp/gridctrl.cxx b/svx/source/fmcomp/gridctrl.cxx index 8effd55325b8..46ff64532d42 100644 --- a/svx/source/fmcomp/gridctrl.cxx +++ b/svx/source/fmcomp/gridctrl.cxx @@ -195,7 +195,6 @@ void GridFieldValueListener::dispose() class DisposeListenerGridBridge : public FmXDisposeListener { - osl::Mutex m_aMutex; DbGridControl& m_rParent; FmXDisposeMultiplexer* m_pRealListener; @@ -207,7 +206,7 @@ public: }; DisposeListenerGridBridge::DisposeListenerGridBridge(DbGridControl& _rParent, const Reference< XComponent >& _rxObject) - :FmXDisposeListener(m_aMutex) + :FmXDisposeListener() ,m_rParent(_rParent) ,m_pRealListener(nullptr) { diff --git a/svx/source/form/fmtools.cxx b/svx/source/form/fmtools.cxx index bfd316e5a94e..beec4aaf201e 100644 --- a/svx/source/form/fmtools.cxx +++ b/svx/source/form/fmtools.cxx @@ -259,7 +259,6 @@ void CursorWrapper::ImplConstruct(const Reference< css::sdbc::XResultSet>& _rxCu m_xGeneric = m_xMoveOperations.get(); } - CursorWrapper& CursorWrapper::operator=(const Reference< css::sdbc::XRowSet>& _rxCursor) { m_xMoveOperations.set(_rxCursor, UNO_QUERY); @@ -274,31 +273,28 @@ CursorWrapper& CursorWrapper::operator=(const Reference< css::sdbc::XRowSet>& _r return *this; } - FmXDisposeListener::~FmXDisposeListener() { setAdapter(nullptr); } - void FmXDisposeListener::setAdapter(FmXDisposeMultiplexer* pAdapter) { if (m_pAdapter) { - ::osl::MutexGuard aGuard(m_rMutex); + ::osl::MutexGuard aGuard(m_aMutex); m_pAdapter->release(); m_pAdapter = nullptr; } if (pAdapter) { - ::osl::MutexGuard aGuard(m_rMutex); + ::osl::MutexGuard aGuard(m_aMutex); m_pAdapter = pAdapter; m_pAdapter->acquire(); } } - FmXDisposeMultiplexer::FmXDisposeMultiplexer(FmXDisposeListener* _pListener, const Reference< css::lang::XComponent>& _rxObject) :m_xObject(_rxObject) ,m_pListener(_pListener) @@ -310,7 +306,6 @@ FmXDisposeMultiplexer::FmXDisposeMultiplexer(FmXDisposeListener* _pListener, con m_xObject->addEventListener(this); } - FmXDisposeMultiplexer::~FmXDisposeMultiplexer() { } |