[MOVED FROM BAD 22/29] shapewipe: Fix race condition during shutdown that can lead...
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Mon, 8 Feb 2010 07:12:11 +0000 (08:12 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Fri, 12 Feb 2010 10:12:34 +0000 (11:12 +0100)
gst/shapewipe/gstshapewipe.c
gst/shapewipe/gstshapewipe.h

index 7c512df..b8e4040 100644 (file)
@@ -917,13 +917,18 @@ gst_shape_wipe_video_sink_chain (GstPad * pad, GstBuffer * buffer)
       GST_TIME_ARGS (timestamp), self->mask_position);
 
   g_mutex_lock (self->mask_mutex);
+  if (self->shutdown) {
+    gst_buffer_unref (buffer);
+    return GST_FLOW_WRONG_STATE;
+  }
+
   if (!self->mask)
     g_cond_wait (self->mask_cond, self->mask_mutex);
 
   if (self->mask == NULL) {
     g_mutex_unlock (self->mask_mutex);
     gst_buffer_unref (buffer);
-    return GST_FLOW_UNEXPECTED;
+    return GST_FLOW_WRONG_STATE;
   } else {
     mask = gst_buffer_ref (self->mask);
   }
@@ -1007,14 +1012,19 @@ gst_shape_wipe_change_state (GstElement * element, GstStateChange transition)
 
   switch (transition) {
     case GST_STATE_CHANGE_READY_TO_PAUSED:
+      self->shutdown = FALSE;
+      break;
+    case GST_STATE_CHANGE_PAUSED_TO_READY:
+      /* Unblock video sink chain function */
+      g_mutex_lock (self->mask_mutex);
+      self->shutdown = TRUE;
+      g_cond_signal (self->mask_cond);
+      g_mutex_unlock (self->mask_mutex);
+      break;
     default:
       break;
   }
 
-  /* Unblock video sink chain function */
-  if (transition == GST_STATE_CHANGE_PAUSED_TO_READY)
-    g_cond_signal (self->mask_cond);
-
   if (GST_ELEMENT_CLASS (parent_class)->change_state)
     ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
 
index 251a045..36b4fc5 100644 (file)
@@ -62,6 +62,8 @@ struct _GstShapeWipe
   GstVideoFormat fmt;
   gint width, height;
 
+  gboolean shutdown;
+
   gdouble proportion;
   GstClockTime earliest_time;
   GstClockTime frame_duration;