dtlsenc: Use a GQueue instead of a GPtrArray

Using a GPtrArray as a queue is not very efficient as the whole
array has to be copied whenever an element is removed from the
beginning.
This commit is contained in:
Sebastian Dröge 2015-03-18 13:52:38 +01:00
parent 47b73f0d52
commit 3614302cf8
2 changed files with 12 additions and 15 deletions

View file

@ -186,8 +186,7 @@ gst_dtls_enc_init (GstDtlsEnc * self)
self->srtp_cipher = DEFAULT_SRTP_CIPHER;
self->srtp_auth = DEFAULT_SRTP_AUTH;
self->queue = g_ptr_array_sized_new (INITIAL_QUEUE_SIZE);
g_queue_init (&self->queue);
g_mutex_init (&self->queue_lock);
g_cond_init (&self->queue_cond_add);
@ -211,11 +210,8 @@ gst_dtls_enc_finalize (GObject * object)
}
g_mutex_lock (&self->queue_lock);
g_ptr_array_set_free_func (self->queue, (GDestroyNotify) gst_buffer_unref);
g_ptr_array_unref (self->queue);
self->queue = NULL;
g_queue_foreach (&self->queue, (GFunc) gst_buffer_unref, NULL);
g_queue_clear (&self->queue);
g_mutex_unlock (&self->queue_lock);
g_mutex_clear (&self->queue_lock);
@ -412,7 +408,7 @@ src_task_loop (GstPad * pad)
return;
}
while (!self->queue->len) {
while (g_queue_is_empty (&self->queue)) {
GST_TRACE_OBJECT (self, "src loop: queue empty, waiting for add");
g_cond_wait (&self->queue_cond_add, &self->queue_lock);
GST_TRACE_OBJECT (self, "src loop: add signaled");
@ -434,11 +430,16 @@ src_task_loop (GstPad * pad)
GstBuffer *buffer;
gboolean start_connection_timeout = FALSE;
buffer = g_queue_pop_head (&self->queue);
g_mutex_unlock (&self->queue_lock);
if (self->send_initial_events) {
GstSegment segment;
gchar s_id[32];
GstCaps *caps;
self->send_initial_events = FALSE;
g_snprintf (s_id, sizeof (s_id), "dtlsenc-%08x", g_random_int ());
gst_pad_push_event (self->src, gst_event_new_stream_start (s_id));
caps = gst_caps_new_empty_simple ("application/x-dtls");
@ -446,14 +447,10 @@ src_task_loop (GstPad * pad)
gst_caps_unref (caps);
gst_segment_init (&segment, GST_FORMAT_BYTES);
gst_pad_push_event (self->src, gst_event_new_segment (&segment));
self->send_initial_events = FALSE;
start_connection_timeout = TRUE;
}
buffer = g_ptr_array_remove_index (self->queue, 0);
GST_TRACE_OBJECT (self, "src loop: releasing lock");
g_mutex_unlock (&self->queue_lock);
ret = gst_pad_push (self->src, buffer);
if (start_connection_timeout)
@ -464,9 +461,9 @@ src_task_loop (GstPad * pad)
gst_flow_get_name (ret));
}
} else {
g_mutex_unlock (&self->queue_lock);
g_warn_if_reached ();
GST_TRACE_OBJECT (self, "src loop: releasing lock");
g_mutex_unlock (&self->queue_lock);
}
}
@ -536,7 +533,7 @@ on_send_data (GstDtlsConnection * connection, gconstpointer data, gint length,
g_mutex_lock (&self->queue_lock);
GST_TRACE_OBJECT (self, "send data: acquired lock");
g_ptr_array_add (self->queue, buffer);
g_queue_push_tail (&self->queue, buffer);
GST_TRACE_OBJECT (self, "send data: signaling add");
g_cond_signal (&self->queue_cond_add);

View file

@ -47,7 +47,7 @@ struct _GstDtlsEnc {
GstPad *src;
GPtrArray *queue;
GQueue queue;
GMutex queue_lock;
GCond queue_cond_add;