plugind: delay message processing at child to fix the race condition and removed...
authorImran Zaman <imran.zaman@linux.intel.com>
Tue, 14 May 2013 12:01:31 +0000 (15:01 +0300)
committerImran Zaman <imran.zaman@linux.intel.com>
Wed, 15 May 2013 12:29:06 +0000 (15:29 +0300)
src/daemon/dbus/interfaces/com.google.code.AccountsSSO.gSingleSignOn.RemotePlugin.xml
src/daemon/plugins/gsignond-plugin-remote-private.h
src/daemon/plugins/gsignond-plugin-remote.c
src/daemon/plugins/plugind/gsignond-plugin-daemon.c

index f730189..a7b97d2 100644 (file)
@@ -43,7 +43,5 @@
       <arg name="state" type="i" direction="out"/>
       <arg name="message" type="s" direction="out"/>
     </signal>
-    <signal name="pluginReady">
-    </signal>
   </interface>
 </node>
index 3ec73dc..c1d03c1 100644 (file)
@@ -42,7 +42,6 @@ struct _GSignondPluginRemotePrivate
     GPid cpid;
     guint child_watch_id;
     guint err_watch_id;
-    gboolean plugin_ready;
 
     /* Signals */
     guint signal_response;
@@ -52,7 +51,6 @@ struct _GSignondPluginRemotePrivate
     guint signal_user_action_required;
     guint signal_refreshed;
     guint signal_status_changed;
-    guint signal_plugin_ready;
 };
 
 G_END_DECLS
index 972525a..f2aafc7 100644 (file)
@@ -151,9 +151,6 @@ gsignond_plugin_remote_dispose (GObject *object)
                 self->priv->signal_refreshed);
         g_signal_handler_disconnect (self->priv->dbus_plugin_proxy,
                 self->priv->signal_status_changed);
-        g_signal_handler_disconnect (self->priv->dbus_plugin_proxy,
-                self->priv->signal_plugin_ready);
-        g_object_unref (self->priv->dbus_plugin_proxy);
         self->priv->dbus_plugin_proxy = NULL;
     }
 
@@ -218,7 +215,6 @@ gsignond_plugin_remote_init (GSignondPluginRemote *self)
     self->priv->plugin_mechanisms = NULL;
     self->priv->cpid = 0;
     self->priv->child_watch_id = 0;
-    self->priv->plugin_ready = FALSE;
 
 }
 
@@ -483,16 +479,6 @@ _status_changed_cb (
             (GSignondPluginState)status, message);
 }
 
-static void
-_plugin_ready_cb (
-        GSignondPluginRemote *self,
-        gpointer user_data)
-{
-    g_return_if_fail (self && GSIGNOND_IS_PLUGIN_REMOTE (self));
-
-    self->priv->plugin_ready = TRUE;
-}
-
 static gboolean
 _error_watch_cb (
         GIOChannel *channel,
@@ -576,7 +562,6 @@ gsignond_plugin_remote_new (
     GSignondPluginRemote *plugin = NULL;
     GSignondPipeStream *stream = NULL;
     gboolean ret = FALSE;
-    gint i;
 
     /* Spawn child process */
     argv = g_malloc0 ((3 + 1) * sizeof (gchar *));
@@ -651,9 +636,6 @@ gsignond_plugin_remote_new (
     plugin->priv->signal_status_changed = g_signal_connect_swapped (
             plugin->priv->dbus_plugin_proxy, "status-changed",
             G_CALLBACK(_status_changed_cb), plugin);
-    plugin->priv->signal_plugin_ready = g_signal_connect_swapped (
-            plugin->priv->dbus_plugin_proxy, "plugin-ready",
-            G_CALLBACK(_plugin_ready_cb), plugin);
 
     /* Create watch for error messages */
     plugin->priv->err_watch_ch = g_io_channel_unix_new (cerr_fd);
@@ -663,21 +645,6 @@ gsignond_plugin_remote_new (
     g_io_channel_set_flags (plugin->priv->err_watch_ch, G_IO_FLAG_NONBLOCK,
             NULL);
 
-    /* To avoid race condition, so that remote dbus object is up before it can
-     * be used
-     * */
-    for (i = 0; i < 100; i++) {
-        if (!plugin->priv->plugin_ready) {
-            g_usleep (10);
-            g_main_context_iteration (NULL, FALSE);
-        }
-    }
-
-    if (!plugin->priv->plugin_ready) {
-        g_object_unref (plugin);
-        return NULL;
-    }
-
     return plugin;
 }
 
index dbbf9ae..bcb4925 100644 (file)
@@ -383,7 +383,8 @@ gsignond_plugin_daemon_new (
     /* Create dbus connection */
     stream = gsignond_pipe_stream_new (0, 1, FALSE);
     daemon->priv->connection = g_dbus_connection_new_sync (G_IO_STREAM (stream),
-            NULL, G_DBUS_CONNECTION_FLAGS_NONE, NULL, NULL, NULL);
+            NULL, G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING, NULL, NULL,
+            NULL);
     g_object_unref (stream);
 
     /* Create dbus object */
@@ -441,8 +442,7 @@ gsignond_plugin_daemon_new (
     g_signal_connect (daemon->priv->connection, "closed",
             G_CALLBACK(_on_connection_closed), daemon);
 
-    gsignond_dbus_remote_plugin_emit_plugin_ready (
-            daemon->priv->dbus_remote_plugin);
+    g_dbus_connection_start_message_processing (daemon->priv->connection);
 
     return daemon;
 }