[telepathy-stream-engine/master] Unlock mutex when changing element states

Olivier Crête olivier.crete at collabora.co.uk
Wed Oct 21 06:59:22 PDT 2009


---
 src/tp-stream-engine.c |   27 +++++++++++++++++++++++++--
 1 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/src/tp-stream-engine.c b/src/tp-stream-engine.c
index dd30bc9..902217f 100644
--- a/src/tp-stream-engine.c
+++ b/src/tp-stream-engine.c
@@ -153,6 +153,7 @@ struct _TpStreamEnginePrivate
   GList *output_sinks;
   GList *preview_sinks;
 
+  guint audio_streams_generation;
   GList *audio_streams;
 
   TpStreamEngineVideoPreview *preview;
@@ -616,6 +617,7 @@ stream_closed (TfStream *stream, gpointer user_data)
       g_mutex_lock (self->priv->mutex);
       self->priv->audio_streams = g_list_remove (self->priv->audio_streams,
           sestream);
+      self->priv->audio_streams_generation++;
       g_mutex_unlock (self->priv->mutex);
     }
 
@@ -813,6 +815,7 @@ channel_stream_created (TfChannel *chan G_GNUC_UNUSED,
       g_mutex_lock (self->priv->mutex);
       self->priv->audio_streams = g_list_prepend (self->priv->audio_streams,
           audiostream);
+      self->priv->audio_streams_generation++;
       g_mutex_unlock (self->priv->mutex);
 
       g_object_get (audiostream, "src", &src, NULL);
@@ -1021,14 +1024,24 @@ restart_pipeline (gpointer data)
   g_assert (ret != GST_STATE_CHANGE_FAILURE);
 
   g_mutex_lock (self->priv->mutex);
+ try_stop_again:
   for (item = self->priv->audio_streams; item ; item = item->next)
     {
+      TpStreamEngineAudioStream *as = g_object_ref (item->data);
+      guint gen = self->priv->audio_streams_generation;
+
+      g_mutex_unlock (self->priv->mutex);
       if (!tp_stream_engine_audio_stream_set_playing (
               TP_STREAM_ENGINE_AUDIO_STREAM (item->data), FALSE))
         {
-          g_mutex_unlock (self->priv->mutex);
+          g_object_unref (as);
           goto fail;
         }
+      g_object_unref (as);
+
+      g_mutex_lock (self->priv->mutex);
+      if (gen != self->priv->audio_streams_generation)
+        goto try_stop_again;
     }
   g_mutex_unlock (self->priv->mutex);
 
@@ -1043,14 +1056,24 @@ restart_pipeline (gpointer data)
     }
 
   g_mutex_lock (self->priv->mutex);
+ try_start_again:
   for (item = self->priv->audio_streams; item ; item = item->next)
     {
+      TpStreamEngineAudioStream *as = g_object_ref (item->data);
+      guint gen = self->priv->audio_streams_generation;
+
+      g_mutex_unlock (self->priv->mutex);
       if (!tp_stream_engine_audio_stream_set_playing (
               TP_STREAM_ENGINE_AUDIO_STREAM (item->data), TRUE))
         {
-          g_mutex_unlock (self->priv->mutex);
+          g_object_unref (as);
           goto fail;
         }
+      g_object_unref (as);
+
+      g_mutex_lock (self->priv->mutex);
+      if (gen != self->priv->audio_streams_generation)
+        goto try_start_again;
     }
   g_mutex_unlock (self->priv->mutex);
 
-- 
1.5.6.5




More information about the telepathy-commits mailing list