component: Keep its own context at all times
authorOlivier Crête <olivier.crete@collabora.com>
Tue, 25 Feb 2014 04:00:33 +0000 (23:00 -0500)
committerOlivier Crête <olivier.crete@collabora.com>
Tue, 25 Feb 2014 05:51:31 +0000 (00:51 -0500)
Don't re-create it.

agent/component.c
agent/component.h

index 1ddd586..d22816e 100644 (file)
@@ -125,6 +125,9 @@ component_new (guint id, NiceAgent *agent, Stream *stream)
   g_queue_init (&component->pending_io_messages);
   component->io_callback_id = 0;
 
+  component->own_ctx = g_main_context_new ();
+  component->ctx = g_main_context_ref (component->own_ctx);
+
   /* Start off with a fresh main context and all I/O paused. This
    * will be updated when nice_agent_attach_recv() or nice_agent_recv_messages()
    * are called. */
@@ -207,6 +210,8 @@ component_free (Component *cmp)
     cmp->ctx = NULL;
   }
 
+  g_main_context_unref (cmp->own_ctx);
+
   while ((vec = g_queue_pop_head (&cmp->queued_tcp_packets)) != NULL) {
     g_free ((gpointer) vec->buffer);
     g_slice_free (GOutputVector, vec);
@@ -540,25 +545,25 @@ component_free_socket_sources (Component *component)
 GMainContext *
 component_dup_io_context (Component *component)
 {
-  return g_main_context_ref (component->ctx);
+  return g_main_context_ref (component->own_ctx);
 }
 
-/* If @context is %NULL, a fresh context is used, so component->ctx is always
+/* If @context is %NULL, it's own context is used, so component->ctx is always
  * guaranteed to be non-%NULL. */
 void
 component_set_io_context (Component *component, GMainContext *context)
 {
   g_mutex_lock (&component->io_mutex);
 
-  if (component->ctx != context || component->ctx == NULL) {
+  if (component->ctx != context) {
     if (context == NULL)
-      context = g_main_context_new ();
+      context = g_main_context_ref (component->own_ctx);
     else
       g_main_context_ref (context);
 
     component_detach_all_sockets (component);
-    if (component->ctx != NULL)
-      g_main_context_unref (component->ctx);
+    g_main_context_unref (component->ctx);
+
     component->ctx = context;
     component_reattach_all_sockets (component);
   }
index 5c01158..6433a85 100644 (file)
@@ -171,8 +171,10 @@ struct _Component
                                          IOCallbackData */
   guint io_callback_id;             /* GSource ID of the I/O callback */
 
-  GMainContext *ctx;                /**< context for GSources for this
+  GMainContext *own_ctx;            /**< own context for GSources for this
                                        component */
+  GMainContext *ctx;                /**< context for GSources for this
+                                       component (possibly set from the app) */
   NiceInputMessage *recv_messages;  /**< unowned messages for receiving into */
   guint n_recv_messages;            /**< length of recv_messages */
   NiceInputMessageIter recv_messages_iter; /**< current write position in