summaryrefslogtreecommitdiff
path: root/src
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 /src
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.
Diffstat (limited to 'src')
-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);
}