tdf#125846 - Remove the terminate listener of an embedded object only once

Otherwise, all remaining listeners will be checked, leading to
performance issues when closing a document with many objects like formulas.

Change-Id: I99b4b536e40af8a9045c7da6356cca87d3c88b02
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/211697
Reviewed-by: Andreas Heinisch <andreas.heinisch@yahoo.de>
Tested-by: Jenkins
This commit is contained in:
Andreas Heinisch
2026-10-03 20:17:05 +02:00
parent daa89fdb7f
commit 6531640d6f
2 changed files with 9 additions and 5 deletions
+7 -3
View File
@@ -156,7 +156,7 @@ DocumentHolder::DocumentHolder( uno::Reference< uno::XComponentContext > xContex
m_bReadOnly( false ), m_bReadOnly( false ),
m_bWaitForClose( false ), m_bWaitForClose( false ),
m_bAllowClosing( false ), m_bAllowClosing( false ),
m_bDesktopTerminated( false ), m_bTerminateListenerRegistered( false ),
m_nNoBorderResizeReact( 0 ), m_nNoBorderResizeReact( 0 ),
m_nNoResizeReact( 0 ) m_nNoResizeReact( 0 )
{ {
@@ -165,6 +165,7 @@ DocumentHolder::DocumentHolder( uno::Reference< uno::XComponentContext > xContex
try try
{ {
xDesktop->addTerminateListener( this ); xDesktop->addTerminateListener( this );
m_bTerminateListenerRegistered = true;
} }
catch ( const uno::Exception& ) catch ( const uno::Exception& )
{ {
@@ -198,7 +199,6 @@ DocumentHolder::~DocumentHolder()
m_xInterceptor.clear(); m_xInterceptor.clear();
} }
if ( !m_bDesktopTerminated )
FreeOffice(); FreeOffice();
} }
@@ -233,6 +233,10 @@ void DocumentHolder::CloseFrame()
void DocumentHolder::FreeOffice() void DocumentHolder::FreeOffice()
{ {
// tdf#125846 - deregister listener only once since a second removal would check all listeners
if (!m_bTerminateListenerRegistered)
return;
m_bTerminateListenerRegistered = false;
try { try {
uno::Reference< frame::XDesktop2 > xDesktop = frame::Desktop::create( m_xContext ); uno::Reference< frame::XDesktop2 > xDesktop = frame::Desktop::create( m_xContext );
xDesktop->removeTerminateListener( this ); xDesktop->removeTerminateListener( this );
@@ -1152,8 +1156,8 @@ void SAL_CALL DocumentHolder::notifyTermination( const lang::EventObject& aSourc
{ {
OSL_ENSURE( !m_xComponent.is(), "Just a disaster..." ); OSL_ENSURE( !m_xComponent.is(), "Just a disaster..." );
m_bTerminateListenerRegistered = false;
uno::Reference< frame::XDesktop > xDesktop( aSource.Source, uno::UNO_QUERY ); uno::Reference< frame::XDesktop > xDesktop( aSource.Source, uno::UNO_QUERY );
m_bDesktopTerminated = true;
if ( xDesktop.is() ) if ( xDesktop.is() )
xDesktop->removeTerminateListener( static_cast<frame::XTerminateListener*>(this) ); xDesktop->removeTerminateListener( static_cast<frame::XTerminateListener*>(this) );
} }
+1 -1
View File
@@ -77,7 +77,7 @@ private:
bool m_bWaitForClose; bool m_bWaitForClose;
bool m_bAllowClosing; bool m_bAllowClosing;
bool m_bDesktopTerminated; bool m_bTerminateListenerRegistered;
sal_Int32 m_nNoBorderResizeReact; sal_Int32 m_nNoBorderResizeReact;
sal_Int32 m_nNoResizeReact; sal_Int32 m_nNoResizeReact;