summaryrefslogtreecommitdiffstats
path: root/test/glib/test-profile.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/glib/test-profile.c')
-rw-r--r--test/glib/test-profile.c127
1 files changed, 89 insertions, 38 deletions
diff --git a/test/glib/test-profile.c b/test/glib/test-profile.c
index 6a00ee5e..762e2fd9 100644
--- a/test/glib/test-profile.c
+++ b/test/glib/test-profile.c
@@ -21,18 +21,13 @@
*
*/
-/* FIXME this test is wacky since both client and server keep
- * sending each other method calls, but nobody sends
- * a DBUS_MESSAGE_TYPE_METHOD_RETURN
- */
-
#include <config.h>
#include <glib.h>
#include <dbus/dbus-glib-lowlevel.h>
#include <stdlib.h>
#define N_CLIENT_THREADS 1
-#define N_ITERATIONS 1000
+#define N_ITERATIONS 4000
#define PAYLOAD_SIZE 30
#define ECHO_PATH "/org/freedesktop/EchoTest"
#define ECHO_INTERFACE "org.freedesktop.EchoTest"
@@ -41,8 +36,21 @@
static const char *address;
static unsigned char *payload;
+typedef struct
+{
+ int iterations;
+ GMainLoop *loop;
+} ClientData;
+
+typedef struct
+{
+ int handled;
+ GMainLoop *loop;
+ int n_clients;
+} ServerData;
+
static void
-send_echo_message (DBusConnection *connection)
+send_echo_method_call (DBusConnection *connection)
{
DBusMessage *message;
@@ -51,7 +59,7 @@ send_echo_message (DBusConnection *connection)
dbus_message_append_args (message,
DBUS_TYPE_STRING, "Hello World!",
DBUS_TYPE_INT32, 123456,
-#if 1
+#if 0
DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
payload, PAYLOAD_SIZE,
#endif
@@ -62,12 +70,25 @@ send_echo_message (DBusConnection *connection)
dbus_connection_flush (connection);
}
+static void
+send_echo_method_return (DBusConnection *connection,
+ DBusMessage *call_message)
+{
+ DBusMessage *message;
+
+ message = dbus_message_new_method_return (call_message);
+
+ dbus_connection_send (connection, message, NULL);
+ dbus_message_unref (message);
+ dbus_connection_flush (connection);
+}
+
static DBusHandlerResult
client_filter (DBusConnection *connection,
DBusMessage *message,
void *user_data)
{
- int *iterations = user_data;
+ ClientData *cd = user_data;
if (dbus_message_is_signal (message,
DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL,
@@ -76,16 +97,15 @@ client_filter (DBusConnection *connection,
g_printerr ("Client thread disconnected\n");
exit (1);
}
- else if (dbus_message_is_method_call (message,
- ECHO_INTERFACE, ECHO_METHOD))
+ else if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN)
{
- *iterations += 1;
- if (*iterations >= N_ITERATIONS)
+ cd->iterations += 1;
+ if (cd->iterations >= N_ITERATIONS)
{
g_print ("Completed %d iterations\n", N_ITERATIONS);
- exit (0);
+ g_main_loop_quit (cd->loop);
}
- send_echo_message (connection);
+ send_echo_method_call (connection);
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -97,9 +117,8 @@ thread_func (void *data)
{
DBusError error;
GMainContext *context;
- GMainLoop *loop;
DBusConnection *connection;
- int iterations;
+ ClientData cd;
g_printerr ("Starting client thread\n");
@@ -112,28 +131,31 @@ thread_func (void *data)
exit (1);
}
- iterations = 1;
+ context = g_main_context_new ();
+
+ cd.iterations = 1;
+ cd.loop = g_main_loop_new (context, FALSE);
if (!dbus_connection_add_filter (connection,
- client_filter, &iterations, NULL))
+ client_filter, &cd, NULL))
g_error ("no memory");
- context = g_main_context_new ();
- loop = g_main_loop_new (context, FALSE);
dbus_connection_setup_with_g_main (connection, context);
g_printerr ("Client thread sending message to prime pingpong\n");
- send_echo_message (connection);
+ send_echo_method_call (connection);
g_printerr ("Client thread sent message\n");
g_printerr ("Client thread entering main loop\n");
- g_main_loop_run (loop);
+ g_main_loop_run (cd.loop);
g_printerr ("Client thread exiting main loop\n");
+
+ dbus_connection_disconnect (connection);
- g_main_loop_unref (loop);
+ g_main_loop_unref (cd.loop);
g_main_context_unref (context);
-
+
return NULL;
}
@@ -142,18 +164,23 @@ server_filter (DBusConnection *connection,
DBusMessage *message,
void *user_data)
{
+ ServerData *sd = user_data;
+
if (dbus_message_is_signal (message,
DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL,
"Disconnected"))
{
- g_printerr ("Server thread disconnected\n");
- exit (1);
+ g_printerr ("Client disconnected from server\n");
+ sd->n_clients -= 1;
+ if (sd->n_clients == 0)
+ g_main_loop_quit (sd->loop);
}
else if (dbus_message_is_method_call (message,
ECHO_INTERFACE,
ECHO_METHOD))
{
- send_echo_message (connection);
+ sd->handled += 1;
+ send_echo_method_return (connection, message);
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -164,14 +191,17 @@ static void
new_connection_callback (DBusServer *server,
DBusConnection *new_connection,
void *user_data)
-{
+{
+ ServerData *sd = user_data;
+
dbus_connection_ref (new_connection);
dbus_connection_setup_with_g_main (new_connection, NULL);
if (!dbus_connection_add_filter (new_connection,
- server_filter, NULL, NULL))
+ server_filter, sd, NULL))
g_error ("no memory");
-
+
+ sd->n_clients += 1;
/* FIXME we leak the handler */
}
@@ -179,11 +209,13 @@ new_connection_callback (DBusServer *server,
int
main (int argc, char *argv[])
{
- GMainLoop *loop;
DBusError error;
DBusServer *server;
+ GTimer *timer;
int i;
-
+ double secs;
+ ServerData sd;
+
g_thread_init (NULL);
dbus_g_thread_init ();
@@ -197,14 +229,20 @@ main (int argc, char *argv[])
return 1;
}
+#ifndef DBUS_DISABLE_ASSERT
+ g_printerr ("You should probably turn off assertions before you profile\n");
+#endif
+
address = dbus_server_get_address (server);
payload = g_malloc (PAYLOAD_SIZE);
dbus_server_set_new_connection_function (server,
new_connection_callback,
- NULL, NULL);
-
- loop = g_main_loop_new (NULL, FALSE);
+ &sd, NULL);
+
+ sd.handled = 0;
+ sd.n_clients = 0;
+ sd.loop = g_main_loop_new (NULL, FALSE);
dbus_server_setup_with_g_main (server, NULL);
@@ -213,14 +251,27 @@ main (int argc, char *argv[])
g_thread_create (thread_func, NULL, FALSE, NULL);
}
+ timer = g_timer_new ();
+
g_printerr ("Server thread entering main loop\n");
- g_main_loop_run (loop);
+ g_main_loop_run (sd.loop);
g_printerr ("Server thread exiting main loop\n");
+ secs = g_timer_elapsed (timer, NULL);
+ g_timer_destroy (timer);
+
+ g_printerr ("%g seconds, %d round trips, %g seconds per pingpong\n",
+ secs, sd.handled, secs/sd.handled);
+#ifndef DBUS_DISABLE_ASSERT
+ g_printerr ("You should probably --disable-asserts before you profile as they have noticeable overhead\n");
+#endif
+
+ g_printerr ("The following g_warning is because we try to call g_source_remove_poll() after g_source_destroy() in dbus-gmain.c, I think we need to add a source free func that clears out the watch/timeout funcs\n");
dbus_server_unref (server);
- g_main_loop_unref (loop);
+ g_main_loop_unref (sd.loop);
return 0;
}
+