From 893c03f7846646ef30d17172f81536ed45fb710f Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Sat, 29 Dec 2001 03:02:14 +0000 Subject: [PATCH] Changed to a GList as a GSList seems to have ..uhm.. issues Original commit message from CVS: Changed to a GList as a GSList seems to have ..uhm.. issues --- gst/gstqueue.c | 40 ++++++++++++++++++++++++++-------------- plugins/elements/gstqueue.c | 40 ++++++++++++++++++++++++++-------------- 2 files changed, 52 insertions(+), 28 deletions(-) diff --git a/gst/gstqueue.c b/gst/gstqueue.c index be3abf9..e0d30c1 100644 --- a/gst/gstqueue.c +++ b/gst/gstqueue.c @@ -181,7 +181,9 @@ gst_queue_init (GstQueue *queue) gst_element_add_pad (GST_ELEMENT (queue), queue->srcpad); gst_pad_set_negotiate_function (queue->srcpad, GST_DEBUG_FUNCPTR(gst_queue_handle_negotiate_src)); + queue->leaky = GST_QUEUE_NO_LEAK; queue->queue = NULL; + queue->count = 0; queue->level_buffers = 0; queue->level_bytes = 0; queue->level_time = 0LL; @@ -248,14 +250,17 @@ gst_queue_cleanup_buffers (gpointer data, const gpointer user_data) if (GST_IS_BUFFER (data)) { gst_buffer_unref (GST_BUFFER (data)); } + else { + gst_event_free (GST_EVENT (data)); + } } static void gst_queue_locked_flush (GstQueue *queue) { - g_slist_foreach (queue->queue, gst_queue_cleanup_buffers, + g_list_foreach (queue->queue, gst_queue_cleanup_buffers, (gpointer) queue); - g_slist_free (queue->queue); + g_list_free (queue->queue); queue->queue = NULL; queue->level_buffers = 0; @@ -283,7 +288,6 @@ gst_queue_chain (GstPad *pad, GstBuffer *buf) queue = GST_QUEUE (GST_OBJECT_PARENT (pad)); - reader = FALSE; restart: /* we have to lock the queue since we span threads */ GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "locking t:%ld\n", pthread_self ()); @@ -301,7 +305,7 @@ restart: GST_ELEMENT_NAME (queue), queue->level_buffers); break; default: - gst_pad_event_default (pad, GST_EVENT (buf)); + //gst_pad_event_default (pad, GST_EVENT (buf)); break; } } @@ -327,7 +331,7 @@ restart: } /* otherwise we have to push a buffer off the other end */ else { - GSList *front; + GList *front; GstBuffer *leakbuf; GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "queue is full, leaking buffer on downstream end\n"); front = queue->queue; @@ -339,8 +343,8 @@ restart: queue->level_buffers--; queue->level_bytes -= GST_BUFFER_SIZE(leakbuf); gst_buffer_unref(leakbuf); - queue->queue = g_slist_remove_link (queue->queue, front); - g_slist_free (front); + queue->queue = g_list_remove_link (queue->queue, front); + g_list_free (front); } } @@ -383,14 +387,19 @@ restart: queue->level_buffers, queue->size_buffers); } + GST_BUFFER_OFFSET (buf) = queue->count++; /* put the buffer on the tail of the list */ - queue->queue = g_slist_append (queue->queue, buf); + queue->queue = g_list_append (queue->queue, buf); queue->level_buffers++; queue->level_bytes += GST_BUFFER_SIZE(buf); + GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "(%s:%s)+ level:%d/%d\n", GST_DEBUG_PAD_NAME(pad), queue->level_buffers, queue->size_buffers); + /* this assertion _has_ to hold */ + g_assert (g_list_length (queue->queue) == queue->level_buffers); + /* reader waiting on an empty queue */ reader = queue->reader; @@ -408,7 +417,7 @@ gst_queue_get (GstPad *pad) { GstQueue *queue; GstBuffer *buf = NULL; - GSList *front; + GList *front; gboolean writer; g_assert(pad != NULL); @@ -418,7 +427,6 @@ gst_queue_get (GstPad *pad) queue = GST_QUEUE (GST_OBJECT_PARENT (pad)); - writer = FALSE; restart: /* have to lock for thread-safety */ GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "locking t:%ld\n", pthread_self ()); @@ -462,15 +470,19 @@ restart: front = queue->queue; buf = (GstBuffer *)(front->data); GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "retrieved buffer %p from queue\n", buf); - queue->queue = g_slist_remove_link (queue->queue, front); - g_slist_free (front); + queue->queue = g_list_remove_link (queue->queue, front); + g_list_free (front); queue->level_buffers--; queue->level_bytes -= GST_BUFFER_SIZE(buf); + GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "(%s:%s)- level:%d/%d\n", GST_DEBUG_PAD_NAME(pad), queue->level_buffers, queue->size_buffers); + /* this assertion _has_ to hold */ + g_assert (g_list_length (queue->queue) == queue->level_buffers); + /* writer waiting on a full queue */ writer = queue->writer; @@ -518,8 +530,8 @@ gst_queue_change_state (GstElement *element) new_state = GST_STATE_PENDING (element); if (new_state == GST_STATE_PAUSED) { - g_cond_signal (queue->not_full); - g_cond_signal (queue->not_empty); + //g_cond_signal (queue->not_full); + //g_cond_signal (queue->not_empty); } else if (new_state == GST_STATE_READY) { gst_queue_locked_flush (queue); diff --git a/plugins/elements/gstqueue.c b/plugins/elements/gstqueue.c index be3abf9..e0d30c1 100644 --- a/plugins/elements/gstqueue.c +++ b/plugins/elements/gstqueue.c @@ -181,7 +181,9 @@ gst_queue_init (GstQueue *queue) gst_element_add_pad (GST_ELEMENT (queue), queue->srcpad); gst_pad_set_negotiate_function (queue->srcpad, GST_DEBUG_FUNCPTR(gst_queue_handle_negotiate_src)); + queue->leaky = GST_QUEUE_NO_LEAK; queue->queue = NULL; + queue->count = 0; queue->level_buffers = 0; queue->level_bytes = 0; queue->level_time = 0LL; @@ -248,14 +250,17 @@ gst_queue_cleanup_buffers (gpointer data, const gpointer user_data) if (GST_IS_BUFFER (data)) { gst_buffer_unref (GST_BUFFER (data)); } + else { + gst_event_free (GST_EVENT (data)); + } } static void gst_queue_locked_flush (GstQueue *queue) { - g_slist_foreach (queue->queue, gst_queue_cleanup_buffers, + g_list_foreach (queue->queue, gst_queue_cleanup_buffers, (gpointer) queue); - g_slist_free (queue->queue); + g_list_free (queue->queue); queue->queue = NULL; queue->level_buffers = 0; @@ -283,7 +288,6 @@ gst_queue_chain (GstPad *pad, GstBuffer *buf) queue = GST_QUEUE (GST_OBJECT_PARENT (pad)); - reader = FALSE; restart: /* we have to lock the queue since we span threads */ GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "locking t:%ld\n", pthread_self ()); @@ -301,7 +305,7 @@ restart: GST_ELEMENT_NAME (queue), queue->level_buffers); break; default: - gst_pad_event_default (pad, GST_EVENT (buf)); + //gst_pad_event_default (pad, GST_EVENT (buf)); break; } } @@ -327,7 +331,7 @@ restart: } /* otherwise we have to push a buffer off the other end */ else { - GSList *front; + GList *front; GstBuffer *leakbuf; GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "queue is full, leaking buffer on downstream end\n"); front = queue->queue; @@ -339,8 +343,8 @@ restart: queue->level_buffers--; queue->level_bytes -= GST_BUFFER_SIZE(leakbuf); gst_buffer_unref(leakbuf); - queue->queue = g_slist_remove_link (queue->queue, front); - g_slist_free (front); + queue->queue = g_list_remove_link (queue->queue, front); + g_list_free (front); } } @@ -383,14 +387,19 @@ restart: queue->level_buffers, queue->size_buffers); } + GST_BUFFER_OFFSET (buf) = queue->count++; /* put the buffer on the tail of the list */ - queue->queue = g_slist_append (queue->queue, buf); + queue->queue = g_list_append (queue->queue, buf); queue->level_buffers++; queue->level_bytes += GST_BUFFER_SIZE(buf); + GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "(%s:%s)+ level:%d/%d\n", GST_DEBUG_PAD_NAME(pad), queue->level_buffers, queue->size_buffers); + /* this assertion _has_ to hold */ + g_assert (g_list_length (queue->queue) == queue->level_buffers); + /* reader waiting on an empty queue */ reader = queue->reader; @@ -408,7 +417,7 @@ gst_queue_get (GstPad *pad) { GstQueue *queue; GstBuffer *buf = NULL; - GSList *front; + GList *front; gboolean writer; g_assert(pad != NULL); @@ -418,7 +427,6 @@ gst_queue_get (GstPad *pad) queue = GST_QUEUE (GST_OBJECT_PARENT (pad)); - writer = FALSE; restart: /* have to lock for thread-safety */ GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "locking t:%ld\n", pthread_self ()); @@ -462,15 +470,19 @@ restart: front = queue->queue; buf = (GstBuffer *)(front->data); GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "retrieved buffer %p from queue\n", buf); - queue->queue = g_slist_remove_link (queue->queue, front); - g_slist_free (front); + queue->queue = g_list_remove_link (queue->queue, front); + g_list_free (front); queue->level_buffers--; queue->level_bytes -= GST_BUFFER_SIZE(buf); + GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "(%s:%s)- level:%d/%d\n", GST_DEBUG_PAD_NAME(pad), queue->level_buffers, queue->size_buffers); + /* this assertion _has_ to hold */ + g_assert (g_list_length (queue->queue) == queue->level_buffers); + /* writer waiting on a full queue */ writer = queue->writer; @@ -518,8 +530,8 @@ gst_queue_change_state (GstElement *element) new_state = GST_STATE_PENDING (element); if (new_state == GST_STATE_PAUSED) { - g_cond_signal (queue->not_full); - g_cond_signal (queue->not_empty); + //g_cond_signal (queue->not_full); + //g_cond_signal (queue->not_empty); } else if (new_state == GST_STATE_READY) { gst_queue_locked_flush (queue); -- 2.7.4