[jsonrpc-glib] marshalers: ensure all signals have proper marshalers



commit 769635f1c070dd5bcceb011e02b20988d29d32fa
Author: Christian Hergert <chergert redhat com>
Date:   Fri May 31 12:53:53 2019 -0700

    marshalers: ensure all signals have proper marshalers
    
    It's fairly trivial to avoid using generic marshalers, which come with a
    memory and performance cost.

 src/jsonrpc-client.c        | 18 ++++++++++++------
 src/jsonrpc-marshalers.list |  4 ++++
 src/jsonrpc-server.c        | 23 +++++++++++++----------
 src/meson.build             |  8 ++++++++
 4 files changed, 37 insertions(+), 16 deletions(-)
---
diff --git a/src/jsonrpc-client.c b/src/jsonrpc-client.c
index 203f6f7..84b18c5 100644
--- a/src/jsonrpc-client.c
+++ b/src/jsonrpc-client.c
@@ -58,6 +58,7 @@
 #include "jsonrpc-client.h"
 #include "jsonrpc-input-stream.h"
 #include "jsonrpc-input-stream-private.h"
+#include "jsonrpc-marshalers.h"
 #include "jsonrpc-output-stream.h"
 
 typedef struct
@@ -504,11 +505,8 @@ jsonrpc_client_class_init (JsonrpcClientClass *klass)
                   G_SIGNAL_RUN_LAST,
                   G_STRUCT_OFFSET (JsonrpcClientClass, failed),
                   NULL, NULL,
-                  g_cclosure_marshal_VOID__VOID,
+                  NULL,
                   G_TYPE_NONE, 0);
