X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dbus%2Fdbus-connection.c;h=4923812ed5bec44b3998fffed620d4ff1971a3c5;hb=bd6d8d261df61ed8b396434e5a80285d43184d6c;hp=77b0a3699093ed81d1d896120b7ff285432e84b6;hpb=56ff62410ae5b017ed4a407a46c581e92672a469;p=platform%2Fupstream%2Fdbus.git diff --git a/dbus/dbus-connection.c b/dbus/dbus-connection.c index 77b0a36..4923812 100644 --- a/dbus/dbus-connection.c +++ b/dbus/dbus-connection.c @@ -1246,9 +1246,9 @@ _dbus_connection_do_iteration_unlocked (DBusConnection *connection, * * @param transport the transport. * @returns the new connection, or #NULL on failure. - */ -DBusConnection* -_dbus_connection_new_for_transport (DBusTransport *transport) +*/ +static DBusConnection* +_dbus_connection_new_for_transport_internal (DBusTransport *transport, dbus_bool_t exists) { DBusConnection *connection; DBusWatchList *watch_list; @@ -1278,7 +1278,7 @@ _dbus_connection_new_for_transport (DBusTransport *transport) pending_replies = _dbus_hash_table_new (DBUS_HASH_INT, - NULL, + NULL, (DBusFreeFunction)free_pending_call_on_hash_removal); if (pending_replies == NULL) goto error; @@ -1359,18 +1359,21 @@ _dbus_connection_new_for_transport (DBusTransport *transport) connection->disconnect_message_link = disconnect_link; - CONNECTION_LOCK (connection); - - if (!_dbus_transport_set_connection (transport, connection)) - { - CONNECTION_UNLOCK (connection); + if(!exists) + { + CONNECTION_LOCK (connection); - goto error; - } + if (!_dbus_transport_set_connection (transport, connection)) + { + CONNECTION_UNLOCK (connection); - _dbus_transport_ref (transport); + goto error; + } - CONNECTION_UNLOCK (connection); + _dbus_transport_ref (transport); + + CONNECTION_UNLOCK (connection); + } _dbus_connection_trace_ref (connection, 0, 1, "new_for_transport"); return connection; @@ -1411,6 +1414,27 @@ _dbus_connection_new_for_transport (DBusTransport *transport) } /** + * Creates a new connection for the given transport. A transport + * represents a message stream that uses some concrete mechanism, such + * as UNIX domain sockets. May return #NULL if insufficient + * memory exists to create the connection. + * + * @param transport the transport. + * @returns the new connection, or #NULL on failure. + */ +DBusConnection* +_dbus_connection_new_for_transport (DBusTransport *transport) +{ + return _dbus_connection_new_for_transport_internal(transport, FALSE); +} + +DBusConnection* +_dbus_connection_new_for_used_transport (DBusTransport *transport) +{ + return _dbus_connection_new_for_transport_internal(transport, TRUE); +} + +/** * Increments the reference count of a DBusConnection. * Requires that the caller already holds the connection lock. * @@ -2678,12 +2702,8 @@ free_outgoing_message (void *element, dbus_message_unref (message); } -/* This is run without the mutex held, but after the last reference - * to the connection has been dropped we should have no thread-related - * problems - */ static void -_dbus_connection_last_unref (DBusConnection *connection) +_dbus_connection_last_unref_internal (DBusConnection *connection, dbus_bool_t unref_transport) { DBusList *link; @@ -2738,17 +2758,18 @@ _dbus_connection_last_unref (DBusConnection *connection) _dbus_list_foreach (&connection->outgoing_messages, free_outgoing_message, - connection); + connection); _dbus_list_clear (&connection->outgoing_messages); _dbus_list_foreach (&connection->incoming_messages, - (DBusForeachFunction) dbus_message_unref, - NULL); + (DBusForeachFunction) dbus_message_unref, + NULL); _dbus_list_clear (&connection->incoming_messages); _dbus_counter_unref (connection->outgoing_counter); - _dbus_transport_unref (connection->transport); + if(unref_transport) + _dbus_transport_unref (connection->transport); if (connection->disconnect_message_link) { @@ -2770,6 +2791,16 @@ _dbus_connection_last_unref (DBusConnection *connection) dbus_free (connection); } +/* This is run without the mutex held, but after the last reference + * to the connection has been dropped we should have no thread-related + * problems + */ +static void +_dbus_connection_last_unref (DBusConnection *connection) +{ + _dbus_connection_last_unref_internal(connection, TRUE); +} + /** * Decrements the reference count of a DBusConnection, and finalizes * it if the count reaches zero. @@ -2818,6 +2849,22 @@ dbus_connection_unref (DBusConnection *connection) } } +void +dbus_connection_unref_phantom (DBusConnection *connection) +{ + dbus_int32_t old_refcount; + + _dbus_return_if_fail (connection != NULL); + _dbus_return_if_fail (connection->generation == _dbus_current_generation); + + old_refcount = _dbus_atomic_dec (&connection->refcount); + + _dbus_connection_trace_ref (connection, old_refcount, old_refcount - 1, "unref"); + + if (old_refcount == 1) + _dbus_connection_last_unref_internal(connection, FALSE); +} + /* * Note that the transport can disconnect itself (other end drops us) * and in that case this function never runs. So this function must