[jsonrpc-glib] server: cleanup clients upon failure



commit 3809242de12e6ccc76eeff9a91b5374d7dea1a10
Author: Christian Hergert <chergert redhat com>
Date:   Wed Dec 27 03:28:01 2017 -0800

    server: cleanup clients upon failure
    
    When the client fails, we need to remove our copy and ensure it can be
    finalized. We defer to the main loop to help cases where the caller lost
    their reference to the client as part of the cleanup.

 src/jsonrpc-server.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)
---
diff --git a/src/jsonrpc-server.c b/src/jsonrpc-server.c
index e0371f1..5779270 100644
--- a/src/jsonrpc-server.c
+++ b/src/jsonrpc-server.c
@@ -207,6 +207,32 @@ jsonrpc_server_new (void)
 }
 
 static gboolean
+dummy_func (gpointer data)
+{
+  return G_SOURCE_REMOVE;
+}
+
+static void
+jsonrpc_server_client_failed (JsonrpcServer *self,
+                              JsonrpcClient *client)
+{
+  JsonrpcServerPrivate *priv = jsonrpc_server_get_instance_private (self);
+
+  g_assert (JSONRPC_IS_SERVER (self));
+  g_assert (JSONRPC_IS_CLIENT (client));
+
+  if (priv->clients != NULL &&
+      g_hash_table_contains (priv->clients, client))
+    {
+      /* Release instance from main thread to ensure callers return
+       * safely without having to be careful about incrementing ref
+       */
+      g_hash_table_steal (priv->clients, client);
+      g_idle_add_full (G_MAXINT, dummy_func, client, g_object_unref);
+    }
+}
+
+static gboolean
 jsonrpc_server_client_handle_call (JsonrpcServer *self,
                                    const gchar   *method,
                                    JsonNode      *id,
@@ -264,6 +290,12 @@ jsonrpc_server_accept_io_stream (JsonrpcServer *self,
   client = jsonrpc_client_new (io_stream);
 
   g_signal_connect_object (client,
+                           "failed",
+                           G_CALLBACK (jsonrpc_server_client_failed),
+                           self,
+                           G_CONNECT_SWAPPED);
+
+  g_signal_connect_object (client,
                            "handle-call",
                            G_CALLBACK (jsonrpc_server_client_handle_call),
                            self,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]