[Pkg-telepathy-commits] [libnice] 70/265: agent: Move I/O callback handling from NiceAgent into Component

Simon McVittie smcv at debian.org
Wed May 14 12:04:54 UTC 2014


This is an automated email from the git hooks/post-receive script.

smcv pushed a commit to branch debian
in repository libnice.

commit 6fe29601eec5514ef267640310af955a686c502d
Author: Philip Withnall <philip.withnall at collabora.co.uk>
Date:   Mon Dec 16 11:04:30 2013 +0000

    agent: Move I/O callback handling from NiceAgent into Component
    
    Compartmentalise the handling of setting and clearing the user-provided
    per-Component I/O callbacks.
    
    Data flows from the socket, through nice_agent_g_source_cb(), to
    component_emit_io_callback() which calls the callback provided by the
    user when originally attaching to the stream/component.
---
 agent/agent.c     | 81 +++++++++++++------------------------------------------
 agent/component.c | 53 ++++++++++++++++++++++++++++++++++++
 agent/component.h | 15 ++++++++---
 3 files changed, 83 insertions(+), 66 deletions(-)

diff --git a/agent/agent.c b/agent/agent.c
index 4675e7a..7518810 100644
--- a/agent/agent.c
+++ b/agent/agent.c
@@ -125,10 +125,6 @@ static GRecMutex agent_mutex;    /* Mutex used for thread-safe lib */
 static GStaticRecMutex agent_mutex = G_STATIC_REC_MUTEX_INIT;
 #endif
 
-static void priv_attach_stream_component (NiceAgent *agent,
-    Stream *stream,
-    Component *component);
-
 static void priv_free_upnp (NiceAgent *agent);
 
 #if GLIB_CHECK_VERSION(2,31,8)
