diff options
author | Frank Schoenheit [fs] <frank.schoenheit@sun.com> | 2010-02-04 16:03:51 +0100 |
---|---|---|
committer | Frank Schoenheit [fs] <frank.schoenheit@sun.com> | 2010-02-04 16:03:51 +0100 |
commit | 4831a67ec526909f6efd74545405e93891e11a45 (patch) | |
tree | a2ab9405e8c05dda1ac86b3a9958eb06a3a79428 /reportdesign | |
parent | ed853a88ff6e0bfae048bb19615ab2cd255f07eb (diff) |
autorecovery: need to lock the SolarMutex when disposing, some of the dependent components might need this when they die
Diffstat (limited to 'reportdesign')
-rw-r--r-- | reportdesign/source/core/api/ReportDefinition.cxx | 100 |
1 files changed, 53 insertions, 47 deletions
diff --git a/reportdesign/source/core/api/ReportDefinition.cxx b/reportdesign/source/core/api/ReportDefinition.cxx index 754f97bf0b4a..91917e03463c 100644 --- a/reportdesign/source/core/api/ReportDefinition.cxx +++ b/reportdesign/source/core/api/ReportDefinition.cxx @@ -805,55 +805,61 @@ void SAL_CALL OReportDefinition::dispose() throw(uno::RuntimeException) // ----------------------------------------------------------------------------- void SAL_CALL OReportDefinition::disposing() { - m_pImpl->m_aControllers.clear(); + notifyEvent(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("OnUnload"))); + uno::Reference< frame::XModel > xHoldAlive( this ); - { - notifyEvent(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("OnUnload"))); - - lang::EventObject aDisposeEvent( static_cast< ::cppu::OWeakObject* >( this ) ); - m_pImpl->m_aModifyListeners.disposeAndClear( aDisposeEvent ); - m_pImpl->m_aCloseListener.disposeAndClear( aDisposeEvent ); - m_pImpl->m_aDocEventListeners.disposeAndClear( aDisposeEvent ); - m_pImpl->m_aStorageChangeListeners.disposeAndClear( aDisposeEvent ); - - ::comphelper::disposeComponent(m_pImpl->m_xGroups); - m_pImpl->m_xReportHeader.clear(); - m_pImpl->m_xReportFooter.clear(); - m_pImpl->m_xPageHeader.clear(); - m_pImpl->m_xPageFooter.clear(); - m_pImpl->m_xDetail.clear(); - //::comphelper::disposeComponent(m_pImpl->m_xReportHeader); - //::comphelper::disposeComponent(m_pImpl->m_xReportFooter); - //::comphelper::disposeComponent(m_pImpl->m_xPageHeader); - //::comphelper::disposeComponent(m_pImpl->m_xPageFooter); - //::comphelper::disposeComponent(m_pImpl->m_xDetail); - ::comphelper::disposeComponent(m_pImpl->m_xFunctions); - - //::comphelper::disposeComponent(m_pImpl->m_xStorage); - // don't dispose, this currently is the task of either the ref count going to - // 0, or of the embedded object (if we're embedded, which is the only possible - // case so far) - // #i78366# / 2007-06-18 / frank.schoenheit@sun.com - m_pImpl->m_xStorage.clear(); - m_pImpl->m_xViewData.clear(); - m_pImpl->m_xCurrentController.clear(); - m_pImpl->m_xNumberFormatsSupplier.clear(); - m_pImpl->m_xStyles.clear(); - m_pImpl->m_xXMLNamespaceMap.clear(); - m_pImpl->m_xGradientTable.clear(); - m_pImpl->m_xHatchTable.clear(); - m_pImpl->m_xBitmapTable.clear(); - m_pImpl->m_xTransparencyGradientTable.clear(); - m_pImpl->m_xDashTable.clear(); - m_pImpl->m_xMarkerTable.clear(); - m_pImpl->m_xUIConfigurationManager.clear(); - m_pImpl->m_pReportModel.reset(); - m_pImpl->m_pObjectContainer.reset(); - m_pImpl->m_aArgs.realloc(0); - m_pImpl->m_xTitleHelper.clear(); - m_pImpl->m_xNumberedControllers.clear(); - } + + lang::EventObject aDisposeEvent( static_cast< ::cppu::OWeakObject* >( this ) ); + m_pImpl->m_aModifyListeners.disposeAndClear( aDisposeEvent ); + m_pImpl->m_aCloseListener.disposeAndClear( aDisposeEvent ); + m_pImpl->m_aDocEventListeners.disposeAndClear( aDisposeEvent ); + m_pImpl->m_aStorageChangeListeners.disposeAndClear( aDisposeEvent ); + + // SYNCHRONIZED ---> + vos::OGuard aSolarGuard( Application::GetSolarMutex() ); + ::osl::ResettableMutexGuard aGuard(m_aMutex); + + m_pImpl->m_aControllers.clear(); + + ::comphelper::disposeComponent(m_pImpl->m_xGroups); + m_pImpl->m_xReportHeader.clear(); + m_pImpl->m_xReportFooter.clear(); + m_pImpl->m_xPageHeader.clear(); + m_pImpl->m_xPageFooter.clear(); + m_pImpl->m_xDetail.clear(); + //::comphelper::disposeComponent(m_pImpl->m_xReportHeader); + //::comphelper::disposeComponent(m_pImpl->m_xReportFooter); + //::comphelper::disposeComponent(m_pImpl->m_xPageHeader); + //::comphelper::disposeComponent(m_pImpl->m_xPageFooter); + //::comphelper::disposeComponent(m_pImpl->m_xDetail); + ::comphelper::disposeComponent(m_pImpl->m_xFunctions); + + //::comphelper::disposeComponent(m_pImpl->m_xStorage); + // don't dispose, this currently is the task of either the ref count going to + // 0, or of the embedded object (if we're embedded, which is the only possible + // case so far) + // #i78366# / 2007-06-18 / frank.schoenheit@sun.com + m_pImpl->m_xStorage.clear(); + m_pImpl->m_xViewData.clear(); + m_pImpl->m_xCurrentController.clear(); + m_pImpl->m_xNumberFormatsSupplier.clear(); + m_pImpl->m_xStyles.clear(); + m_pImpl->m_xXMLNamespaceMap.clear(); + m_pImpl->m_xGradientTable.clear(); + m_pImpl->m_xHatchTable.clear(); + m_pImpl->m_xBitmapTable.clear(); + m_pImpl->m_xTransparencyGradientTable.clear(); + m_pImpl->m_xDashTable.clear(); + m_pImpl->m_xMarkerTable.clear(); + m_pImpl->m_xUIConfigurationManager.clear(); + m_pImpl->m_pReportModel.reset(); + m_pImpl->m_pObjectContainer.reset(); + m_pImpl->m_aArgs.realloc(0); + m_pImpl->m_xTitleHelper.clear(); + m_pImpl->m_xNumberedControllers.clear(); + // <--- SYNCHRONIZED } + // ----------------------------------------------------------------------------- ::rtl::OUString OReportDefinition::getImplementationName_Static( ) throw(uno::RuntimeException) { |