gnash-commit
[Top][All Lists]
Advanced

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




reply via email to

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