diff options
author | George Kiagiadakis <george.kiagiadakis@collabora.com> | 2015-12-07 14:31:40 +0100 |
---|---|---|
committer | Nicolas Dufresne <nicolas.dufresne@collabora.com> | 2016-01-21 13:49:18 -0500 |
commit | 9a53d798765b54ff8e9e5acb25b13d4a3bc22edf (patch) | |
tree | f5fa71b46efded76ee29df5c44ff482356d94ca4 /sys | |
parent | f1809c4d938b6d7aebe1a8601930f3e057a629ba (diff) | |
download | gstreamer-plugins-bad-9a53d798765b54ff8e9e5acb25b13d4a3bc22edf.tar.gz |
ahcsrc: fix deadlock when flushing
_data_queue_item_free() calls gst_buffer_unref(), which
calls gst_ahc_src_buffer_free_func(), which calls
g_mutex_lock() on self->mutex and there you go... deadlock!
Diffstat (limited to 'sys')
-rw-r--r-- | sys/androidmedia/gstahcsrc.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/sys/androidmedia/gstahcsrc.c b/sys/androidmedia/gstahcsrc.c index d67ea03ae..127060036 100644 --- a/sys/androidmedia/gstahcsrc.c +++ b/sys/androidmedia/gstahcsrc.c @@ -2255,7 +2255,7 @@ gst_ahc_src_on_preview_frame (jbyteArray array, gpointer user_data) GstClockTime timestamp = GST_CLOCK_TIME_NONE; GstClockTime duration = 0; GstClock *clock; - + gboolean queued = FALSE; g_mutex_lock (&self->mutex); @@ -2315,14 +2315,16 @@ gst_ahc_src_on_preview_frame (jbyteArray array, gpointer user_data) GST_DEBUG_OBJECT (self, "wrapping jni array %p->%p %p->%p", item, item->object, malloc_data, malloc_data->array); - if (!gst_data_queue_push (self->queue, item)) { - GST_INFO_OBJECT (self, "can't add buffer to queue"); - /* Can't add buffer to queue. Must be flushing. */ - _data_queue_item_free (item); - } + queued = gst_data_queue_push (self->queue, item); done: g_mutex_unlock (&self->mutex); + + if (item && !queued) { + GST_INFO_OBJECT (self, "could not add buffer to queue"); + /* Can't add buffer to queue. Must be flushing. */ + _data_queue_item_free (item); + } } static void |