ahcsrc: fix deadlock when flushing
authorGeorge Kiagiadakis <george.kiagiadakis@collabora.com>
Mon, 7 Dec 2015 13:31:40 +0000 (14:31 +0100)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 21 Jan 2016 18:49:18 +0000 (13:49 -0500)
_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!

sys/androidmedia/gstahcsrc.c

index d67ea03aea7774561df4c9bc52fced54c282d75e..127060036aa65c095d62bb4d8ab9e91b505dcd06 100644 (file)
@@ -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