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