summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorGeorge Kiagiadakis <george.kiagiadakis@collabora.com>2015-12-07 14:31:40 +0100
committerNicolas Dufresne <nicolas.dufresne@collabora.com>2016-01-21 13:49:18 -0500
commit9a53d798765b54ff8e9e5acb25b13d4a3bc22edf (patch)
treef5fa71b46efded76ee29df5c44ff482356d94ca4 /sys
parentf1809c4d938b6d7aebe1a8601930f3e057a629ba (diff)
downloadgstreamer-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.c14
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