diff options
author | Chris Rankin <rankincj@yahoo.com> | 2011-09-10 21:26:02 +0100 |
---|---|---|
committer | Chris Rankin <rankincj@yahoo.com> | 2011-09-10 21:26:02 +0100 |
commit | d64df7d5b79b965ffd546d8e45553e1cb9efe2b3 (patch) | |
tree | 89c50d72c1058883e63d3e2ef26031e7446b2fbf /src | |
parent | de65e355ef7f33091ae14854120574b5509941db (diff) | |
download | xine-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.c | 4 | ||||
-rw-r--r-- | src/xine-engine/xine.c | 16 |
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); } |