--- configure.ac | 1 + gio/tests/Makefile.am | 13 +++ gio/tests/kdbus-test/README | 108 ++++++++++++++++++++ gio/tests/kdbus-test/gdbus-example-kdbus-client.c | 51 ++++++++++ gio/tests/kdbus-test/gdbus-example-kdbus-server.c | 117 ++++++++++++++++++++++ 5 files changed, 290 insertions(+) create mode 100644 gio/tests/kdbus-test/README create mode 100644 gio/tests/kdbus-test/gdbus-example-kdbus-client.c create mode 100644 gio/tests/kdbus-test/gdbus-example-kdbus-server.c
diff --git a/configure.ac b/configure.ac index 413c9f2..c3349c4 100644 --- a/configure.ac +++ b/configure.ac @@ -264,6 +264,7 @@ AS_IF([test "x$enable_gc_friendly" = "xyes"], [ ], [ AC_MSG_RESULT([no]) ]) AC_MSG_CHECKING([kdbus transport]) +AM_CONDITIONAL(KDBUS_TRANSPORT, [test "x$enable_kdbus_transport" = "xyes"]) AS_IF([test "x$enable_kdbus_transport" = "xyes"], [ AC_DEFINE(KDBUS_TRANSPORT, 1, [Define if kdbus transport is enabled]) AC_MSG_RESULT([yes]) diff --git a/gio/tests/Makefile.am b/gio/tests/Makefile.am index bec70d7..8d692bb 100644 --- a/gio/tests/Makefile.am +++ b/gio/tests/Makefile.am @@ -470,6 +470,19 @@ gdbus_serialization_SOURCES = \ gdbus-tests.c endif +if KDBUS_TRANSPORT +test_programs += gdbus-example-kdbus-server +test_programs += gdbus-example-kdbus-client + +gdbus_example_kdbus_server_CFLAGS = $(AM_CFLAGS) $(DBUS1_CFLAGS) +gdbus_example_kdbus_server_LDADD = $(LDADD) $(DBUS1_LIBS) +gdbus_example_kdbus_server_SOURCES = kdbus-test/gdbus-example-kdbus-server.c + +gdbus_example_kdbus_client_CFLAGS = $(AM_CFLAGS) $(DBUS1_CFLAGS) +gdbus_example_kdbus_client_LDADD = $(LDADD) $(DBUS1_LIBS) +gdbus_example_kdbus_client_SOURCES = kdbus-test/gdbus-example-kdbus-client.c +endif + # ----------------------------------------------------------------------------- # The resources test is a bit more complicated... diff --git a/gio/tests/kdbus-test/README b/gio/tests/kdbus-test/README new file mode 100644 index 0000000..6f44f0b --- /dev/null +++ b/gio/tests/kdbus-test/README @@ -0,0 +1,108 @@ +Description +=========== + +In order to perform tests of modified libgio library (with kdbus +transport) we have created two programs: gdbus-example-kdbus-server +and gdbus-example-kdbus-client. The first of them acts as a server, +registers itself on the bus under well-known name and waits for calls +to its objects and methods. The second one (client) makes calls and +records periods of time between moment of preparing of a call to the +moment of receiving and parsing an answer. The measurement is made by +performing one thousand of calls and computing a sum of duration of +every call (for different sizes of message payload: 4B, 8B, 4kB, 8kB, +16kB, 64kB and 512kB). The client program returns total time of +performed calls after successful execution. + + +Requirements +============ + +* kdbus kernel module, +* modified version of glib (with kdbus transport), +* modified version of dbus-daemon (with kdbus transport), + + +KDBUS +===== + +Simple install procedure: + + % git clone https://github.com/gregkh/kdbus.git # download kdbus source + % cd kdbus # change to kdbus directory + % make # build kdbus module + % insmod kdbus.ko # load kdbus kernel module + + +GLIB (modified version) +======================= + +Simple install procedure: + + + % cd glib # change to glib directory + % ./configure --enable-kdbus-transport # run the `configure' script with kdbus support + % make # build GLIB + + +DBUS-DAEMON (modified version) +============================== + +Modified version of dbus-daemon (from tizen.org) is required to run +kdbus transport in libgio. + +Solution, which we propose, includes modifications both in client +libraries (libgio, libdbus) and dbus daemon. Daemon is registered on +kdbus bus as a client under "org.freedesktop.DBus" name. Only +messages addressed to this interface are handled by daemon. Messages +such as RequestName or AddMatch are translated by daemon to respective +ioctl() calls, which send them through kdbus on behalf of original +client process. The rest of messages would are going straight from +origin to destination through kdbus. + +Simple install procedure: + +* download modified version of dbus from tizen.org repository + (kdbus-dev branch): + + git clone git://review.tizen.org/platform/upstream/dbus.git -b kdbus-dev + +* change to dbus directory and build dbus-daemon with kdbus support: + + ./configure --enable-kdbus-transport + make && make install + +* start of custom dbus-daemon supporting kdbus transport: + + ./dbus-daemon --nofork --address=kdbus: --config-file=/etc/dbus-1/session.conf + + +TESTS +===== + +* Build test binaries: + + cd gio/tests + make + +* Set variable to use custom library and to use kdbus as session bus: + + export LD_LIBRARY_PATH=absolute_path_to_glib_libs_with_kdbus_patch + export DBUS_SESSION_BUS_ADDRESS=kdbus:path=/dev/kdbus/0-kdbus/bus + +* Run test binary server in terminal 1: + + ./gdbus-example-kdbus-server + +* Run test binary client in terminal 2: + + ./gdbus-example-kdbus-client + +* Sample client app output: + + elapsed time : 0.265072 s + elapsed time : 0.264353 s + elapsed time : 0.305062 s + elapsed time : 0.343710 s + elapsed time : 0.451501 s + elapsed time : 1.109851 s + elapsed time : 8.278217 s diff --git a/gio/tests/kdbus-test/gdbus-example-kdbus-client.c b/gio/tests/kdbus-test/gdbus-example-kdbus-client.c new file mode 100644 index 0000000..63f5a88 --- /dev/null +++ b/gio/tests/kdbus-test/gdbus-example-kdbus-client.c @@ -0,0 +1,51 @@ +/* + * gcc -o gdbus-example-kdbus-client gdbus-example-kdbus-client.c `pkg-config --cflags --libs glib-2.0 gio-2.0` + */ + +#include <stdlib.h> +#include <gio/gio.h> +#include <time.h> + +#define DBUS_NAME "com.kdbus.test" +#define DBUS_PATH "/com/kdbus/test" +#define DBUS_IFACE "com.kdbus.test" + +/* + * Main function + */ +int main (int argc, char ** argv) +{ + GDBusConnection *connection; + GDBusProxy *proxy; + int k,i,l; + char *buf = NULL; + int msg_size[7] = {4,8,4096,8192,16384,65536,524288}; + char *bus_name = "HelloKdbus"; + + struct timespec start, end; + double elapsed; + + connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + proxy = g_dbus_proxy_new_sync (connection, G_DBUS_PROXY_FLAGS_NONE, NULL, DBUS_NAME,DBUS_PATH,DBUS_IFACE, NULL, NULL); + + for (i=0; i<7; ++i) + { + buf = malloc(sizeof(char) * (msg_size[i] + 1)); + for(k=0; k<msg_size[i]; ++k) + buf[k] = 'a'; + buf[k] = '\0'; + + clock_gettime(CLOCK_REALTIME, &start); + + for(l=0; l<1000; l++) + g_dbus_proxy_call_sync (proxy, bus_name, g_variant_new("(s)", buf), G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL); + + clock_gettime(CLOCK_REALTIME, &end); + elapsed = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1E9; + g_print("elapsed time : %lf s\n", elapsed); + free (buf); + } + + return 0; +} + diff --git a/gio/tests/kdbus-test/gdbus-example-kdbus-server.c b/gio/tests/kdbus-test/gdbus-example-kdbus-server.c new file mode 100644 index 0000000..fe80165 --- /dev/null +++ b/gio/tests/kdbus-test/gdbus-example-kdbus-server.c @@ -0,0 +1,117 @@ +/* + * gcc -o gdbus-example-kdbus-server gdbus-example-kdbus-server.c `pkg-config --cflags --libs glib-2.0 gio-2.0` + */ + +#include <stdlib.h> +#include <gio/gio.h> + +#define DBUS_NAME "com.kdbus.test" +#define DBUS_PATH "/com/kdbus/test" +#define DBUS_IFACE "com.kdbus.test" + +/* + * Handlers + */ +static void bus_acquired_handler (GDBusConnection *connection, const gchar *name, gpointer user_data); +static void name_acquired_handler (GDBusConnection *connection, const gchar *name, gpointer user_data); +static void name_lost_handler (GDBusConnection *connection, const gchar *name, gpointer user_data); + +/* + * Globals + */ +static GDBusNodeInfo *introspection_data = NULL; + + +/* + * method_call_handler + */ +static void method_call_handler (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + if (g_strcmp0 (method_name, "HelloKdbus") == 0) + { + gchar *string_in; + gchar *string_out; + + g_variant_get (parameters, "(&s)", &string_in); + string_out = g_strdup_printf ("ok %s", string_in); + g_dbus_method_invocation_return_value (invocation, g_variant_new("(s)", string_out)); + g_free (string_out); + } +} + + +/* + * Vtable + */ +static const GDBusInterfaceVTable vtable = +{ + method_call_handler +}; + + +/* + * Main function + */ +int main (int argc, char ** argv) +{ + GMainLoop *g_main_loop; + guint id; + + gchar xml[] = + "<node>" + " <interface name= 'com.kdbus.test'>" + " <method name= 'HelloKdbus'>" + " <arg type= 's' name= 'string_in' direction= 'in'/>" + " <arg type= 's' name= 'string_out' direction= 'out'/>" + " </method>" + " </interface>" + "</node>"; + + introspection_data = g_dbus_node_info_new_for_xml (xml, NULL); + id = g_bus_own_name (G_BUS_TYPE_SESSION,DBUS_NAME,G_BUS_NAME_OWNER_FLAGS_NONE,bus_acquired_handler,name_acquired_handler,name_lost_handler,NULL,NULL); + + g_main_loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (g_main_loop); + + g_bus_unown_name (id); + g_dbus_node_info_unref (introspection_data); + return (0); +} + + +/* + * Handler to invoke when connected to the bus of type bus_type or NULL + */ +static void bus_acquired_handler (GDBusConnection *connection, const gchar *name, gpointer user_data) +{ + guint registration_id = g_dbus_connection_register_object (connection,DBUS_PATH,introspection_data->interfaces[0],&vtable,NULL,NULL,NULL); + g_print ("HANDLER: bus_acquired_handler\n"); + g_assert (registration_id > 0); +} + + +/* + * Handler to invoke when name is acquired or NULL + */ +static void name_acquired_handler (GDBusConnection *connection,const gchar *name,gpointer user_data) +{ + g_print ("HANDLER: name_acquired_handler\n"); +} + + +/* + * Handler to invoke when name is lost or NULL + */ +static void name_lost_handler (GDBusConnection *connection,const gchar *name,gpointer user_data) +{ + g_print ("HANDLER: name_lost_handler\n"); + exit(1); +} + -- 1.8.4.rc3 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel