gst/selector/gstinputselector.c: Do g_object_notify() only when not holding the lock to get the property because othe...

Original commit message from CVS:
* gst/selector/gstinputselector.c:
(gst_input_selector_set_active_pad), (gst_input_selector_switch):
Do g_object_notify() only when not holding the lock to get the property
because otherwise we run into a deadlock with the deep-notify handlers
that are possibly installed.
This commit is contained in:
Wim Taymans 2008-03-20 18:10:29 +00:00
parent 1cb3f3903b
commit 29d918352b
2 changed files with 20 additions and 5 deletions

View file

@ -1,3 +1,11 @@
2008-03-20 Wim Taymans <wim.taymans@collabora.co.uk>
* gst/selector/gstinputselector.c:
(gst_input_selector_set_active_pad), (gst_input_selector_switch):
Do g_object_notify() only when not holding the lock to get the property
because otherwise we run into a deadlock with the deep-notify handlers
that are possibly installed.
2008-03-20 Wim Taymans <wim.taymans@collabora.co.uk> 2008-03-20 Wim Taymans <wim.taymans@collabora.co.uk>
* gst/selector/gstinputselector.c: (gst_selector_pad_class_init), * gst/selector/gstinputselector.c: (gst_selector_pad_class_init),

View file

@ -877,8 +877,9 @@ gst_segment_set_start (GstSegment * segment, gint64 running_time)
segment->start += duration; segment->start += duration;
} }
/* this function must be called with the SELECTOR_LOCK. */ /* this function must be called with the SELECTOR_LOCK. It returns TRUE when the
static void * active pad changed. */
static gboolean
gst_input_selector_set_active_pad (GstInputSelector * self, gst_input_selector_set_active_pad (GstInputSelector * self,
GstPad * pad, gint64 stop_time, gint64 start_time) GstPad * pad, gint64 stop_time, gint64 start_time)
{ {
@ -886,7 +887,7 @@ gst_input_selector_set_active_pad (GstInputSelector * self,
GstPad **active_pad_p; GstPad **active_pad_p;
if (pad == self->active_sinkpad) if (pad == self->active_sinkpad)
return; return FALSE;
old = GST_SELECTOR_PAD_CAST (self->active_sinkpad); old = GST_SELECTOR_PAD_CAST (self->active_sinkpad);
new = GST_SELECTOR_PAD_CAST (pad); new = GST_SELECTOR_PAD_CAST (pad);
@ -925,7 +926,7 @@ gst_input_selector_set_active_pad (GstInputSelector * self,
GST_DEBUG_OBJECT (self, "New active pad is %" GST_PTR_FORMAT, GST_DEBUG_OBJECT (self, "New active pad is %" GST_PTR_FORMAT,
self->active_sinkpad); self->active_sinkpad);
g_object_notify (G_OBJECT (self), "active-pad"); return TRUE;
} }
static void static void
@ -1213,14 +1214,20 @@ static void
gst_input_selector_switch (GstInputSelector * self, GstPad * pad, gst_input_selector_switch (GstInputSelector * self, GstPad * pad,
gint64 stop_time, gint64 start_time) gint64 stop_time, gint64 start_time)
{ {
gboolean changed;
g_return_if_fail (self->blocked == TRUE); g_return_if_fail (self->blocked == TRUE);
GST_INPUT_SELECTOR_LOCK (self); GST_INPUT_SELECTOR_LOCK (self);
changed =
gst_input_selector_set_active_pad (self, pad, stop_time, start_time); gst_input_selector_set_active_pad (self, pad, stop_time, start_time);
self->blocked = FALSE; self->blocked = FALSE;
GST_INPUT_SELECTOR_BROADCAST (self); GST_INPUT_SELECTOR_BROADCAST (self);
GST_INPUT_SELECTOR_UNLOCK (self); GST_INPUT_SELECTOR_UNLOCK (self);
if (changed)
g_object_notify (G_OBJECT (self), "active-pad");
} }
static gboolean static gboolean