From 125efbffcc72e53bad3921d0e60b92c4e0f67859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sat, 27 Feb 2010 19:08:49 +0100 Subject: [PATCH] frei0r: Protect set/get property and processing functions from concurrent access The frei0r documentation says that these functions must not be called on the same instance from different threads at the same time. All other functions are guaranteed to be threadsafe. --- gst/frei0r/gstfrei0rfilter.c | 8 +++++++- gst/frei0r/gstfrei0rmixer.c | 6 ++++++ gst/frei0r/gstfrei0rsrc.c | 6 ++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gst/frei0r/gstfrei0rfilter.c b/gst/frei0r/gstfrei0rfilter.c index eda78adf84..fc60a9034f 100644 --- a/gst/frei0r/gstfrei0rfilter.c +++ b/gst/frei0r/gstfrei0rfilter.c @@ -1,5 +1,5 @@ /* GStreamer - * Copyright (C) 2009 Sebastian Dröge + * Copyright (C) 2009,2010 Sebastian Dröge * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -85,6 +85,7 @@ gst_frei0r_filter_transform (GstBaseTransform * trans, GstBuffer * inbuf, time = ((gdouble) GST_BUFFER_TIMESTAMP (inbuf)) / GST_SECOND; + GST_OBJECT_LOCK (self); if (klass->ftable->update2) klass->ftable->update2 (self->f0r_instance, time, (const guint32 *) GST_BUFFER_DATA (inbuf), NULL, NULL, @@ -93,6 +94,7 @@ gst_frei0r_filter_transform (GstBaseTransform * trans, GstBuffer * inbuf, klass->ftable->update (self->f0r_instance, time, (const guint32 *) GST_BUFFER_DATA (inbuf), (guint32 *) GST_BUFFER_DATA (outbuf)); + GST_OBJECT_UNLOCK (self); return GST_FLOW_OK; } @@ -123,10 +125,12 @@ gst_frei0r_filter_get_property (GObject * object, guint prop_id, GValue * value, GstFrei0rFilter *self = GST_FREI0R_FILTER (object); GstFrei0rFilterClass *klass = GST_FREI0R_FILTER_GET_CLASS (object); + GST_OBJECT_LOCK (self); if (!gst_frei0r_get_property (self->f0r_instance, klass->ftable, klass->properties, klass->n_properties, self->property_cache, prop_id, value)) G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + GST_OBJECT_UNLOCK (self); } static void @@ -136,10 +140,12 @@ gst_frei0r_filter_set_property (GObject * object, guint prop_id, GstFrei0rFilter *self = GST_FREI0R_FILTER (object); GstFrei0rFilterClass *klass = GST_FREI0R_FILTER_GET_CLASS (object); + GST_OBJECT_LOCK (self); if (!gst_frei0r_set_property (self->f0r_instance, klass->ftable, klass->properties, klass->n_properties, self->property_cache, prop_id, value)) G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + GST_OBJECT_UNLOCK (self); } static void diff --git a/gst/frei0r/gstfrei0rmixer.c b/gst/frei0r/gstfrei0rmixer.c index cd315e185d..486e96e45e 100644 --- a/gst/frei0r/gstfrei0rmixer.c +++ b/gst/frei0r/gstfrei0rmixer.c @@ -84,10 +84,12 @@ gst_frei0r_mixer_get_property (GObject * object, guint prop_id, GValue * value, GstFrei0rMixer *self = GST_FREI0R_MIXER (object); GstFrei0rMixerClass *klass = GST_FREI0R_MIXER_GET_CLASS (object); + GST_OBJECT_LOCK (self); if (!gst_frei0r_get_property (self->f0r_instance, klass->ftable, klass->properties, klass->n_properties, self->property_cache, prop_id, value)) G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + GST_OBJECT_UNLOCK (self); } static void @@ -97,10 +99,12 @@ gst_frei0r_mixer_set_property (GObject * object, guint prop_id, GstFrei0rMixer *self = GST_FREI0R_MIXER (object); GstFrei0rMixerClass *klass = GST_FREI0R_MIXER_GET_CLASS (object); + GST_OBJECT_LOCK (self); if (!gst_frei0r_set_property (self->f0r_instance, klass->ftable, klass->properties, klass->n_properties, self->property_cache, prop_id, value)) G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + GST_OBJECT_UNLOCK (self); } static GstStateChangeReturn @@ -584,11 +588,13 @@ gst_frei0r_mixer_collected (GstCollectPads * pads, GstFrei0rMixer * self) GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS); time = ((gdouble) GST_BUFFER_TIMESTAMP (outbuf)) / GST_SECOND; + GST_OBJECT_LOCK (self); klass->ftable->update2 (self->f0r_instance, time, (const guint32 *) GST_BUFFER_DATA (inbuf0), (const guint32 *) GST_BUFFER_DATA (inbuf1), (inbuf2) ? (const guint32 *) GST_BUFFER_DATA (inbuf2) : NULL, (guint32 *) GST_BUFFER_DATA (outbuf)); + GST_OBJECT_UNLOCK (self); gst_buffer_unref (inbuf0); gst_buffer_unref (inbuf1); diff --git a/gst/frei0r/gstfrei0rsrc.c b/gst/frei0r/gstfrei0rsrc.c index 2d637f95b0..69b905b0f0 100644 --- a/gst/frei0r/gstfrei0rsrc.c +++ b/gst/frei0r/gstfrei0rsrc.c @@ -113,12 +113,14 @@ gst_frei0r_src_create (GstPushSrc * src, GstBuffer ** buf) time = ((gdouble) GST_BUFFER_TIMESTAMP (outbuf)) / GST_SECOND; + GST_OBJECT_LOCK (self); if (klass->ftable->update2) klass->ftable->update2 (self->f0r_instance, time, NULL, NULL, NULL, (guint32 *) GST_BUFFER_DATA (outbuf)); else klass->ftable->update (self->f0r_instance, time, NULL, (guint32 *) GST_BUFFER_DATA (outbuf)); + GST_OBJECT_UNLOCK (self); *buf = outbuf; @@ -291,10 +293,12 @@ gst_frei0r_src_get_property (GObject * object, guint prop_id, GValue * value, GstFrei0rSrc *self = GST_FREI0R_SRC (object); GstFrei0rSrcClass *klass = GST_FREI0R_SRC_GET_CLASS (object); + GST_OBJECT_LOCK (self); if (!gst_frei0r_get_property (self->f0r_instance, klass->ftable, klass->properties, klass->n_properties, self->property_cache, prop_id, value)) G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + GST_OBJECT_UNLOCK (self); } static void @@ -304,10 +308,12 @@ gst_frei0r_src_set_property (GObject * object, guint prop_id, GstFrei0rSrc *self = GST_FREI0R_SRC (object); GstFrei0rSrcClass *klass = GST_FREI0R_SRC_GET_CLASS (object); + GST_OBJECT_LOCK (self); if (!gst_frei0r_set_property (self->f0r_instance, klass->ftable, klass->properties, klass->n_properties, self->property_cache, prop_id, value)) G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + GST_OBJECT_UNLOCK (self); } static void