diff options
Diffstat (limited to 'test/glib/test-profile.c')
| -rw-r--r-- | test/glib/test-profile.c | 127 | 
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;  } +  | 
