[Libreoffice-commits] core.git: Branch 'libreoffice-4-2' - package/source

Michael Meeks michael.meeks at collabora.com
Mon Jan 6 08:10:28 PST 2014


 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(-)

New commits:
commit 1ae9fdb294fe063a55e34188b249c5e0d908ddcf
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Sun Jan 5 01:26:50 2014 +0000

    package: avoid un-necessary modification event work.
    
    Change-Id: Ia4b4e3edccf661b8c5f474c5c7474b5f9e497fcc
    Reviewed-on: https://gerrit.libreoffice.org/7282
    Reviewed-by: Fridrich Strba <fridrich at documentfoundation.org>
    Tested-by: Fridrich Strba <fridrich at documentfoundation.org>

diff --git a/package/source/xstor/owriteablestream.cxx b/package/source/xstor/owriteablestream.cxx
index 9d987a5..c3a2591 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 9a78782..9e2ffb7 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 039dd22..ccc0efe 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;
 


More information about the Libreoffice-commits mailing list