dbus/test/glib test-profile.c,1.5,1.6
Havoc Pennington
hp at freedesktop.org
Fri Nov 12 23:07:49 PST 2004
Update of /cvs/dbus/dbus/test/glib
In directory gabe:/tmp/cvs-serv5614/test/glib
Modified Files:
test-profile.c
Log Message:
2004-11-13 Havoc Pennington <hp at redhat.com>
* test/glib/test-profile.c: fix this thing up a bit
* dbus/dbus-message.c (dbus_message_new_empty_header): increase
preallocation sizes by a fair bit; not sure if this will be an
overall performance win or not, but it does reduce reallocs.
* dbus/dbus-string.c (set_length, reallocate_for_length): ignore
the test hack that forced constant realloc if asserts are
disabled, so we can profile sanely. Sprinkle in some
_DBUS_UNLIKELY() which are probably pointless, but before I
noticed the real performance problem I put them in.
(_dbus_string_validate_utf8): micro-optimize this thing a little
bit, though callgrind says it didn't help; then special-case
ascii, which did help a lot; then be sure we detect nul bytes as
invalid, which is a bugfix.
(align_length_then_lengthen): add some more _DBUS_UNLIKELY
superstition; use memset to nul the padding instead of a manual
loop.
(_dbus_string_get_length): inline this as a
macro; it showed up in the profile because it's used for loop
tests and so forth
Index: test-profile.c
===================================================================
RCS file: /cvs/dbus/dbus/test/glib/test-profile.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- test-profile.c 10 Aug 2004 03:07:01 -0000 1.5
+++ test-profile.c 13 Nov 2004 07:07:47 -0000 1.6
@@ -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 @@
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 @@
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 @@
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 @@
{
DBusError error;
GMainContext *context;
- GMainLoop *loop;
DBusConnection *connection;
- int iterations;
+ ClientData cd;
g_printerr ("Starting client thread\n");
@@ -112,28 +131,31 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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;
}
+
More information about the dbus-commit
mailing list