summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiguel Freitas <miguelfreitas@users.sourceforge.net>2008-03-10 23:11:49 -0300
committerMiguel Freitas <miguelfreitas@users.sourceforge.net>2008-03-10 23:11:49 -0300
commitd3572a729ae098dba38d27a2b1914b6ca17c4de1 (patch)
tree68e6cd4c9120d87de4491216e0c0943dfcb7b393
parent7c037569b273a754f232f42309f7bda34c9d5268 (diff)
downloadxine-lib-d3572a729ae098dba38d27a2b1914b6ca17c4de1.tar.gz
xine-lib-d3572a729ae098dba38d27a2b1914b6ca17c4de1.tar.bz2
Fixed long delay when closing stream on dual core systems [Bug #33]
-rw-r--r--ChangeLog1
-rw-r--r--src/xine-engine/demux.c15
-rw-r--r--src/xine-engine/xine.c3
-rw-r--r--src/xine-engine/xine_internal.h1
4 files changed, 15 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index f3a170403..84dc7815f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -17,6 +17,7 @@ xine-lib (1.1.11) unreleased
(This is a convenience feature for users only. Front ends which rely on
it for functions like subtitle file detection must instead use file://
MRLs; if they don't, we consider them to be buggy.)
+ * Fixed long delay when closing stream on dual core systems [Bug #33]
xine-lib (1.1.10.1) 2008-02-07
* Security fixes:
diff --git a/src/xine-engine/demux.c b/src/xine-engine/demux.c
index f33397256..24ee1b86d 100644
--- a/src/xine-engine/demux.c
+++ b/src/xine-engine/demux.c
@@ -198,6 +198,7 @@ void _x_demux_control_headers_done (xine_stream_t *stream) {
}
stream->demux_action_pending = 0;
+ pthread_cond_signal(&stream->demux_resume);
lprintf ("headers processed.\n");
@@ -284,12 +285,14 @@ static void *demux_loop (void *stream_gen) {
/* someone may want to interrupt us */
if( stream->demux_action_pending ) {
- pthread_mutex_unlock( &stream->demux_lock );
+ struct timeval tv;
+ struct timespec ts;
- lprintf ("sched_yield\n");
-
- sched_yield();
- pthread_mutex_lock( &stream->demux_lock );
+ gettimeofday(&tv, NULL);
+ ts.tv_sec = tv.tv_sec;
+ ts.tv_nsec = (tv.tv_usec + 100000) * 1000;
+
+ pthread_cond_timedwait (&stream->demux_resume, &stream->demux_lock, &ts);
}
}
@@ -365,6 +368,7 @@ int _x_demux_start_thread (xine_stream_t *stream) {
stream->demux_action_pending = 1;
pthread_mutex_lock( &stream->demux_lock );
stream->demux_action_pending = 0;
+ pthread_cond_signal(&stream->demux_resume);
if( !stream->demux_thread_running ) {
@@ -396,6 +400,7 @@ int _x_demux_stop_thread (xine_stream_t *stream) {
pthread_mutex_lock( &stream->demux_lock );
stream->demux_thread_running = 0;
stream->demux_action_pending = 0;
+ pthread_cond_signal(&stream->demux_resume);
/* At that point, the demuxer has sent the last audio/video buffer,
* so it's a safe place to flush the engine.
diff --git a/src/xine-engine/xine.c b/src/xine-engine/xine.c
index 841f966d1..c207680e6 100644
--- a/src/xine-engine/xine.c
+++ b/src/xine-engine/xine.c
@@ -629,6 +629,7 @@ xine_stream_t *xine_stream_new (xine_t *this,
pthread_mutex_init (&stream->meta_mutex, NULL);
pthread_mutex_init (&stream->demux_lock, NULL);
pthread_mutex_init (&stream->demux_mutex, NULL);
+ pthread_cond_init (&stream->demux_resume, NULL);
pthread_mutex_init (&stream->event_queues_lock, NULL);
pthread_mutex_init (&stream->counter_lock, NULL);
pthread_cond_init (&stream->counter_changed, NULL);
@@ -1322,6 +1323,7 @@ static int play_internal (xine_stream_t *stream, int start_pos, int start_time)
pthread_mutex_lock( &stream->demux_lock );
/* demux_lock taken. now demuxer is suspended */
stream->demux_action_pending = 0;
+ pthread_cond_signal(&stream->demux_resume);
/* set normal speed again (now that demuxer/input pair is suspended)
* some input plugin may have changed speed by itself, we must ensure
@@ -1448,6 +1450,7 @@ void xine_dispose_internal (xine_stream_t *stream) {
pthread_mutex_destroy (&stream->current_extra_info_lock);
pthread_cond_destroy (&stream->counter_changed);
pthread_mutex_destroy (&stream->demux_mutex);
+ pthread_cond_destroy (&stream->demux_resume);
pthread_mutex_destroy (&stream->demux_lock);
pthread_mutex_destroy (&stream->first_frame_lock);
pthread_cond_destroy (&stream->first_frame_reached);
diff --git a/src/xine-engine/xine_internal.h b/src/xine-engine/xine_internal.h
index 9b69f16f1..8fb4723a5 100644
--- a/src/xine-engine/xine_internal.h
+++ b/src/xine-engine/xine_internal.h
@@ -333,6 +333,7 @@ struct xine_stream_s {
int demux_thread_running;
pthread_mutex_t demux_lock;
int demux_action_pending;
+ pthread_cond_t demux_resume;
pthread_mutex_t demux_mutex; /* used in _x_demux_... functions to synchronize order of pairwise A/V buffer operations */
extra_info_t *current_extra_info;