-  g_signal_set_va_marshaller (signals [FAILED],
-                              G_TYPE_FROM_CLASS (klass),
-                              g_cclosure_marshal_VOID__VOIDv);
 
   /**
    * JsonrpcClient::handle-call:
@@ -537,12 +535,16 @@ jsonrpc_client_class_init (JsonrpcClientClass *klass)
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
                   G_STRUCT_OFFSET (JsonrpcClientClass, handle_call),
-                  g_signal_accumulator_true_handled, NULL, NULL,
+                  g_signal_accumulator_true_handled, NULL,
+                  _jsonrpc_marshal_BOOLEAN__STRING_VARIANT_VARIANT,
                   G_TYPE_BOOLEAN,
                   3,
                   G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE,
                   G_TYPE_VARIANT,
                   G_TYPE_VARIANT);
+  g_signal_set_va_marshaller (signals [HANDLE_CALL],
+                              G_TYPE_FROM_CLASS (klass),
+                              _jsonrpc_marshal_BOOLEAN__STRING_VARIANT_VARIANTv);
 
   /**
    * JsonrpcClient::notification:
@@ -562,11 +564,15 @@ jsonrpc_client_class_init (JsonrpcClientClass *klass)
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
                   G_STRUCT_OFFSET (JsonrpcClientClass, notification),
-                  NULL, NULL, NULL,
+                  NULL, NULL,
+                  _jsonrpc_marshal_VOID__STRING_VARIANT,
                   G_TYPE_NONE,
                   2,
                   G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE,
                   G_TYPE_VARIANT);
+  g_signal_set_va_marshaller (signals [NOTIFICATION],
+                              G_TYPE_FROM_CLASS (klass),
+                              _jsonrpc_marshal_VOID__STRING_VARIANTv);
 }
 
 static void
diff --git a/src/jsonrpc-marshalers.list b/src/jsonrpc-marshalers.list
new file mode 100644
index 0000000..130558f
--- /dev/null
+++ b/src/jsonrpc-marshalers.list
@@ -0,0 +1,4 @@
+BOOLEAN:OBJECT,STRING,VARIANT,VARIANT
+BOOLEAN:STRING,VARIANT,VARIANT
+VOID:OBJECT,STRING,VARIANT
+VOID:STRING,VARIANT
diff --git a/src/jsonrpc-server.c b/src/jsonrpc-server.c
index 0dba394..83bba4a 100644
--- a/src/jsonrpc-server.c
+++ b/src/jsonrpc-server.c
@@ -23,6 +23,7 @@
 #include <stdlib.h>
 
 #include "jsonrpc-input-stream.h"
+#include "jsonrpc-marshalers.h"
 #include "jsonrpc-output-stream.h"
 #include "jsonrpc-server.h"
 
@@ -152,13 +153,17 @@ jsonrpc_server_class_init (JsonrpcServerClass *klass)
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_RUN_LAST,
                   G_STRUCT_OFFSET (JsonrpcServerClass, handle_call),
-                  g_signal_accumulator_true_handled, NULL, NULL,
+                  g_signal_accumulator_true_handled, NULL,
+                  _jsonrpc_marshal_BOOLEAN__OBJECT_STRING_VARIANT_VARIANT,
                   G_TYPE_BOOLEAN,
                   4,
                   JSONRPC_TYPE_CLIENT,
                   G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE,
                   G_TYPE_VARIANT,
                   G_TYPE_VARIANT);
+  g_signal_set_va_marshaller (signals [HANDLE_CALL],
+                              G_TYPE_FROM_CLASS (klass),
+                              _jsonrpc_marshal_BOOLEAN__OBJECT_STRING_VARIANT_VARIANTv);
 
   /**
    * JsonrpcServer::notification:
@@ -176,12 +181,16 @@ jsonrpc_server_class_init (JsonrpcServerClass *klass)
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_RUN_LAST,
                   G_STRUCT_OFFSET (JsonrpcServerClass, notification),
-                  NULL, NULL, NULL,
+                  NULL, NULL,
+                  _jsonrpc_marshal_VOID__OBJECT_STRING_VARIANT,
                   G_TYPE_NONE,
                   3,
                   JSONRPC_TYPE_CLIENT,
                   G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE,
                   G_TYPE_VARIANT);
+  g_signal_set_va_marshaller (signals [NOTIFICATION],
+                              G_TYPE_FROM_CLASS (klass),
+                              _jsonrpc_marshal_VOID__OBJECT_STRING_VARIANTv);
 
   /**
    * JsonrpcServer::client-accepted:
@@ -198,13 +207,10 @@ jsonrpc_server_class_init (JsonrpcServerClass *klass)
                   G_SIGNAL_RUN_LAST,
                   G_STRUCT_OFFSET (JsonrpcServerClass, client_accepted),
                   NULL, NULL,
-                  g_cclosure_marshal_VOID__OBJECT,
+                  NULL,
                   G_TYPE_NONE,
                   1,
                   JSONRPC_TYPE_CLIENT);
-  g_signal_set_va_marshaller (signals [CLIENT_ACCEPTED],
-                              G_TYPE_FROM_CLASS (klass),
-                              g_cclosure_marshal_VOID__OBJECTv);
 
   /**
    * JsonrpcServer::client-closed:
@@ -221,13 +227,10 @@ jsonrpc_server_class_init (JsonrpcServerClass *klass)
                   G_SIGNAL_RUN_LAST,
                   G_STRUCT_OFFSET (JsonrpcServerClass, client_closed),
                   NULL, NULL,
-                  g_cclosure_marshal_VOID__OBJECT,
+                  NULL,
                   G_TYPE_NONE,
                   1,
                   JSONRPC_TYPE_CLIENT);
-  g_signal_set_va_marshaller (signals [CLIENT_CLOSED],
-                              G_TYPE_FROM_CLASS (klass),
-                              g_cclosure_marshal_VOID__OBJECTv);
 }
 
 static void
diff --git a/src/meson.build b/src/meson.build
index 83fe506..0017adc 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -14,6 +14,13 @@ jsonrpc_version_h = configure_file(
         install: true,
   configuration: version_data)
 
+marshalers = gnome.genmarshal('jsonrpc-marshalers',
+             sources: 'jsonrpc-marshalers.list',
+              prefix: '_jsonrpc_marshal',
+  valist_marshallers: true,
+            internal: true,
+)
+
 libjsonrpc_glib_generated_headers = [
   jsonrpc_version_h,
 ]
@@ -46,6 +53,7 @@ libjsonrpc_glib_sources = [
   libjsonrpc_glib_generated_headers,
   libjsonrpc_glib_public_headers,
   libjsonrpc_glib_public_sources,
+  marshalers,
 ]
 
 libjsonrpc_glib = library(


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