[jsonrpc-glib] server: cleanup clients upon failure
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [jsonrpc-glib] server: cleanup clients upon failure
- Date: Wed, 27 Dec 2017 11:39:25 +0000 (UTC)
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]