diff options
author | Havoc Pennington <hp@redhat.com> | 2005-02-13 18:17:35 +0000 |
---|---|---|
committer | Havoc Pennington <hp@redhat.com> | 2005-02-13 18:17:35 +0000 |
commit | 46ee60868d98a01df7c2d879a5349673f72c1757 (patch) | |
tree | f4b77424b1d105d584ea75c3e2f1a3c206169a40 | |
parent | f349e6b8c50ea6faa48c8261198cf1b07bf59a79 (diff) |
2005-02-13 Havoc Pennington <hp@redhat.com>
* dbus/dbus-connection.c: use separate mutexes for the condition
variables; this is some kind of baseline for sanity, but the
condition variables still aren't used correctly afaict
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | dbus/dbus-connection.c | 53 |
2 files changed, 38 insertions, 21 deletions
@@ -1,5 +1,11 @@ 2005-02-13 Havoc Pennington <hp@redhat.com> + * dbus/dbus-connection.c: use separate mutexes for the condition + variables; this is some kind of baseline for sanity, but the + condition variables still aren't used correctly afaict + +2005-02-13 Havoc Pennington <hp@redhat.com> + * dbus/dbus-object-tree.c (handle_default_introspect_and_unlock): fix a double-unlock diff --git a/dbus/dbus-connection.c b/dbus/dbus-connection.c index cac4fc8c..0cfb2651 100644 --- a/dbus/dbus-connection.c +++ b/dbus/dbus-connection.c @@ -188,8 +188,10 @@ struct DBusConnection DBusMutex *mutex; /**< Lock on the entire DBusConnection */ - DBusCondVar *dispatch_cond; /**< Protects dispatch() */ - DBusCondVar *io_path_cond; /**< Protects transport io path */ + DBusMutex *dispatch_mutex; /**< Protects dispatch() */ + DBusCondVar *dispatch_cond; /**< Notify when dispatch_mutex is available */ + DBusMutex *io_path_mutex; /**< Protects transport io path */ + DBusCondVar *io_path_cond; /**< Notify when io_path_mutex is available */ DBusList *outgoing_messages; /**< Queue of messages we need to send, send the end of the list first. */ DBusList *incoming_messages; /**< Queue of messages we have received, end of the list received most recently. */ @@ -896,7 +898,7 @@ _dbus_pending_call_complete_and_unlock (DBusPendingCall *pending, /** * Acquire the transporter I/O path. This must be done before * doing any I/O in the transporter. May sleep and drop the - * connection mutex while waiting for the I/O path. + * IO path mutex while waiting for the I/O path. * * @param connection the connection. * @param timeout_milliseconds maximum blocking time, or -1 for no limit. @@ -913,20 +915,12 @@ _dbus_connection_acquire_io_path (DBusConnection *connection, if (connection->io_path_acquired) { -#ifndef DBUS_DISABLE_CHECKS - connection->have_connection_lock = FALSE; -#endif - if (timeout_milliseconds != -1) res = dbus_condvar_wait_timeout (connection->io_path_cond, - connection->mutex, + connection->io_path_mutex, timeout_milliseconds); else - dbus_condvar_wait (connection->io_path_cond, connection->mutex); - -#ifndef DBUS_DISABLE_CHECKS - connection->have_connection_lock = TRUE; -#endif + dbus_condvar_wait (connection->io_path_cond, connection->io_path_mutex); } if (res) @@ -1030,6 +1024,8 @@ _dbus_connection_new_for_transport (DBusTransport *transport) DBusTimeoutList *timeout_list; DBusHashTable *pending_replies; DBusMutex *mutex; + DBusMutex *io_path_mutex; + DBusMutex *dispatch_mutex; DBusCondVar *message_returned_cond; DBusCondVar *dispatch_cond; DBusCondVar *io_path_cond; @@ -1043,6 +1039,8 @@ _dbus_connection_new_for_transport (DBusTransport *transport) pending_replies = NULL; timeout_list = NULL; mutex = NULL; + io_path_mutex = NULL; + dispatch_mutex = NULL; message_returned_cond = NULL; dispatch_cond = NULL; io_path_cond = NULL; @@ -1073,6 +1071,14 @@ _dbus_connection_new_for_transport (DBusTransport *transport) mutex = dbus_mutex_new (); if (mutex == NULL) goto error; + + io_path_mutex = dbus_mutex_new (); + if (io_path_mutex == NULL) + goto error; + + dispatch_mutex = dbus_mutex_new (); + if (dispatch_mutex == NULL) + goto error; message_returned_cond = dbus_condvar_new (); if (message_returned_cond == NULL) @@ -1111,7 +1117,9 @@ _dbus_connection_new_for_transport (DBusTransport *transport) connection->refcount.value = 1; connection->mutex = mutex; connection->dispatch_cond = dispatch_cond; + connection->dispatch_mutex = dispatch_mutex; connection->io_path_cond = io_path_cond; + connection->io_path_mutex = io_path_mutex; connection->message_returned_cond = message_returned_cond; connection->transport = transport; connection->watches = watch_list; @@ -1162,6 +1170,12 @@ _dbus_connection_new_for_transport (DBusTransport *transport) if (mutex != NULL) dbus_mutex_free (mutex); + if (io_path_mutex != NULL) + dbus_mutex_free (io_path_mutex); + + if (dispatch_mutex != NULL) + dbus_mutex_free (dispatch_mutex); + if (connection != NULL) dbus_free (connection); @@ -1483,7 +1497,10 @@ _dbus_connection_last_unref (DBusConnection *connection) dbus_condvar_free (connection->dispatch_cond); dbus_condvar_free (connection->io_path_cond); dbus_condvar_free (connection->message_returned_cond); - + + dbus_mutex_free (connection->io_path_mutex); + dbus_mutex_free (connection->dispatch_mutex); + dbus_mutex_free (connection->mutex); dbus_free (connection); @@ -2666,13 +2683,7 @@ _dbus_connection_acquire_dispatch (DBusConnection *connection) { if (connection->dispatch_acquired) { -#ifndef DBUS_DISABLE_CHECKS - connection->have_connection_lock = FALSE; -#endif - dbus_condvar_wait (connection->dispatch_cond, connection->mutex); -#ifndef DBUS_DISABLE_CHECKS - connection->have_connection_lock = TRUE; -#endif + dbus_condvar_wait (connection->dispatch_cond, connection->dispatch_mutex); } _dbus_assert (!connection->dispatch_acquired); |