@@ -1053,20 +1049,17 @@ pseudo_tcp_socket_readable (PseudoTcpSocket *sock, gpointer user_data)
   g_object_add_weak_pointer (G_OBJECT (agent), (gpointer *)&agent);
 
   do {
-    if (component->g_source_io_cb)
+    if (component->io_callback != NULL)
       len = pseudo_tcp_socket_recv (sock, buf, sizeof(buf));
     else
       len = 0;
 
     if (len > 0) {
-      gpointer data = component->data;
       gint sid = stream->id;
       gint cid = component->id;
-      NiceAgentRecvFunc callback = component->g_source_io_cb;
-      /* Unlock the agent before calling the callback */
-      agent_unlock();
-      callback (agent, sid, cid, len, buf, data);
-      agent_lock();
+
+      component_emit_io_callback (component, agent, sid, cid,
+          (guint8 *) buf, len);
       if (sock == NULL) {
         nice_debug ("PseudoTCP socket got destroyed in readable callback!");
         break;
@@ -2705,23 +2698,16 @@ nice_agent_g_source_cb (
     nice_debug ("Agent %p: unable to recv from socket %p. Detaching",
         ctx->agent, ctx->socket);
     component_detach_socket_source (component, ctx->socket);
-  } else if (len > 0 && component->g_source_io_cb) {
-    gpointer data = ctx->component->data;
-    gint sid = ctx->stream->id;
-    gint cid = ctx->component->id;
-    NiceAgentRecvFunc callback = ctx->component->g_source_io_cb;
-
-    /* Unlock the agent before calling the callback */
-    agent_unlock ();
-
-    callback (agent, sid, cid, len, buf, data);
+  } else if (len > 0 && component->io_callback) {
+    gint sid = stream->id;
+    gint cid = component->id;
 
-    goto done;
+    component_emit_io_callback (component, agent, sid, cid,
+        (guint8 *) buf, len);
   }
 
   agent_unlock ();
 
-done:
   return TRUE;
 }
 
@@ -2759,30 +2745,6 @@ agent_attach_stream_component_socket (NiceAgent *agent,
   component_add_socket_source (component, socket, source);
 }
 
-
-/*
- * Attaches socket handles of 'stream' to the main eventloop
- * context.
- *
- */
-static void
-priv_attach_stream_component (NiceAgent *agent,
-    Stream *stream,
-    Component *component)
-{
-  GSList *i;
-
-  /* Don’t bother if there is no main context. */
-  if (component->ctx == NULL)
-    return;
-
-  for (i = component->socket_sources; i != NULL; i = i->next) {
-    SocketSource *socket_source = i->data;
-    agent_attach_stream_component_socket (agent, stream, component,
-        socket_source->socket);
-  }
-}
-
 NICEAPI_EXPORT gboolean
 nice_agent_attach_recv (
   NiceAgent *agent,
@@ -2810,25 +2772,19 @@ nice_agent_attach_recv (
     goto done;
   }
 
-  if (component->g_source_io_cb)
-    component_detach_socket_sources (component);
-
+  /* Set the component’s I/O callback. */
+  component_set_io_callback (component, func, data, ctx);
   ret = TRUE;
 
-  component->g_source_io_cb = NULL;
-  component->data = NULL;
-  if (component->ctx)
-    g_main_context_unref (component->ctx);
-  component->ctx = NULL;
-
   if (func) {
-    component->g_source_io_cb = func;
-    component->data = data;
-    component->ctx = ctx;
-    if (ctx)
-      g_main_context_ref (ctx);
+    GSList *i;
 
-    priv_attach_stream_component (agent, stream, component);
+    /* Attach any detached sockets to the new main context. */
+    for (i = component->socket_sources; i != NULL; i = i->next) {
+      SocketSource *socket_source = i->data;
+      agent_attach_stream_component_socket (agent, stream, component,
+          socket_source->socket);
+    }
 
     /* If we got detached, maybe our readable callback didn't finish reading
      * all available data in the pseudotcp, so we need to make sure we free
@@ -2838,7 +2794,6 @@ nice_agent_attach_recv (
      * trigger an error in the initial, pre-connection attach. */
     if (component->tcp && component->tcp_data && component->tcp_readable)
       pseudo_tcp_socket_readable (component->tcp, component->tcp_data);
-
   }
 
  done:
diff --git a/agent/component.c b/agent/component.c
index d1e9711..69e2505 100644
--- a/agent/component.c
+++ b/agent/component.c
@@ -447,3 +447,56 @@ component_free_socket_sources (Component *component)
       (GDestroyNotify) socket_source_free);
   component->socket_sources = NULL;
 }
+
+void
+component_set_io_callback (Component *component, NiceAgentRecvFunc func,
+    gpointer user_data, GMainContext *context)
+{
+  /* Reference the context early so we don’t accidentally free it below. */
+  if (context != NULL && func != NULL)
+    g_main_context_ref (context);
+
+  if (component->io_callback != NULL)
+    component_detach_socket_sources (component);
+
+  component->io_callback = NULL;
+  component->io_user_data = NULL;
+
+  if (component->ctx != NULL)
+    g_main_context_unref (component->ctx);
+  component->ctx = NULL;
+
+  if (func != NULL) {
+    component->io_callback = func;
+    component->io_user_data = user_data;
+    component->ctx = context;  /* referenced above */
+  }
+}
+
+/* This must be called with the agent lock *held*. */
+void
+component_emit_io_callback (Component *component, NiceAgent *agent,
+    gint stream_id, gint component_id, const guint8 *buf, gsize buf_len)
+{
+  NiceAgentRecvFunc io_callback;
+  gpointer io_user_data;
+
+  g_assert (component != NULL);
+  g_assert (NICE_IS_AGENT (agent));
+  g_assert (stream_id > 0);
+  g_assert (component_id > 0);
+  g_assert (buf != NULL);
+  g_assert (buf_len > 0);
+
+  g_assert (component->io_callback != NULL);
+
+  io_callback = component->io_callback;
+  io_user_data = component->io_user_data;
+
+  agent_unlock ();
+
+  io_callback (agent, stream_id, component_id,
+      buf_len, (gchar *) buf, io_user_data);
+
+  agent_lock ();
+}
diff --git a/agent/component.h b/agent/component.h
index 121c3f0..b4304b1 100644
--- a/agent/component.h
+++ b/agent/component.h
@@ -124,10 +124,12 @@ struct _Component
   CandidatePair selected_pair; /**< independent from checklists, 
 				    see ICE 11.1. "Sending Media" (ID-19) */
   NiceCandidate *restart_candidate; /**< for storing active remote candidate during a restart */
-  NiceAgentRecvFunc g_source_io_cb; /**< function called on io cb */
-  gpointer data;                    /**< data passed to the io function */
-  GMainContext *ctx;                /**< context for data callbacks for this
+
+  NiceAgentRecvFunc io_callback;    /**< function called on io cb */
+  gpointer io_user_data;            /**< data passed to the io function */
+  GMainContext *ctx;                /**< context for GSources for this
                                        component */
+
   PseudoTcpSocket *tcp;
   GSource* tcp_clock;
   TcpUserData *tcp_data;
@@ -171,6 +173,13 @@ component_detach_socket_sources (Component *component);
 void
 component_free_socket_sources (Component *component);
 
+void
+component_set_io_callback (Component *component, NiceAgentRecvFunc func,
+    gpointer user_data, GMainContext *context);
+void
+component_emit_io_callback (Component *component, NiceAgent *agent,
+    gint stream_id, gint component_id, const guint8 *buf, gsize buf_len);
+
 G_END_DECLS
 
 #endif /* _NICE_COMPONENT_H */

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-telepathy/libnice.git



More information about the Pkg-telepathy-commits mailing list