[Top][All Lists]
[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;