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
This commit is contained in:
Wim Taymans 2001-12-29 03:02:14 +00:00
parent 27d784dc03
commit 893c03f784
2 changed files with 52 additions and 28 deletions

View file

@ -181,7 +181,9 @@ gst_queue_init (GstQueue *queue)
gst_element_add_pad (GST_ELEMENT (queue), queue->srcpad); gst_element_add_pad (GST_ELEMENT (queue), queue->srcpad);
gst_pad_set_negotiate_function (queue->srcpad, GST_DEBUG_FUNCPTR(gst_queue_handle_negotiate_src)); 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->queue = NULL;
queue->count = 0;
queue->level_buffers = 0; queue->level_buffers = 0;
queue->level_bytes = 0; queue->level_bytes = 0;
queue->level_time = 0LL; queue->level_time = 0LL;
@ -248,14 +250,17 @@ gst_queue_cleanup_buffers (gpointer data, const gpointer user_data)
if (GST_IS_BUFFER (data)) { if (GST_IS_BUFFER (data)) {
gst_buffer_unref (GST_BUFFER (data)); gst_buffer_unref (GST_BUFFER (data));
} }
else {
gst_event_free (GST_EVENT (data));
}
} }
static void static void
gst_queue_locked_flush (GstQueue *queue) 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); (gpointer) queue);
g_slist_free (queue->queue); g_list_free (queue->queue);
queue->queue = NULL; queue->queue = NULL;
queue->level_buffers = 0; queue->level_buffers = 0;
@ -283,7 +288,6 @@ gst_queue_chain (GstPad *pad, GstBuffer *buf)
queue = GST_QUEUE (GST_OBJECT_PARENT (pad)); queue = GST_QUEUE (GST_OBJECT_PARENT (pad));
reader = FALSE;
restart: restart:
/* we have to lock the queue since we span threads */ /* we have to lock the queue since we span threads */
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "locking t:%ld\n", pthread_self ()); 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); GST_ELEMENT_NAME (queue), queue->level_buffers);
break; break;
default: default:
gst_pad_event_default (pad, GST_EVENT (buf)); //gst_pad_event_default (pad, GST_EVENT (buf));
break; break;
} }
} }
@ -327,7 +331,7 @@ restart:
} }
/* otherwise we have to push a buffer off the other end */ /* otherwise we have to push a buffer off the other end */
else { else {
GSList *front; GList *front;
GstBuffer *leakbuf; GstBuffer *leakbuf;
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "queue is full, leaking buffer on downstream end\n"); GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "queue is full, leaking buffer on downstream end\n");
front = queue->queue; front = queue->queue;
@ -339,8 +343,8 @@ restart:
queue->level_buffers--; queue->level_buffers--;
queue->level_bytes -= GST_BUFFER_SIZE(leakbuf); queue->level_bytes -= GST_BUFFER_SIZE(leakbuf);
gst_buffer_unref(leakbuf); gst_buffer_unref(leakbuf);
queue->queue = g_slist_remove_link (queue->queue, front); queue->queue = g_list_remove_link (queue->queue, front);
g_slist_free (front); g_list_free (front);
} }
} }
@ -383,14 +387,19 @@ restart:
queue->level_buffers, queue->size_buffers); queue->level_buffers, queue->size_buffers);
} }
GST_BUFFER_OFFSET (buf) = queue->count++;
/* put the buffer on the tail of the list */ /* 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_buffers++;
queue->level_bytes += GST_BUFFER_SIZE(buf); queue->level_bytes += GST_BUFFER_SIZE(buf);
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "(%s:%s)+ level:%d/%d\n", GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "(%s:%s)+ level:%d/%d\n",
GST_DEBUG_PAD_NAME(pad), GST_DEBUG_PAD_NAME(pad),
queue->level_buffers, queue->size_buffers); 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 waiting on an empty queue */
reader = queue->reader; reader = queue->reader;
@ -408,7 +417,7 @@ gst_queue_get (GstPad *pad)
{ {
GstQueue *queue; GstQueue *queue;
GstBuffer *buf = NULL; GstBuffer *buf = NULL;
GSList *front; GList *front;
gboolean writer; gboolean writer;
g_assert(pad != NULL); g_assert(pad != NULL);
@ -418,7 +427,6 @@ gst_queue_get (GstPad *pad)
queue = GST_QUEUE (GST_OBJECT_PARENT (pad)); queue = GST_QUEUE (GST_OBJECT_PARENT (pad));
writer = FALSE;
restart: restart:
/* have to lock for thread-safety */ /* have to lock for thread-safety */
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "locking t:%ld\n", pthread_self ()); GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "locking t:%ld\n", pthread_self ());
@ -462,15 +470,19 @@ restart:
front = queue->queue; front = queue->queue;
buf = (GstBuffer *)(front->data); buf = (GstBuffer *)(front->data);
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "retrieved buffer %p from queue\n", buf); GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "retrieved buffer %p from queue\n", buf);
queue->queue = g_slist_remove_link (queue->queue, front); queue->queue = g_list_remove_link (queue->queue, front);
g_slist_free (front); g_list_free (front);
queue->level_buffers--; queue->level_buffers--;
queue->level_bytes -= GST_BUFFER_SIZE(buf); queue->level_bytes -= GST_BUFFER_SIZE(buf);
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "(%s:%s)- level:%d/%d\n", GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "(%s:%s)- level:%d/%d\n",
GST_DEBUG_PAD_NAME(pad), GST_DEBUG_PAD_NAME(pad),
queue->level_buffers, queue->size_buffers); 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 waiting on a full queue */
writer = queue->writer; writer = queue->writer;
@ -518,8 +530,8 @@ gst_queue_change_state (GstElement *element)
new_state = GST_STATE_PENDING (element); new_state = GST_STATE_PENDING (element);
if (new_state == GST_STATE_PAUSED) { if (new_state == GST_STATE_PAUSED) {
g_cond_signal (queue->not_full); //g_cond_signal (queue->not_full);
g_cond_signal (queue->not_empty); //g_cond_signal (queue->not_empty);
} }
else if (new_state == GST_STATE_READY) { else if (new_state == GST_STATE_READY) {
gst_queue_locked_flush (queue); gst_queue_locked_flush (queue);

View file

@ -181,7 +181,9 @@ gst_queue_init (GstQueue *queue)
gst_element_add_pad (GST_ELEMENT (queue), queue->srcpad); gst_element_add_pad (GST_ELEMENT (queue), queue->srcpad);
gst_pad_set_negotiate_function (queue->srcpad, GST_DEBUG_FUNCPTR(gst_queue_handle_negotiate_src)); 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->queue = NULL;
queue->count = 0;
queue->level_buffers = 0; queue->level_buffers = 0;
queue->level_bytes = 0; queue->level_bytes = 0;
queue->level_time = 0LL; queue->level_time = 0LL;
@ -248,14 +250,17 @@ gst_queue_cleanup_buffers (gpointer data, const gpointer user_data)
if (GST_IS_BUFFER (data)) { if (GST_IS_BUFFER (data)) {
gst_buffer_unref (GST_BUFFER (data)); gst_buffer_unref (GST_BUFFER (data));
} }
else {
gst_event_free (GST_EVENT (data));
}
} }
static void static void
gst_queue_locked_flush (GstQueue *queue) 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); (gpointer) queue);
g_slist_free (queue->queue); g_list_free (queue->queue);
queue->queue = NULL; queue->queue = NULL;
queue->level_buffers = 0; queue->level_buffers = 0;
@ -283,7 +288,6 @@ gst_queue_chain (GstPad *pad, GstBuffer *buf)
queue = GST_QUEUE (GST_OBJECT_PARENT (pad)); queue = GST_QUEUE (GST_OBJECT_PARENT (pad));
reader = FALSE;
restart: restart:
/* we have to lock the queue since we span threads */ /* we have to lock the queue since we span threads */
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "locking t:%ld\n", pthread_self ()); 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); GST_ELEMENT_NAME (queue), queue->level_buffers);
break; break;
default: default:
gst_pad_event_default (pad, GST_EVENT (buf)); //gst_pad_event_default (pad, GST_EVENT (buf));
break; break;
} }
} }
@ -327,7 +331,7 @@ restart:
} }
/* otherwise we have to push a buffer off the other end */ /* otherwise we have to push a buffer off the other end */
else { else {
GSList *front; GList *front;
GstBuffer *leakbuf; GstBuffer *leakbuf;
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "queue is full, leaking buffer on downstream end\n"); GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "queue is full, leaking buffer on downstream end\n");
front = queue->queue; front = queue->queue;
@ -339,8 +343,8 @@ restart:
queue->level_buffers--; queue->level_buffers--;
queue->level_bytes -= GST_BUFFER_SIZE(leakbuf); queue->level_bytes -= GST_BUFFER_SIZE(leakbuf);
gst_buffer_unref(leakbuf); gst_buffer_unref(leakbuf);
queue->queue = g_slist_remove_link (queue->queue, front); queue->queue = g_list_remove_link (queue->queue, front);
g_slist_free (front); g_list_free (front);
} }
} }
@ -383,14 +387,19 @@ restart:
queue->level_buffers, queue->size_buffers); queue->level_buffers, queue->size_buffers);
} }
GST_BUFFER_OFFSET (buf) = queue->count++;
/* put the buffer on the tail of the list */ /* 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_buffers++;
queue->level_bytes += GST_BUFFER_SIZE(buf); queue->level_bytes += GST_BUFFER_SIZE(buf);
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "(%s:%s)+ level:%d/%d\n", GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "(%s:%s)+ level:%d/%d\n",
GST_DEBUG_PAD_NAME(pad), GST_DEBUG_PAD_NAME(pad),
queue->level_buffers, queue->size_buffers); 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 waiting on an empty queue */
reader = queue->reader; reader = queue->reader;
@ -408,7 +417,7 @@ gst_queue_get (GstPad *pad)
{ {
GstQueue *queue; GstQueue *queue;
GstBuffer *buf = NULL; GstBuffer *buf = NULL;
GSList *front; GList *front;
gboolean writer; gboolean writer;
g_assert(pad != NULL); g_assert(pad != NULL);
@ -418,7 +427,6 @@ gst_queue_get (GstPad *pad)
queue = GST_QUEUE (GST_OBJECT_PARENT (pad)); queue = GST_QUEUE (GST_OBJECT_PARENT (pad));
writer = FALSE;
restart: restart:
/* have to lock for thread-safety */ /* have to lock for thread-safety */
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "locking t:%ld\n", pthread_self ()); GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "locking t:%ld\n", pthread_self ());
@ -462,15 +470,19 @@ restart:
front = queue->queue; front = queue->queue;
buf = (GstBuffer *)(front->data); buf = (GstBuffer *)(front->data);
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "retrieved buffer %p from queue\n", buf); GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "retrieved buffer %p from queue\n", buf);
queue->queue = g_slist_remove_link (queue->queue, front); queue->queue = g_list_remove_link (queue->queue, front);
g_slist_free (front); g_list_free (front);
queue->level_buffers--; queue->level_buffers--;
queue->level_bytes -= GST_BUFFER_SIZE(buf); queue->level_bytes -= GST_BUFFER_SIZE(buf);
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "(%s:%s)- level:%d/%d\n", GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "(%s:%s)- level:%d/%d\n",
GST_DEBUG_PAD_NAME(pad), GST_DEBUG_PAD_NAME(pad),
queue->level_buffers, queue->size_buffers); 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 waiting on a full queue */
writer = queue->writer; writer = queue->writer;
@ -518,8 +530,8 @@ gst_queue_change_state (GstElement *element)
new_state = GST_STATE_PENDING (element); new_state = GST_STATE_PENDING (element);
if (new_state == GST_STATE_PAUSED) { if (new_state == GST_STATE_PAUSED) {
g_cond_signal (queue->not_full); //g_cond_signal (queue->not_full);
g_cond_signal (queue->not_empty); //g_cond_signal (queue->not_empty);
} }
else if (new_state == GST_STATE_READY) { else if (new_state == GST_STATE_READY) {
gst_queue_locked_flush (queue); gst_queue_locked_flush (queue);