gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash ChangeLog server/movie_def_impl.cpp serve...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/movie_def_impl.cpp serve...
Date: Sat, 19 Aug 2006 13:15:41 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  06/08/19 13:15:40

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

Log message:
                * server/movie_def_impl.h, server/movie_def_impl.cpp,
                  server/sprite_instance.cpp: added MovieLoader::lock()
                  and unlock() functions, lock loader at every iteration
                  of read_all_swf() and from within wait_for_frame,
                  only ensure next frame is loaded (rather then loading
                  next *chunk* at every advance_root call).

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.651&r2=1.652
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_def_impl.cpp?cvsroot=gnash&r1=1.21&r2=1.22
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_def_impl.h?cvsroot=gnash&r1=1.19&r2=1.20
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.34&r2=1.35

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.651
retrieving revision 1.652
diff -u -b -r1.651 -r1.652
--- ChangeLog   18 Aug 2006 09:36:47 -0000      1.651
+++ ChangeLog   19 Aug 2006 13:15:40 -0000      1.652
@@ -1,3 +1,12 @@
+2006-08-19 Sandro Santilli  <address@hidden>
+
+       * server/movie_def_impl.h, server/movie_def_impl.cpp,
+         server/sprite_instance.cpp: added MovieLoader::lock()
+         and unlock() functions, lock loader at every iteration
+         of read_all_swf() and from within wait_for_frame,
+         only ensure next frame is loaded (rather then loading
+         next *chunk* at every advance_root call).
+
 2006-08-18 Vitaly Alexeev <address@hidden>
        
        * server\sprite_instance.cpp: a bit cleanup

Index: server/movie_def_impl.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/movie_def_impl.cpp,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- server/movie_def_impl.cpp   17 Aug 2006 19:00:31 -0000      1.21
+++ server/movie_def_impl.cpp   19 Aug 2006 13:15:40 -0000      1.22
@@ -71,6 +71,9 @@
 // Debug frames load
 #undef DEBUG_FRAMES_LOAD
 
+// Debug threads locking
+#undef DEBUG_THREADS_LOCKING
+
 namespace gnash
 {
 
@@ -80,13 +83,13 @@
        _movie_def(md)
 {
        pthread_cond_init(&frame_reached_condition, NULL);
-       pthread_mutex_init(&fake_mut, NULL);
+       pthread_mutex_init(&_mutex, NULL);
 }
 
 MovieLoader::~MovieLoader()
 {
        pthread_cond_destroy(&frame_reached_condition);
-       pthread_mutex_destroy(&fake_mut);
+       pthread_mutex_destroy(&_mutex);
 }
 
 void*
@@ -123,12 +126,71 @@
 }
 
 void
+MovieLoader::lock()
+{
+
+#ifdef DEBUG_THREADS_LOCKING
+       // debugging
+       if ( pthread_equal(pthread_self(), _thread) ) {
+               log_msg("MovieLoader locking itself");
+       } else {
+               log_msg("MovieLoader being locked by another thread");
+       }
+#endif
+
+       pthread_mutex_lock(&_mutex);
+
+#ifdef DEBUG_THREADS_LOCKING
+       // debugging
+       if ( pthread_equal(pthread_self(), _thread) ) {
+               log_msg("MovieLoader locked by itself");
+       } else {
+               log_msg("MovieLoader locked by another thread");
+       }
+#endif
+}
+
+void
+MovieLoader::unlock()
+{
+
+#ifdef DEBUG_THREADS_LOCKING
+       // debugging
+       if ( pthread_equal(pthread_self(), _thread) ) {
+               log_msg("MovieLoader unlocking itself");
+       } else {
+               log_msg("MovieLoader being unlocked by another thread");
+       }
+#endif
+
+       pthread_mutex_unlock(&_mutex);
+
+#ifdef DEBUG_THREADS_LOCKING
+       // debugging
+       if ( pthread_equal(pthread_self(), _thread) ) {
+               log_msg("MovieLoader unlocked itself");
+       } else {
+               log_msg("MovieLoader unlocked by another thread");
+       }
+#endif
+}
+
+void
 MovieLoader::wait_for_frame(size_t framenum)
 {
+
+       // lock the loader so we can rely on m_loading_frame
+       lock();
+
+       if ( _movie_def.get_loading_frame() < framenum )
+       {
        assert(waiting_for_frame == 0);
         waiting_for_frame = framenum;
-        pthread_cond_wait(&frame_reached_condition, &fake_mut);
+               pthread_cond_wait(&frame_reached_condition, &_mutex);
        waiting_for_frame = 0;
+       }
+
+       unlock();
 }
 
 
@@ -510,12 +572,9 @@
 bool
 movie_def_impl::ensure_frame_loaded(size_t framenum)
 {
-       if ( m_loading_frame >= framenum ) return true;
-
-       // else, set condition and wait for it
-        log_msg("Waiting for frame %u to be loaded", framenum);
+        //log_msg("Waiting for frame %u to be loaded", framenum);
        _loader.wait_for_frame(framenum);
-        log_msg("Condition reached (m_loading_frame=%u)", m_loading_frame);
+        //log_msg("Condition reached (m_loading_frame=%u)", m_loading_frame);
 
 
        // TODO: return false on timeout 
@@ -780,6 +839,10 @@
        //size_t it=0;
        while ( (uint32_t) str.get_position() < _swf_end_pos )
        {
+               // Get exclusive lock on loader, to avoid
+               // race conditions with wait_for_frame
+               _loader.lock();
+
                //log_msg("Loading thread iteration %u", it++);
 
                SWF::tag_type tag_type = str.open_tag();
@@ -835,9 +898,12 @@
                                log_warning("hit stream-end tag, "
                                        "but not at the advertised SWF end; "
                                        "stopping for safety.");
+                               _loader.unlock();
                                break;
                        }
                }
+               _loader.unlock();
+
        }
 
 }

Index: server/movie_def_impl.h
===================================================================
RCS file: /sources/gnash/gnash/server/movie_def_impl.h,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -b -r1.19 -r1.20
--- server/movie_def_impl.h     16 Aug 2006 14:30:19 -0000      1.19
+++ server/movie_def_impl.h     19 Aug 2006 13:15:40 -0000      1.20
@@ -125,13 +125,17 @@
        /// Signal load of given frame number (if anyone waiting for it)
        void signal_frame_loaded(size_t frameno);
 
+       void lock();
+
+       void unlock();
+
 private:
 
        size_t waiting_for_frame;
 
        pthread_cond_t frame_reached_condition;
 
-       pthread_mutex_t fake_mut;
+       pthread_mutex_t _mutex;
 
        pthread_t _thread;
 

Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -b -r1.34 -r1.35
--- server/sprite_instance.cpp  18 Aug 2006 09:35:18 -0000      1.34
+++ server/sprite_instance.cpp  19 Aug 2006 13:15:40 -0000      1.35
@@ -1242,15 +1242,14 @@
 
        assert ( get_root()->get_root_movie() == this );
 
-       // Load next frame chunk if available (even if not needed for
-       // display of the next one) - this is to use idle time for loading.
+       movie_definition* md = get_movie_definition();
+
+       // Load next frame if available (+2 as m_current_frame is 0-based)
        //
        // We do this inside advance_root to make sure
        // it's only for a root sprite (not a sprite defined
        // by DefineSprite!)
-
-       movie_definition* md = get_movie_definition();
-       md->load_next_frame_chunk();
+       md->ensure_frame_loaded(min(get_current_frame()+2, get_frame_count()));
 
        m_time_remainder += delta_time;
 




reply via email to

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