summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Rankin <rankincj@yahoo.com>2011-09-10 21:26:02 +0100
committerChris Rankin <rankincj@yahoo.com>2011-09-10 21:26:02 +0100
commitd64df7d5b79b965ffd546d8e45553e1cb9efe2b3 (patch)
tree89c50d72c1058883e63d3e2ef26031e7446b2fbf
parentde65e355ef7f33091ae14854120574b5509941db (diff)
downloadxine-lib-d64df7d5b79b965ffd546d8e45553e1cb9efe2b3.tar.gz
xine-lib-d64df7d5b79b965ffd546d8e45553e1cb9efe2b3.tar.bz2
Ensure that the stream reference inside each event queue is counted,
and that each stream object is removed from its parent xine object's list before it starts destroying itself.
-rw-r--r--src/xine-engine/events.c4
-rw-r--r--src/xine-engine/xine.c16
2 files changed, 13 insertions, 7 deletions
diff --git a/src/xine-engine/events.c b/src/xine-engine/events.c
index 04a599c50..a5680476f 100644
--- a/src/xine-engine/events.c
+++ b/src/xine-engine/events.c
@@ -111,6 +111,8 @@ xine_event_queue_t *xine_event_new_queue (xine_stream_t *stream) {
xine_event_queue_t *queue;
+ _x_refcounter_inc(stream->refcounter);
+
queue = malloc (sizeof (xine_event_queue_t));
pthread_mutex_init (&queue->lock, NULL);
@@ -186,6 +188,8 @@ void xine_event_dispose_queue (xine_event_queue_t *queue) {
free (queue->listener_thread);
}
+ _x_refcounter_dec(stream->refcounter);
+
/*
* clean up pending events
*/
diff --git a/src/xine-engine/xine.c b/src/xine-engine/xine.c
index fad1785b4..78d144b1f 100644
--- a/src/xine-engine/xine.c
+++ b/src/xine-engine/xine.c
@@ -1474,6 +1474,14 @@ static void xine_dispose_internal (xine_stream_t *stream) {
xine_list_iterator_t *ite;
lprintf("stream: %p\n", stream);
+
+ pthread_mutex_lock(&stream->xine->streams_lock);
+ ite = xine_list_find(stream->xine->streams, stream);
+ if (ite) {
+ xine_list_remove(stream->xine->streams, ite);
+ }
+ pthread_mutex_unlock(&stream->xine->streams_lock);
+
pthread_mutex_destroy (&stream->info_mutex);
pthread_mutex_destroy (&stream->meta_mutex);
pthread_mutex_destroy (&stream->frontend_lock);
@@ -1491,13 +1499,6 @@ static void xine_dispose_internal (xine_stream_t *stream) {
xine_list_delete(stream->event_queues);
- pthread_mutex_lock(&stream->xine->streams_lock);
- ite = xine_list_find(stream->xine->streams, stream);
- if (ite) {
- xine_list_remove(stream->xine->streams, ite);
- }
- pthread_mutex_unlock(&stream->xine->streams_lock);
-
_x_refcounter_dispose(stream->refcounter);
free (stream->current_extra_info);
@@ -1535,6 +1536,7 @@ void xine_dispose (xine_stream_t *stream) {
if (stream->osd_renderer)
stream->osd_renderer->close( stream->osd_renderer );
+ /* Remove the reference that the stream was created with. */
_x_refcounter_dec(stream->refcounter);
}