[Telepathy-commits] [telepathy-gabble/master] GabbleMediaChannel: always construct streams asynchronously

Simon McVittie simon.mcvittie at collabora.co.uk
Mon Mar 9 12:34:34 PDT 2009


Again, this reduces the number of code paths flying around - we can rely
on things not happening until the main loop is re-entered.
---
 src/media-channel.c |   48 +++++++++++++++++++++++++++++++++---------------
 1 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/src/media-channel.c b/src/media-channel.c
index fffac67..1736d56 100644
--- a/src/media-channel.c
+++ b/src/media-channel.c
@@ -2418,12 +2418,9 @@ typedef struct {
 } StreamCreationData;
 
 static void
-google_relay_session_cb (GPtrArray *relays,
-                         gpointer user_data)
+stream_creation_data_free (gpointer p)
 {
-  StreamCreationData *d = user_data;
-
-  construct_stream (d->self, d->content, d->name, d->nat_traversal, relays);
+  StreamCreationData *d = p;
 
   g_free (d->name);
   g_free (d->nat_traversal);
@@ -2432,11 +2429,31 @@ google_relay_session_cb (GPtrArray *relays,
   g_slice_free (StreamCreationData, d);
 }
 
+static gboolean
+construct_stream_later_cb (gpointer user_data)
+{
+  StreamCreationData *d = user_data;
+
+  construct_stream (d->self, d->content, d->name, d->nat_traversal, NULL);
+  return FALSE;
+}
+
+static void
+google_relay_session_cb (GPtrArray *relays,
+                         gpointer user_data)
+{
+  StreamCreationData *d = user_data;
+
+  construct_stream (d->self, d->content, d->name, d->nat_traversal, relays);
+  stream_creation_data_free (d);
+}
+
 static void
 create_stream_from_content (GabbleMediaChannel *self,
                             GabbleJingleContent *c)
 {
   gchar *name, *nat_traversal;
+  StreamCreationData *d;
 
   g_object_get (c,
       "name", &name,
@@ -2453,15 +2470,15 @@ create_stream_from_content (GabbleMediaChannel *self,
       "nat-traversal", &nat_traversal,
       NULL);
 
-  if (!tp_strdiff (nat_traversal, "gtalk-p2p"))
-    {
-      StreamCreationData *d = g_slice_new0 (StreamCreationData);
+  StreamCreationData *d = g_slice_new0 (StreamCreationData);
 
-      d->self = g_object_ref (self);
-      d->nat_traversal = nat_traversal;
-      d->name = name;
-      d->content = g_object_ref (c);
+  d->self = g_object_ref (self);
+  d->nat_traversal = nat_traversal;
+  d->name = name;
+  d->content = g_object_ref (c);
 
+  if (!tp_strdiff (nat_traversal, "gtalk-p2p"))
+    {
       /* See if our server is Google, and if it is, ask them for a relay.
        * We ask for enough relays for 2 components (RTP and RTCP) since we
        * don't yet know whether there will be RTCP. */
@@ -2471,9 +2488,10 @@ create_stream_from_content (GabbleMediaChannel *self,
     }
   else
     {
-      construct_stream (self, c, name, nat_traversal, NULL);
-      g_free (name);
-      g_free (nat_traversal);
+      /* just create the stream (do it asynchronously so that the behaviour
+       * is the same in each case) */
+      g_idle_add_full (G_PRIORITY_DEFAULT, construct_stream_later_cb,
+          d, stream_creation_data_free);
     }
 }
 
-- 
1.5.6.5




More information about the telepathy-commits mailing list