| /** |
| * Test to make sure late thread initialization works |
| */ |
| |
| #include <config.h> |
| #include <dbus/dbus.h> |
| #include <dbus/dbus-sysdeps.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| #include <dbus/dbus-internals.h> |
| #include <dbus/dbus-connection-internal.h> |
| |
| static void |
| _run_iteration (DBusConnection *conn) |
| { |
| DBusPendingCall *echo_pending; |
| DBusPendingCall *dbus_pending; |
| DBusMessage *method; |
| DBusMessage *reply; |
| char *echo = "echo"; |
| |
| /* send the first message */ |
| method = dbus_message_new_method_call ("org.freedesktop.DBus.TestSuiteEchoService", |
| "/org/freedesktop/TestSuite", |
| "org.freedesktop.TestSuite", |
| "Echo"); |
| |
| dbus_message_append_args (method, DBUS_TYPE_STRING, &echo, NULL); |
| dbus_connection_send_with_reply (conn, method, &echo_pending, -1); |
| dbus_message_unref (method); |
| |
| /* send the second message */ |
| method = dbus_message_new_method_call (DBUS_SERVICE_DBUS, |
| DBUS_PATH_DBUS, |
| "org.freedesktop.Introspectable", |
| "Introspect"); |
| |
| dbus_connection_send_with_reply (conn, method, &dbus_pending, -1); |
| dbus_message_unref (method); |
| |
| /* block on the second message (should return immediately) */ |
| dbus_pending_call_block (dbus_pending); |
| |
| /* block on the first message */ |
| /* if it does not return immediately chances |
| are we hit the block in poll bug */ |
| dbus_pending_call_block (echo_pending); |
| |
| /* check the reply only to make sure we |
| are not getting errors unrelated |
| to the block in poll bug */ |
| reply = dbus_pending_call_steal_reply (echo_pending); |
| |
| if (reply == NULL) |
| { |
| printf ("Failed: Reply is NULL ***\n"); |
| exit (1); |
| } |
| |
| if (dbus_message_get_type (reply) == DBUS_MESSAGE_TYPE_ERROR) |
| { |
| printf ("Failed: Reply is error: %s ***\n", dbus_message_get_error_name (reply)); |
| exit (1); |
| } |
| |
| dbus_message_unref (reply); |
| dbus_pending_call_unref (dbus_pending); |
| dbus_pending_call_unref (echo_pending); |
| |
| } |
| static void |
| check_mutex_lock (DBusMutex *mutex1, |
| DBusMutex *mutex2, |
| dbus_bool_t is_same) |
| { |
| _dbus_assert (mutex1 != NULL); |
| _dbus_assert (mutex2 != NULL); |
| |
| if (is_same) |
| { |
| _dbus_assert (mutex1 == mutex2); |
| } |
| else |
| { |
| _dbus_assert (mutex1 != mutex2); |
| } |
| } |
| |
| static void |
| check_condvar_lock (DBusCondVar *condvar1, |
| DBusCondVar *condvar2, |
| dbus_bool_t is_same) |
| { |
| _dbus_assert (condvar1 != NULL); |
| _dbus_assert (condvar2 != NULL); |
| |
| if (is_same) |
| { |
| _dbus_assert (condvar1 == condvar2); |
| } |
| else |
| { |
| _dbus_assert (condvar1 != condvar2); |
| } |
| } |
| |
| |
| int |
| main (int argc, char *argv[]) |
| { |
| DBusMessage *method; |
| DBusConnection *conn; |
| DBusError error; |
| DBusMutex *mutex1, *dispatch_mutex1, *io_path_mutex1; |
| DBusCondVar *dispatch_cond1, *io_path_cond1; |
| DBusMutex *mutex2, *dispatch_mutex2, *io_path_mutex2; |
| DBusCondVar *dispatch_cond2, *io_path_cond2; |
| |
| printf ("*** Testing late thread init\n"); |
| |
| dbus_error_init (&error); |
| |
| conn = dbus_bus_get (DBUS_BUS_SESSION, &error); |
| |
| _dbus_connection_test_get_locks (conn, &mutex1, |
| &dispatch_mutex1, |
| &io_path_mutex1, |
| &dispatch_cond1, |
| &io_path_cond1); |
| _run_iteration (conn); |
| _dbus_connection_test_get_locks (conn, &mutex2, |
| &dispatch_mutex2, |
| &io_path_mutex2, |
| &dispatch_cond2, |
| &io_path_cond2); |
| |
| check_mutex_lock (mutex1, mutex2, TRUE); |
| check_mutex_lock (dispatch_mutex1, dispatch_mutex2, TRUE); |
| check_mutex_lock (io_path_mutex1, io_path_mutex2, TRUE); |
| check_condvar_lock (dispatch_cond1, dispatch_cond2, TRUE); |
| check_condvar_lock (io_path_cond1, io_path_cond2, TRUE); |
| |
| dbus_threads_init_default (); |
| |
| _dbus_connection_test_get_locks (conn, &mutex1, |
| &dispatch_mutex1, |
| &io_path_mutex1, |
| &dispatch_cond1, |
| &io_path_cond1); |
| |
| check_mutex_lock (mutex1, mutex2, FALSE); |
| check_mutex_lock (dispatch_mutex1, dispatch_mutex2, FALSE); |
| check_mutex_lock (io_path_mutex1, io_path_mutex2, FALSE); |
| check_condvar_lock (dispatch_cond1, dispatch_cond2, FALSE); |
| check_condvar_lock (io_path_cond1, io_path_cond2, FALSE); |
| |
| _run_iteration (conn); |
| _dbus_connection_test_get_locks (conn, &mutex2, |
| &dispatch_mutex2, |
| &io_path_mutex2, |
| &dispatch_cond2, |
| &io_path_cond2); |
| |
| check_mutex_lock (mutex1, mutex2, TRUE); |
| check_mutex_lock (dispatch_mutex1, dispatch_mutex2, TRUE); |
| check_mutex_lock (io_path_mutex1, io_path_mutex2, TRUE); |
| check_condvar_lock (dispatch_cond1, dispatch_cond2, TRUE); |
| check_condvar_lock (io_path_cond1, io_path_cond2, TRUE); |
| |
| method = dbus_message_new_method_call ("org.freedesktop.TestSuiteEchoService", |
| "/org/freedesktop/TestSuite", |
| "org.freedesktop.TestSuite", |
| "Exit"); |
| dbus_connection_send (conn, method, NULL); |
| dbus_message_unref (method); |
| |
| printf ("Success ***\n"); |
| exit (0); |
| } |