diff --git a/ChangeLog b/ChangeLog index 777a4ae92a..9203de4d6d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,16 @@ 2005-02-21 Andy Wingo + * gst/gstpad.c (gst_real_pad_dispose): Free the stream lock (it + wasn't being freed before). + (gst_real_pad_init): Allocate and initialize the stream lock. + + * gst/gstpad.h (GstRealPad): Change the stream lock to be + recursive, so that if an event comes while a loop-based sink is + pulling, the stream lock can be had by both the sink's loop + function and the sink's event function. + (GST_STREAM_GET_LOCK, GST_STREAM_LOCK, GST_STREAM_TRYLOCK) + (GST_STREAM_UNLOCK): Updated accordingly. + * gst/gstmessage.h (GstMessageType): Turned into flags. Added GST_MESSAGE_ANY as an OR of all flags. (GST_MESSAGE_PARSE_STATE_CHANGED): New terrible macro. Will be diff --git a/gst/gstpad.c b/gst/gstpad.c index 6381d663a0..d1136b61aa 100644 --- a/gst/gstpad.c +++ b/gst/gstpad.c @@ -254,8 +254,8 @@ gst_real_pad_init (GstRealPad * pad) GST_FLAG_UNSET (pad, GST_PAD_ACTIVE); - pad->stream_lock = g_mutex_new (); - pad->stream_cond = g_cond_new (); + pad->stream_rec_lock = g_new (GStaticRecMutex, 1); + g_static_rec_mutex_init (pad->stream_rec_lock); pad->block_cond = g_cond_new (); @@ -2494,7 +2494,11 @@ not_negotiated: static void gst_real_pad_dispose (GObject * object) { - GstPad *pad = GST_PAD (object); + GstPad *pad; + GstRealPad *rpad; + + pad = GST_PAD (object); + rpad = GST_REAL_PAD (object); /* No linked pad can ever be disposed. * It has to have a parent to be linked @@ -2508,10 +2512,10 @@ gst_real_pad_dispose (GObject * object) GST_DEBUG_PAD_NAME (pad)); /* we destroy the ghostpads, because they are nothing without the real pad */ - if (GST_REAL_PAD (pad)->ghostpads) { + if (rpad->ghostpads) { GList *orig, *ghostpads; - orig = ghostpads = g_list_copy (GST_REAL_PAD (pad)->ghostpads); + orig = ghostpads = g_list_copy (rpad->ghostpads); while (ghostpads) { GstPad *ghostpad = GST_PAD (ghostpads->data); @@ -2532,7 +2536,12 @@ gst_real_pad_dispose (GObject * object) g_list_free (orig); /* as the ghost pads are removed, they remove themselves from ->ghostpads. So it should be empty now. Let's assert that. */ - g_assert (GST_REAL_PAD (pad)->ghostpads == NULL); + g_assert (rpad->ghostpads == NULL); + } + + if (rpad->stream_rec_lock) { + g_static_rec_mutex_free (rpad->stream_rec_lock); + rpad->stream_rec_lock = NULL; } /* clear the caps */ diff --git a/gst/gstpad.h b/gst/gstpad.h index cfc8c9c9db..9f81e80241 100644 --- a/gst/gstpad.h +++ b/gst/gstpad.h @@ -204,9 +204,8 @@ struct _GstRealPad { GstPadDirection direction; /*< public >*/ /* with STREAM_LOCK */ - /* streaming lock and cond */ - GMutex *stream_lock; - GCond *stream_cond; + /* streaming rec_lock */ + GStaticRecMutex *stream_rec_lock; GstTask *task; /*< public >*/ /* with LOCK */ @@ -331,11 +330,10 @@ struct _GstGhostPadClass { #define GST_RPAD_IS_SRC(pad) (GST_RPAD_DIRECTION(pad) == GST_PAD_SRC) #define GST_RPAD_IS_SINK(pad) (GST_RPAD_DIRECTION(pad) == GST_PAD_SINK) -#define GST_STREAM_GET_LOCK(pad) (GST_PAD_REALIZE(pad)->stream_lock) -#define GST_STREAM_LOCK(pad) (g_mutex_lock(GST_STREAM_GET_LOCK(pad))) -#define GST_STREAM_TRYLOCK(pad) (g_mutex_trylock(GST_STREAM_GET_LOCK(pad))) -#define GST_STREAM_UNLOCK(pad) (g_mutex_unlock(GST_STREAM_GET_LOCK(pad))) -#define GST_STREAM_GET_COND(pad) (GST_PAD_REALIZE(pad)->stream_cond) +#define GST_STREAM_GET_LOCK(pad) (GST_PAD_REALIZE(pad)->stream_rec_lock) +#define GST_STREAM_LOCK(pad) (g_static_rec_mutex_lock(GST_STREAM_GET_LOCK(pad))) +#define GST_STREAM_TRYLOCK(pad) (g_static_rec_mutex_trylock(GST_STREAM_GET_LOCK(pad))) +#define GST_STREAM_UNLOCK(pad) (g_static_rec_mutex_unlock(GST_STREAM_GET_LOCK(pad))) #define GST_PAD_BLOCK_GET_COND(pad) (GST_PAD_REALIZE(pad)->block_cond) #define GST_PAD_BLOCK_WAIT(pad) (g_cond_wait(GST_PAD_BLOCK_GET_COND (pad), GST_GET_LOCK (pad)))