[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog server/parser/movie_def_impl.cp...
From: |
Sandro Santilli |
Subject: |
[Gnash-commit] gnash ChangeLog server/parser/movie_def_impl.cp... |
Date: |
Fri, 17 Nov 2006 15:17:38 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Sandro Santilli <strk> 06/11/17 15:17:38
Modified files:
. : ChangeLog
server/parser : movie_def_impl.cpp movie_def_impl.h
server/swf : tag_loaders.cpp
Log message:
* server/parser/movie_def_impl.cpp (get_exported_resource) :
use a timeout to handle circular IMPORT chains.
* server/parser/movie_def_impl.{cpp,h}:
Added MovieLoader::isSelfThread() method, more assertion
checking, made LOAD_MOVIES_IN_A_SEPARATE_THREAD work again.
* server/swf/tag_loaders.cpp (import_loader): updated messages
to be less confusing.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.1652&r2=1.1653
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/movie_def_impl.cpp?cvsroot=gnash&r1=1.38&r2=1.39
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/movie_def_impl.h?cvsroot=gnash&r1=1.19&r2=1.20
http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf/tag_loaders.cpp?cvsroot=gnash&r1=1.58&r2=1.59
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.1652
retrieving revision 1.1653
diff -u -b -r1.1652 -r1.1653
--- ChangeLog 17 Nov 2006 14:52:19 -0000 1.1652
+++ ChangeLog 17 Nov 2006 15:17:38 -0000 1.1653
@@ -1,3 +1,13 @@
+2006-11-17 Sandro Santilli <address@hidden>
+
+ * server/parser/movie_def_impl.cpp (get_exported_resource) :
+ use a timeout to handle circular IMPORT chains.
+ * server/parser/movie_def_impl.{cpp,h}:
+ Added MovieLoader::isSelfThread() method, more assertion
+ checking, made LOAD_MOVIES_IN_A_SEPARATE_THREAD work again.
+ * server/swf/tag_loaders.cpp (import_loader): updated messages
+ to be less confusing.
+
2006-11-17 Tomas Groth Christensen <address@hidden>
* backend/sound_handler_sdl.{h,cpp}: Re-structured the code a bit
Index: server/parser/movie_def_impl.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/parser/movie_def_impl.cpp,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -b -r1.38 -r1.39
--- server/parser/movie_def_impl.cpp 17 Nov 2006 12:38:23 -0000 1.38
+++ server/parser/movie_def_impl.cpp 17 Nov 2006 15:17:38 -0000 1.39
@@ -92,6 +92,12 @@
return _thread != 0;
}
+bool
+MovieLoader::isSelfThread() const
+{
+ return pthread_self() == _thread;
+}
+
void*
MovieLoader::execute(void* arg)
{
@@ -794,9 +800,11 @@
movie_def_impl::create_instance()
{
+#ifdef LOAD_MOVIES_IN_A_SEPARATE_THREAD
// Guess we want to make sure the loader is started
// before we create an instance, right ?
assert (_loader.started());
+#endif
// @@ Shouldn't we return a movie_instance instead ?
// @@ and leave movie_root creation to the caller ..
@@ -907,6 +915,14 @@
{
assert(_str.get() != NULL);
+#ifdef LOAD_MOVIES_IN_A_SEPARATE_THREAD
+ assert( _loader.isSelfThread() );
+ assert( _loader.started() );
+#else
+ assert( ! _loader.started() );
+ assert( ! _loader.isSelfThread() );
+#endif
+
stream &str = *_str;
//size_t it=0;
@@ -1001,8 +1017,8 @@
log_msg("get_exported_resource called, frame count=%u", m_frame_count);
#endif
- // FIXME: a movie importing from itself will likely
- // end up in a dead lock
+ // Don't call get_exported_resource() from this movie loader
+ assert( ! _loader.isSelfThread() );
// this is a simple utility so we don't forget
// to release our locks...
@@ -1022,24 +1038,64 @@
// Keep trying until either we found the export or
- // the stream is over.
- bool found=false;
+ // the stream is over, or there is NO frames progress
+ // after def_timeout microseconds.
+ //
+ // Note that the NO frame progress might be due
+ // to a circular import chain:
+ //
+ // A imports B imports A
+ //
+
+ // Timeout after one second of NO frames progress
+ const unsigned long def_timeout=1000000;
+
+ // Sleep 1/10 of a second between checks
+ const unsigned long naptime=100000;
+
+ unsigned long timeout=def_timeout;
+ size_t loading_frame = 0; // used to keep track of advancements
for (;;)
{
+ // FIXME: make m_exports access thread-safe
+ if ( m_exports.get(symbol, &res) )
{
- // lock the loader
- scoped_loader_locker locker(_loader);
+ return res;
+ }
- if ( m_exports.get(symbol, &res) )
+ // FIXME: make get_loading_frame() thread-safe
+ size_t new_loading_frame = get_loading_frame();
+
+ if ( new_loading_frame != loading_frame )
{
- found=true;
- break;
+ loading_frame = new_loading_frame;
+ timeout = def_timeout;
+ }
+ else
+ {
+ if ( ! timeout-- )
+ {
+ log_warning("No frame progress in movie %s "
+ "after %lu "
+ "milliseconds, giving up on "
+ "get_exported_resource(%s): "
+ "circular IMPORTS?",
+ get_url().c_str(),
+ def_timeout/1000,
+ symbol.c_str());
+ return res;
}
- // be aware of not getting the lock twice
- // (can happen if get_loading_frame() becomes
- // a locking function)
- if ( get_loading_frame() >= m_frame_count ) break;
+ continue; // not worth checking
+ }
+
+ if ( loading_frame >= m_frame_count )
+ {
+ log_msg("At end of stream, still no '%s' symbol found "
+ "in m_exports (%u entries in it, follow)",
+ symbol.c_str(), m_exports.size());
+ return res;
+ }
#ifdef DEBUG_EXPORTS
log_msg("We haven't finished loading (loading frame %u), "
@@ -1047,17 +1103,8 @@
"sleeping a bit and trying again",
get_loading_frame());
#endif
- } // scoped_loader_locker goes out of scope here and gets
- // released...
-
- usleep(100); // take a breath
- }
- if ( ! found )
- {
- log_msg("At end of stream, still no '%s' symbol found "
- "in m_exports (%u entries in it, follow)",
- symbol.c_str(), m_exports.size());
+ usleep(naptime); // take a breath
}
return res;
Index: server/parser/movie_def_impl.h
===================================================================
RCS file: /sources/gnash/gnash/server/parser/movie_def_impl.h,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -b -r1.19 -r1.20
--- server/parser/movie_def_impl.h 17 Nov 2006 12:38:23 -0000 1.19
+++ server/parser/movie_def_impl.h 17 Nov 2006 15:17:38 -0000 1.20
@@ -112,6 +112,9 @@
/// Return true if the MovieLoader thread was started
bool started() const;
+ /// Return true if called from the MovieLoader thread.
+ bool isSelfThread() const;
+
private:
size_t _waiting_for_frame;
Index: server/swf/tag_loaders.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/swf/tag_loaders.cpp,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -b -r1.58 -r1.59
--- server/swf/tag_loaders.cpp 17 Nov 2006 13:49:46 -0000 1.58
+++ server/swf/tag_loaders.cpp 17 Nov 2006 15:17:38 -0000 1.59
@@ -18,7 +18,7 @@
//
//
-/* $Id: tag_loaders.cpp,v 1.58 2006/11/17 13:49:46 strk Exp $ */
+/* $Id: tag_loaders.cpp,v 1.59 2006/11/17 15:17:38 strk Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -31,21 +31,17 @@
#include "action.h"
#include "action_buffer.h"
#include "button_character_def.h"
-//#include "impl.h"
#include "font.h"
#include "fontlib.h"
#include "log.h"
#include "morph2_character_def.h"
-//#include "render.h"
#include "shape.h"
#include "stream.h"
#include "styles.h"
#include "dlist.h"
#include "timers.h"
#include "image.h"
-//#include "jpeg.h"
#include "zlib_adapter.h"
-//#include "Sprite.h"
#include "sprite_definition.h"
#include "swf_function.h"
#include "swf_event.h"
@@ -1425,7 +1421,7 @@
boost::intrusive_ptr<resource> res =
source_movie->get_exported_resource(symbol_name);
if (res == NULL)
{
- log_error("import error: resource '%s' is not
exported from movie '%s'\n",
+ log_warning("import error: could not find resource
'%s' in movie '%s'\n",
symbol_name, source_url);
}
else if (font* f = res->cast_to_font())