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