[PATCH] Privatize the DBusPendingCall struct

Havoc Pennington hp at redhat.com
Mon Jul 10 18:37:49 PDT 2006


Hi,

Nice work, some minor comments:

John (J5) Palmieri wrote:
> +/** @} End of DBusPendingCallInternals */
> +
>  /**
>   * @defgroup DBusPendingCallInternals DBusPendingCall implementation details
>   * @ingroup DBusInternals

You can probably merge these two group sections (just move this defgroup 
up to replace the addtogroup)

>  /**
> + * Completes a pending call with the given message,
> + * or if the message is #NULL, by timing out the pending call.
> + * 
> + * @param pending the pending call
> + * @param message the message to complete the call with, or #NULL
> + *  to time out the call
> + */
> +void
> +_dbus_pending_call_complete (DBusPendingCall *pending,
> +                             DBusMessage     *message)
> +{

It might be good to rename this to set_reply() instead of complete() - 
complete() implies to me that it would also call the notifier.

> +/**
>   * Calls notifier function for the pending call
>   * and sets the call to completed.
>   *
> @@ -124,6 +189,18 @@

Not sure what function the above documents but it sounds more like 
complete() - I probably called it something weird

> +void
> +_dbus_pending_call_queue_synthesized_message_link_on_connection (DBusPendingCall *pending, 
> +                                                                 DBusConnection *connection)
> +{
> +  if (pending->timeout_link)
> +    {
> +      _dbus_connection_queue_synthesized_message_link (connection,
> +						       pending->timeout_link);
> +      pending->timeout_link = NULL;
> +    }
> +}

I'd call this maybe _dbus_pending_call_queue_timeout_error()

> +/**
> + * Sets the connection associated with the pending call
> + *
> + * @param pending the pending_call
> + * @param connection the connection which is associated with the pending call
> + */
> +void
> +dbus_pending_call_set_connection (DBusPendingCall *pending,
> +                                  DBusConnection *connection)
> +{
> +  _dbus_return_if_fail (pending != NULL);  
> +
> +  pending->connection = connection;
> +}

For this patch I'd leave this here and just make sure it's 
private/internal - it's good how you kept this patch as just a 
mechanical transformation of the previous code, rather than mixing 
moving stuff around and changing said stuff.

I agree with you though that this function should go away, it does not 
make any sense to change the connection to anything other than the 
original connection.

The trick if PendingCall holds a ref to the connection will be to avoid 
the refcount cycle. I think it's pretty simple; all the pending calls 
have to get completed on disconnect (via timeout or reply), and be sure 
pending calls can't be created while disconnected. IOW the invariant is 
that the number of pending calls on the connection must be 0 after the 
connection is disconnected.

> +
> +/**
> + * Sets the reply message associated with the pending call
> + *
> + * @param pending the pending_call
> + * @param reply the reply message associated with the pending call
> + */
> +dbus_bool_t
> +_dbus_pending_call_set_reply (DBusPendingCall *pending,
> +                              DBusMessage *reply)
> +{
> +  DBusList *reply_link;
> +  reply_link = _dbus_list_alloc_link (reply);
> +  if (reply_link == NULL)
> +    return FALSE;
> +
> +  pending->timeout_link = reply_link;
> +  
> +  return TRUE;
> +}

I would call this set_timeout_error or something like that; set_reply() 
I'd expect to be used for setting the actual reply.

Havoc



More information about the dbus mailing list