Home | History | Annotate | Download | only in name-test
      1 /**
      2  * Test to make sure late thread initialization works
      3  */
      4 
      5 #include <config.h>
      6 #include <dbus/dbus.h>
      7 #include <dbus/dbus-sysdeps.h>
      8 #include <stdio.h>
      9 #include <stdlib.h>
     10 
     11 #include <dbus/dbus-internals.h>
     12 #include <dbus/dbus-connection-internal.h>
     13 
     14 static void
     15 _run_iteration (DBusConnection *conn)
     16 {
     17   DBusPendingCall *echo_pending;
     18   DBusPendingCall *dbus_pending;
     19   DBusMessage *method;
     20   DBusMessage *reply;
     21   char *echo = "echo";
     22 
     23   /* send the first message */
     24   method = dbus_message_new_method_call ("org.freedesktop.DBus.TestSuiteEchoService",
     25                                          "/org/freedesktop/TestSuite",
     26                                          "org.freedesktop.TestSuite",
     27                                          "Echo");
     28 
     29   dbus_message_append_args (method, DBUS_TYPE_STRING, &echo, NULL);
     30   dbus_connection_send_with_reply (conn, method, &echo_pending, -1);
     31   dbus_message_unref (method);
     32 
     33   /* send the second message */
     34   method = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
     35                                          DBUS_PATH_DBUS,
     36                                          "org.freedesktop.Introspectable",
     37                                          "Introspect");
     38 
     39   dbus_connection_send_with_reply (conn, method, &dbus_pending, -1);
     40   dbus_message_unref (method);
     41 
     42   /* block on the second message (should return immediately) */
     43   dbus_pending_call_block (dbus_pending);
     44 
     45   /* block on the first message */
     46   /* if it does not return immediately chances
     47      are we hit the block in poll bug */
     48   dbus_pending_call_block (echo_pending);
     49 
     50   /* check the reply only to make sure we
     51      are not getting errors unrelated
     52      to the block in poll bug */
     53   reply = dbus_pending_call_steal_reply (echo_pending);
     54 
     55   if (reply == NULL)
     56     {
     57       printf ("Failed: Reply is NULL ***\n");
     58       exit (1);
     59     }
     60 
     61   if (dbus_message_get_type (reply) == DBUS_MESSAGE_TYPE_ERROR)
     62     {
     63       printf ("Failed: Reply is error: %s ***\n", dbus_message_get_error_name (reply));
     64       exit (1);
     65     }
     66 
     67   dbus_message_unref (reply);
     68   dbus_pending_call_unref (dbus_pending);
     69   dbus_pending_call_unref (echo_pending);
     70 
     71 }
     72 static void
     73 check_mutex_lock (DBusMutex *mutex1,
     74                   DBusMutex *mutex2,
     75                   dbus_bool_t is_same)
     76 {
     77   _dbus_assert (mutex1 != NULL);
     78   _dbus_assert (mutex2 != NULL);
     79 
     80   if (is_same)
     81     {
     82       _dbus_assert (mutex1 == mutex2);
     83     }
     84   else
     85     {
     86       _dbus_assert (mutex1 != mutex2);
     87     }
     88 }
     89 
     90 static void
     91 check_condvar_lock (DBusCondVar *condvar1,
     92                     DBusCondVar *condvar2,
     93                     dbus_bool_t is_same)
     94 {
     95   _dbus_assert (condvar1 != NULL);
     96   _dbus_assert (condvar2 != NULL);
     97 
     98   if (is_same)
     99     {
    100       _dbus_assert (condvar1 == condvar2);
    101     }
    102   else
    103     {
    104       _dbus_assert (condvar1 != condvar2);
    105     }
    106 }
    107 
    108 
    109 int
    110 main (int argc, char *argv[])
    111 {
    112   DBusMessage *method;
    113   DBusConnection *conn;
    114   DBusError error;
    115   DBusMutex *mutex1, *dispatch_mutex1, *io_path_mutex1;
    116   DBusCondVar *dispatch_cond1, *io_path_cond1;
    117   DBusMutex *mutex2, *dispatch_mutex2, *io_path_mutex2;
    118   DBusCondVar *dispatch_cond2, *io_path_cond2;
    119 
    120   printf ("*** Testing late thread init\n");
    121 
    122   dbus_error_init (&error);
    123 
    124   conn = dbus_bus_get (DBUS_BUS_SESSION, &error);
    125 
    126   _dbus_connection_test_get_locks (conn, &mutex1,
    127                                          &dispatch_mutex1,
    128                                          &io_path_mutex1,
    129                                          &dispatch_cond1,
    130                                          &io_path_cond1);
    131   _run_iteration (conn);
    132   _dbus_connection_test_get_locks (conn, &mutex2,
    133                                          &dispatch_mutex2,
    134                                          &io_path_mutex2,
    135                                          &dispatch_cond2,
    136                                          &io_path_cond2);
    137 
    138   check_mutex_lock (mutex1, mutex2, TRUE);
    139   check_mutex_lock (dispatch_mutex1, dispatch_mutex2, TRUE);
    140   check_mutex_lock (io_path_mutex1, io_path_mutex2, TRUE);
    141   check_condvar_lock (dispatch_cond1, dispatch_cond2, TRUE);
    142   check_condvar_lock (io_path_cond1, io_path_cond2, TRUE);
    143 
    144   dbus_threads_init_default ();
    145 
    146   _dbus_connection_test_get_locks (conn, &mutex1,
    147                                          &dispatch_mutex1,
    148                                          &io_path_mutex1,
    149                                          &dispatch_cond1,
    150                                          &io_path_cond1);
    151 
    152   check_mutex_lock (mutex1, mutex2, FALSE);
    153   check_mutex_lock (dispatch_mutex1, dispatch_mutex2, FALSE);
    154   check_mutex_lock (io_path_mutex1, io_path_mutex2, FALSE);
    155   check_condvar_lock (dispatch_cond1, dispatch_cond2, FALSE);
    156   check_condvar_lock (io_path_cond1, io_path_cond2, FALSE);
    157 
    158   _run_iteration (conn);
    159   _dbus_connection_test_get_locks (conn, &mutex2,
    160                                          &dispatch_mutex2,
    161                                          &io_path_mutex2,
    162                                          &dispatch_cond2,
    163                                          &io_path_cond2);
    164 
    165   check_mutex_lock (mutex1, mutex2, TRUE);
    166   check_mutex_lock (dispatch_mutex1, dispatch_mutex2, TRUE);
    167   check_mutex_lock (io_path_mutex1, io_path_mutex2, TRUE);
    168   check_condvar_lock (dispatch_cond1, dispatch_cond2, TRUE);
    169   check_condvar_lock (io_path_cond1, io_path_cond2, TRUE);
    170 
    171   method = dbus_message_new_method_call ("org.freedesktop.TestSuiteEchoService",
    172                                          "/org/freedesktop/TestSuite",
    173                                          "org.freedesktop.TestSuite",
    174                                          "Exit");
    175   dbus_connection_send (conn, method, NULL);
    176   dbus_message_unref (method);
    177 
    178   printf ("Success ***\n");
    179   exit (0);
    180 }
    181