summaryrefslogtreecommitdiff
path: root/reportdesign
diff options
context:
space:
mode:
authorFrank Schoenheit [fs] <frank.schoenheit@sun.com>2010-02-04 16:03:51 +0100
committerFrank Schoenheit [fs] <frank.schoenheit@sun.com>2010-02-04 16:03:51 +0100
commit4831a67ec526909f6efd74545405e93891e11a45 (patch)
treea2ab9405e8c05dda1ac86b3a9958eb06a3a79428 /reportdesign
parented853a88ff6e0bfae048bb19615ab2cd255f07eb (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.cxx100
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)
{