From ed6b4dc7f615a51fc87a81786f9ad7673a84e06a Mon Sep 17 00:00:00 2001 From: Michael Meeks Date: Sun, 5 Jan 2014 01:26:50 +0000 Subject: [PATCH] package: avoid un-necessary modification event work. Change-Id: Ia4b4e3edccf661b8c5f474c5c7474b5f9e497fcc --- package/source/xstor/owriteablestream.cxx | 2 +- package/source/xstor/xstorage.cxx | 6 ++++++ package/source/xstor/xstorage.hxx | 8 ++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/package/source/xstor/owriteablestream.cxx b/package/source/xstor/owriteablestream.cxx index bc7086ef5564..63e2b7044a5d 100644 --- a/package/source/xstor/owriteablestream.cxx +++ b/package/source/xstor/owriteablestream.cxx @@ -1861,7 +1861,7 @@ void OWriteStream::ModifyParentUnlockMutex_Impl( ::osl::ResettableMutexGuard& aG { if ( m_pImpl->m_pParent ) { - if ( m_pImpl->m_pParent->m_pAntiImpl ) + if ( m_pImpl->m_pParent->HasModifiedListener() ) { uno::Reference< util::XModifiable > xParentModif( (util::XModifiable*)(m_pImpl->m_pParent->m_pAntiImpl) ); aGuard.clear(); diff --git a/package/source/xstor/xstorage.cxx b/package/source/xstor/xstorage.cxx index 9a787822d851..9e2ffb72730d 100644 --- a/package/source/xstor/xstorage.cxx +++ b/package/source/xstor/xstorage.cxx @@ -191,6 +191,7 @@ OStorage_Impl::OStorage_Impl( uno::Reference< io::XInputStream > xInputStream, , m_bCommited( sal_False ) , m_bIsRoot( sal_True ) , m_bListCreated( sal_False ) +, m_nModifiedListenerCount( 0 ) , m_xContext( xContext ) , m_xProperties( xProperties ) , m_bHasCommonEncryptionData( sal_False ) @@ -230,6 +231,7 @@ OStorage_Impl::OStorage_Impl( uno::Reference< io::XStream > xStream, , m_bCommited( sal_False ) , m_bIsRoot( sal_True ) , m_bListCreated( sal_False ) +, m_nModifiedListenerCount( 0 ) , m_xContext( xContext ) , m_xProperties( xProperties ) , m_bHasCommonEncryptionData( sal_False ) @@ -272,6 +274,7 @@ OStorage_Impl::OStorage_Impl( OStorage_Impl* pParent, , m_bCommited( sal_False ) , m_bIsRoot( sal_False ) , m_bListCreated( sal_False ) +, m_nModifiedListenerCount( 0 ) , m_xPackageFolder( xPackageFolder ) , m_xPackage( xPackage ) , m_xContext( xContext ) @@ -1959,6 +1962,7 @@ void SAL_CALL OStorage::InternalDispose( sal_Bool bNotifyImpl ) // since the listeners could dispose the object while being notified lang::EventObject aSource( static_cast< ::cppu::OWeakObject* >(this) ); m_pData->m_aListenersContainer.disposeAndClear( aSource ); + m_pImpl->m_nModifiedListenerCount = 0; if ( m_pData->m_bReadOnlyWrap ) { @@ -4203,6 +4207,7 @@ void SAL_CALL OStorage::addModifyListener( throw lang::DisposedException( OSL_LOG_PREFIX, uno::Reference< uno::XInterface >() ); } + osl_atomic_increment( &m_pImpl->m_nModifiedListenerCount ); m_pData->m_aListenersContainer.addInterface( ::getCppuType( ( const uno::Reference< util::XModifyListener >* )0 ), aListener ); } @@ -4219,6 +4224,7 @@ void SAL_CALL OStorage::removeModifyListener( throw lang::DisposedException( OSL_LOG_PREFIX, uno::Reference< uno::XInterface >() ); } + osl_atomic_decrement( &m_pImpl->m_nModifiedListenerCount ); m_pData->m_aListenersContainer.removeInterface( ::getCppuType( ( const uno::Reference< util::XModifyListener >* )0 ), aListener ); } diff --git a/package/source/xstor/xstorage.hxx b/package/source/xstor/xstorage.hxx index 27f92e3efba0..6fab38508e4d 100644 --- a/package/source/xstor/xstorage.hxx +++ b/package/source/xstor/xstorage.hxx @@ -128,11 +128,19 @@ struct OStorage_Impl sal_Int32 m_nStorageMode; // open mode ( read/write/trunc/nocreate ) sal_Bool m_bIsModified; // only modified elements will be sent to the original content sal_Bool m_bBroadcastModified; // will be set if notification is required + sal_Bool m_bCommited; // sending the streams is coordinated by the root storage of the package sal_Bool m_bIsRoot; // marks this storage as root storages that manages all commits and reverts sal_Bool m_bListCreated; + /// Count of registered modification listeners + oslInterlockedCount m_nModifiedListenerCount; + bool HasModifiedListener() + { + return m_nModifiedListenerCount > 0 && m_pAntiImpl != NULL; + } + SotElementList_Impl m_aChildrenList; SotElementList_Impl m_aDeletedList;