summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@collabora.com>2014-01-05 01:26:50 +0000
committerFridrich Strba <fridrich@documentfoundation.org>2014-01-06 16:10:08 +0000
commit1ae9fdb294fe063a55e34188b249c5e0d908ddcf (patch)
tree7208a953e2377c8d8ee84712fb9f4ee1eff4d004
parentc41e98e9ec3026c62424420e4910bd9a0470fbb7 (diff)
package: avoid un-necessary modification event work.
Change-Id: Ia4b4e3edccf661b8c5f474c5c7474b5f9e497fcc Reviewed-on: https://gerrit.libreoffice.org/7282 Reviewed-by: Fridrich Strba <fridrich@documentfoundation.org> Tested-by: Fridrich Strba <fridrich@documentfoundation.org>
-rw-r--r--package/source/xstor/owriteablestream.cxx2
-rw-r--r--package/source/xstor/xstorage.cxx6
-rw-r--r--package/source/xstor/xstorage.hxx8
3 files changed, 15 insertions, 1 deletions
diff --git a/package/source/xstor/owriteablestream.cxx b/package/source/xstor/owriteablestream.cxx
index 9d987a5fbe7b..c3a25910cbe5 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 039dd22f150d..ccc0efe058d3 100644
--- a/package/source/xstor/xstorage.hxx
+++ b/package/source/xstor/xstorage.hxx
@@ -124,11 +124,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;