X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dbus%2Fdbus-bus.c;h=3b775c76d547c3c854580f945751ebad4f650785;hb=383f596c4aee2561c90abca3ce9d1f52407a3eec;hp=ea4b148263ac13370a82e01914184a02aaf17ca9;hpb=e7677fc83cbec9da1479b499f565a73897cd2240;p=platform%2Fupstream%2Fdbus.git diff --git a/dbus/dbus-bus.c b/dbus/dbus-bus.c index ea4b148..3b775c7 100644 --- a/dbus/dbus-bus.c +++ b/dbus/dbus-bus.c @@ -95,19 +95,6 @@ static DBusBusType activation_bus_type = DBUS_BUS_STARTER; static dbus_bool_t initialized = FALSE; -/** - * Lock for globals in this file - */ -_DBUS_DEFINE_GLOBAL_LOCK (bus); - -/** - * Global lock covering all BusData on any connection. The bet is - * that some lock contention is better than more memory - * for a per-connection lock, but it's tough to imagine it mattering - * either way. - */ -_DBUS_DEFINE_GLOBAL_LOCK (bus_datas); - static void addresses_shutdown_func (void *data) { @@ -192,12 +179,12 @@ init_session_address (void) if (!retval) return FALSE; - /* The DBUS_SESSION_BUS_DEFAULT_ADDRESS should have really been named - * DBUS_SESSION_BUS_FALLBACK_ADDRESS. - */ + /* We have a hard-coded (but compile-time-configurable) fallback address for + * the session bus. */ if (bus_connection_addresses[DBUS_BUS_SESSION] == NULL) bus_connection_addresses[DBUS_BUS_SESSION] = - _dbus_strdup (DBUS_SESSION_BUS_DEFAULT_ADDRESS); + _dbus_strdup (DBUS_SESSION_BUS_CONNECT_ADDRESS); + if (bus_connection_addresses[DBUS_BUS_SESSION] == NULL) return FALSE; @@ -330,7 +317,11 @@ bus_data_free (void *data) if (bd->is_well_known) { int i; - _DBUS_LOCK (bus); + + if (!_DBUS_LOCK (bus)) + _dbus_assert_not_reached ("global locks should have been initialized " + "when we attached bus data"); + /* We may be stored in more than one slot */ /* This should now be impossible - these slots are supposed to * be cleared on disconnect, so should not need to be cleared on @@ -401,8 +392,13 @@ void _dbus_bus_notify_shared_connection_disconnected_unlocked (DBusConnection *connection) { int i; - - _DBUS_LOCK (bus); + + if (!_DBUS_LOCK (bus)) + { + /* If it was in bus_connections, we would have initialized global locks + * when we added it. So, it can't be. */ + return; + } /* We are expecting to have the connection saved in only one of these * slots, but someone could in a pathological case set system and session @@ -434,15 +430,21 @@ internal_bus_get (DBusBusType type, _dbus_return_val_if_fail (type >= 0 && type < N_BUS_TYPES, NULL); _dbus_return_val_if_error_is_set (error, NULL); - _DBUS_LOCK (bus); + connection = NULL; - if (!init_connections_unlocked ()) + if (!_DBUS_LOCK (bus)) { - _DBUS_UNLOCK (bus); _DBUS_SET_OOM (error); + /* do not "goto out", that would try to unlock */ return NULL; } + if (!init_connections_unlocked ()) + { + _DBUS_SET_OOM (error); + goto out; + } + /* We want to use the activation address even if the * activating bus is the session or system bus, * per the spec. @@ -462,9 +464,7 @@ internal_bus_get (DBusBusType type, { connection = bus_connections[type]; dbus_connection_ref (connection); - - _DBUS_UNLOCK (bus); - return connection; + goto out; } address = bus_connection_addresses[address_type]; @@ -472,8 +472,7 @@ internal_bus_get (DBusBusType type, { dbus_set_error (error, DBUS_ERROR_FAILED, "Unable to determine the address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for help)"); - _DBUS_UNLOCK (bus); - return NULL; + goto out; } if (private) @@ -483,19 +482,15 @@ internal_bus_get (DBusBusType type, if (!connection) { - _DBUS_ASSERT_ERROR_IS_SET (error); - _DBUS_UNLOCK (bus); - return NULL; + goto out; } if (!dbus_bus_register (connection, error)) { - _DBUS_ASSERT_ERROR_IS_SET (error); _dbus_connection_close_possibly_shared (connection); dbus_connection_unref (connection); - - _DBUS_UNLOCK (bus); - return NULL; + connection = NULL; + goto out; } if (!private) @@ -512,18 +507,22 @@ internal_bus_get (DBusBusType type, */ dbus_connection_set_exit_on_disconnect (connection, TRUE); - - _DBUS_LOCK (bus_datas); + + if (!_DBUS_LOCK (bus_datas)) + _dbus_assert_not_reached ("global locks were initialized already"); + bd = ensure_bus_data (connection); _dbus_assert (bd != NULL); /* it should have been created on register, so OOM not possible */ bd->is_well_known = TRUE; _DBUS_UNLOCK (bus_datas); - - _DBUS_UNLOCK (bus); +out: + /* Return a reference to the caller, or NULL with error set. */ + if (connection == NULL) + _DBUS_ASSERT_ERROR_IS_SET (error); - /* Return a reference to the caller */ + _DBUS_UNLOCK (bus); return connection; } @@ -558,7 +557,7 @@ internal_bus_get (DBusBusType type, * * @param type bus type * @param error address where an error can be returned. - * @returns a #DBusConnection with new ref + * @returns a #DBusConnection with new ref or #NULL on error */ DBusConnection * dbus_bus_get (DBusBusType type, @@ -661,25 +660,30 @@ dbus_bus_register (DBusConnection *connection, _dbus_return_val_if_error_is_set (error, FALSE); retval = FALSE; + message = NULL; + reply = NULL; - _DBUS_LOCK (bus_datas); + if (!_DBUS_LOCK (bus_datas)) + { + _DBUS_SET_OOM (error); + /* do not "goto out", that would try to unlock */ + return FALSE; + } bd = ensure_bus_data (connection); if (bd == NULL) { _DBUS_SET_OOM (error); - _DBUS_UNLOCK (bus_datas); - return FALSE; + goto out; } if (bd->unique_name != NULL) { _dbus_verbose ("Ignoring attempt to register the same DBusConnection %s with the message bus a second time.\n", bd->unique_name); - _DBUS_UNLOCK (bus_datas); - /* Success! */ - return TRUE; + retval = TRUE; + goto out; } message = dbus_message_new_method_call (DBUS_SERVICE_DBUS, @@ -690,15 +694,11 @@ dbus_bus_register (DBusConnection *connection, if (!message) { _DBUS_SET_OOM (error); - - _DBUS_UNLOCK (bus_datas); - return FALSE; + goto out; } reply = dbus_connection_send_with_reply_and_block (connection, message, -1, error); - dbus_message_unref (message); - if (reply == NULL) goto out; else if (dbus_set_error_from_message (error, reply)) @@ -718,14 +718,17 @@ dbus_bus_register (DBusConnection *connection, retval = TRUE; out: + _DBUS_UNLOCK (bus_datas); + + if (message) + dbus_message_unref (message); + if (reply) dbus_message_unref (reply); if (!retval) _DBUS_ASSERT_ERROR_IS_SET (error); - _DBUS_UNLOCK (bus_datas); - return retval; } @@ -774,8 +777,12 @@ dbus_bus_set_unique_name (DBusConnection *connection, _dbus_return_val_if_fail (connection != NULL, FALSE); _dbus_return_val_if_fail (unique_name != NULL, FALSE); - _DBUS_LOCK (bus_datas); - + if (!_DBUS_LOCK (bus_datas)) + { + /* do not "goto out", that would try to unlock */ + return FALSE; + } + bd = ensure_bus_data (connection); if (bd == NULL) goto out; @@ -817,8 +824,13 @@ dbus_bus_get_unique_name (DBusConnection *connection) _dbus_return_val_if_fail (connection != NULL, NULL); - _DBUS_LOCK (bus_datas); - + if (!_DBUS_LOCK (bus_datas)) + { + /* We'd have initialized locks when we gave it its unique name, if it + * had one. Don't "goto out", that would try to unlock. */ + return NULL; + } + bd = ensure_bus_data (connection); if (bd == NULL) goto out;