gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv...
Date: Fri, 16 May 2008 10:22:18 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  08/05/16 10:22:16

Modified files:
        .              : ChangeLog 
        server         : sprite_instance.cpp sprite_instance.h 

Log message:
        * server/sprite_instance.{cpp,h}: remove unloaded TextField references
          from TextField variables container on ::cleanupDisplayList.
          Fixes bug #20076 (leak on curve_ball.swf).

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.6618&r2=1.6619
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.534&r2=1.535
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.h?cvsroot=gnash&r1=1.196&r2=1.197

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.6618
retrieving revision 1.6619
diff -u -b -r1.6618 -r1.6619
--- ChangeLog   16 May 2008 09:34:39 -0000      1.6618
+++ ChangeLog   16 May 2008 10:22:13 -0000      1.6619
@@ -1,3 +1,9 @@
+2008-05-16 Sandro Santilli <address@hidden>
+
+       * server/sprite_instance.{cpp,h}: remove unloaded TextField references
+         from TextField variables container on ::cleanupDisplayList.
+         Fixes bug #20076 (leak on curve_ball.swf).
+
 2008-05-16 Benjamin Wolsey <address@hidden>
 
        * testsuite/libamf.all/zzufsol: script to corrupt all your .sol files.

Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.534
retrieving revision 1.535
diff -u -b -r1.534 -r1.535
--- server/sprite_instance.cpp  14 May 2008 20:37:00 -0000      1.534
+++ server/sprite_instance.cpp  16 May 2008 10:22:15 -0000      1.535
@@ -4107,6 +4107,32 @@
   _vm.getRoot().set_background_color(color);
 }
 
+static bool isTextFieldUnloaded(boost::intrusive_ptr< edit_text_character >& p)
+{
+       return p->isUnloaded();
+}
+
+/*private*/
+void
+sprite_instance::cleanup_textfield_variables()
+{
+  // nothing to do
+  if ( ! _text_variables.get() ) return;
+
+  TextFieldMap& m = *_text_variables;
+
+  for (TextFieldMap::iterator i=m.begin(), ie=m.end(); i!=ie; ++i)
+  {
+    TextFieldPtrVect& v=i->second;
+    TextFieldPtrVect::iterator lastValid = std::remove_if(v.begin(), v.end(), 
boost::bind(isTextFieldUnloaded, _1));
+    v.erase(lastValid, v.end());
+    // TODO: remove the map element if vector is empty
+    //if ( v.empty() )
+    //{
+    //}
+  }
+}
+
 
 /* public */
 void
@@ -4714,6 +4740,8 @@
 {
         //log_debug("%s.cleanDisplayList() called, current dlist is %p", 
getTarget(), (void*)&m_display_list);
   m_display_list.removeUnloaded();
+
+        cleanup_textfield_variables();
 }
 
 #ifdef GNASH_USE_GC
@@ -4749,6 +4777,19 @@
       const TextFieldPtrVect& tfs=i->second;
       for (TextFieldPtrVect::const_iterator j=tfs.begin(), je=tfs.end(); 
j!=je; ++j)
       {
+        if ( (*j)->isUnloaded() )
+       {
+          // NOTE: cleanup_display_list should have cleared these up on 
::cleanupDisplayList.
+          //       I guess if we get more might be due to ::destroy calls 
happening after
+          //       our own ::cleanupDisplayList call. Should be ok to postpone 
cleanup
+          //       on next ::advance, or we should cleanup here (locally) 
altought we're
+          //       a 'const' method...
+          //       Yet another approach would be for TextField::unload to 
unregister
+          //       self from our map, but TextField (edit_text_character) 
doesn't really
+          //       store a pointer to the sprite it's registered against.
+          //
+          log_debug("Unloaded TextField in registered textfield variables 
container on ::markReachableResources");
+       }
         (*j)->setReachable();
       }
     }

Index: server/sprite_instance.h
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.h,v
retrieving revision 1.196
retrieving revision 1.197
diff -u -b -r1.196 -r1.197
--- server/sprite_instance.h    8 May 2008 08:21:29 -0000       1.196
+++ server/sprite_instance.h    16 May 2008 10:22:15 -0000      1.197
@@ -958,6 +958,9 @@
        ///
        TextFieldPtrVect* get_textfield_variable(const std::string& name);
 
+       /// Unregister textfield variables bound to unloaded TextFields
+       void cleanup_textfield_variables();
+
        /// soundid for current playing stream. If no stream set to -1
        int m_sound_stream_id;
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]