[Libreoffice-commits] core.git: animations/source svx/inc svx/source

Jian Fang Zhang zhangjf at apache.org
Thu Mar 14 06:36:01 PDT 2013


 animations/source/animcore/animcore.cxx |   13 ++++++++-----
 svx/inc/svx/svdobj.hxx                  |    2 +-
 svx/source/svdraw/svdobj.cxx            |    5 ++++-
 3 files changed, 13 insertions(+), 7 deletions(-)

New commits:
commit d6e752d5ebfaf66d1c9b0694f9c8582311d6151a
Author: Jian Fang Zhang <zhangjf at apache.org>
Date:   Mon Jun 18 12:26:30 2012 +0000

    i#113608#, memory leak in animations: newly exposed crashed problem
    
    Patch by: zhangjf
    Review by: Andre Fischer
    
    Conflicts:
    	animations/source/animcore/animcore.cxx
    	svx/source/svdraw/svdobj.cxx
    
    Change-Id: I305d5d92d064265edf108a5a34c948c610b4fdc1

diff --git a/animations/source/animcore/animcore.cxx b/animations/source/animcore/animcore.cxx
index 6307f30..a503097 100644
--- a/animations/source/animcore/animcore.cxx
+++ b/animations/source/animcore/animcore.cxx
@@ -46,6 +46,8 @@
 #include <com/sun/star/lang/XUnoTunnel.hpp>
 #include <comphelper/servicehelper.hxx>
 #include <cppuhelper/interfacecontainer.hxx>
+#include <cppuhelper/weakref.hxx>
+
 #include <cppuhelper/implbase1.hxx>
 #include <rtl/uuid.h>
 
@@ -64,6 +66,7 @@ using ::com::sun::star::uno::XInterface;
 using ::com::sun::star::uno::RuntimeException;
 using ::com::sun::star::uno::Sequence;
 using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::WeakReference;
 using ::com::sun::star::uno::XComponentContext;
 using ::com::sun::star::uno::Exception;
 using ::com::sun::star::uno::XWeak;
@@ -300,7 +303,7 @@ private:
     Sequence< NamedValue > maUserData;
 
     // parent interface for XChild interface implementation
-    Reference<XInterface>   mxParent;
+    WeakReference<XInterface>   mxParent;
     AnimationNode*          mpParent;
 
     // attributes for XAnimate
@@ -1134,7 +1137,7 @@ void SAL_CALL AnimationNode::setUserData( const Sequence< NamedValue >& _userdat
 Reference< XInterface > SAL_CALL AnimationNode::getParent() throw (RuntimeException)
 {
     Guard< Mutex > aGuard( maMutex );
-    return mxParent;
+    return mxParent.get();
 }
 
 // --------------------------------------------------------------------
@@ -1143,12 +1146,12 @@ Reference< XInterface > SAL_CALL AnimationNode::getParent() throw (RuntimeExcept
 void SAL_CALL AnimationNode::setParent( const Reference< XInterface >& Parent ) throw (NoSupportException, RuntimeException)
 {
     Guard< Mutex > aGuard( maMutex );
-    if( Parent != mxParent )
+    if( Parent != mxParent.get() )
     {
         mxParent = Parent;
 
         mpParent = 0;
-        Reference< XUnoTunnel > xTunnel( mxParent, UNO_QUERY );
+        Reference< XUnoTunnel > xTunnel( mxParent.get(), UNO_QUERY );
         if( xTunnel.is() )
             mpParent = reinterpret_cast< AnimationNode* >( sal::static_int_cast< sal_IntPtr >(xTunnel->getSomething( getUnoTunnelId() )));
 
@@ -2050,7 +2053,7 @@ void AnimationNode::fireChangeListener()
     {
         Reference< XInterface > xSource( static_cast<OWeakObject*>(this), UNO_QUERY );
         Sequence< ElementChange > aChanges;
-        const ChangesEvent aEvent( xSource, makeAny( mxParent ), aChanges );
+        const ChangesEvent aEvent( xSource, makeAny( mxParent.get() ), aChanges );
         while( aIterator.hasMoreElements() )
         {
             Reference< XChangesListener > xListener( aIterator.next(), UNO_QUERY );
diff --git a/svx/inc/svx/svdobj.hxx b/svx/inc/svx/svdobj.hxx
index 75cc0e4..27a4568 100644
--- a/svx/inc/svx/svdobj.hxx
+++ b/svx/inc/svx/svdobj.hxx
@@ -1072,7 +1072,7 @@ protected:
 private:
     /** only for internal use!
     */
-    SvxShape* getSvxShape() const;
+    SvxShape* getSvxShape();
 
     /** do not use directly, always use getSvxShape() if you have to! */
     SvxShape*   mpSvxShape;
diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx
index e35c994..1e52b4f 100644
--- a/svx/source/svdraw/svdobj.cxx
+++ b/svx/source/svdraw/svdobj.cxx
@@ -2963,7 +2963,7 @@ void SdrObject::impl_setUnoShape( const uno::Reference< uno::XInterface >& _rxUn
 }
 
 /** only for internal use! */
-SvxShape* SdrObject::getSvxShape() const
+SvxShape* SdrObject::getSvxShape()
 {
     DBG_TESTSOLARMUTEX();
         // retrieving the impl pointer and subsequently using it is not thread-safe, of course, so it needs to be
@@ -2974,6 +2974,9 @@ SvxShape* SdrObject::getSvxShape() const
     OSL_ENSURE( !( !xShape.is() && mpSvxShape ),
         "SdrObject::getSvxShape: still having IMPL-Pointer to dead object!" );
 #endif
+    //#113608#, make sure mpSvxShape is always synchronized with maWeakUnoShape
+    if ( mpSvxShape && !xShape.is() )
+        mpSvxShape = NULL;
 
     return mpSvxShape;
 }


More information about the Libreoffice-commits mailing list