From 0a402f8a835c4027501049f859bc939833722585 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Fri, 20 Jul 2012 12:43:51 +0100 Subject: [PATCH 03/16] _mcd_dispatcher_take_channels: make singular, rename to ...add_channel It was previously (transfer container), now it's (transfer none). --- src/mcd-connection.c | 12 ++---- src/mcd-dispatcher-priv.h | 6 ++- src/mcd-dispatcher.c | 91 ++++++++++++++------------------------------- 3 files changed, 36 insertions(+), 73 deletions(-) diff --git a/src/mcd-connection.c b/src/mcd-connection.c index 1d95815..f251849 100644 --- a/src/mcd-connection.c +++ b/src/mcd-connection.c @@ -573,9 +573,8 @@ on_new_channel (TpConnection *proxy, const gchar *chan_obj_path, * AddDispatchOperation or HandleChannels. * * We assume that channels without suppress_handler are incoming. */ - _mcd_dispatcher_take_channels (priv->dispatcher, - g_list_prepend (NULL, channel), - suppress_handler, suppress_handler); + _mcd_dispatcher_add_channel (priv->dispatcher, channel, + suppress_handler, suppress_handler); } } @@ -1269,7 +1268,6 @@ on_new_channels (TpConnection *proxy, const GPtrArray *channels, GValue *value; gboolean requested = FALSE; gboolean only_observe = FALSE; - GList *channel_list = NULL; McdChannel *channel; va = g_ptr_array_index (channels, i); @@ -1297,16 +1295,14 @@ on_new_channels (TpConnection *proxy, const GPtrArray *channels, MCD_MISSION (channel)); } - channel_list = g_list_prepend (channel_list, channel); - if (!requested) { /* we always dispatch unrequested (incoming) channels */ only_observe = FALSE; } - _mcd_dispatcher_take_channels (priv->dispatcher, channel_list, - requested, only_observe); + _mcd_dispatcher_add_channel (priv->dispatcher, channel, requested, + only_observe); } } diff --git a/src/mcd-dispatcher-priv.h b/src/mcd-dispatcher-priv.h index 82c7ad4..639d751 100644 --- a/src/mcd-dispatcher-priv.h +++ b/src/mcd-dispatcher-priv.h @@ -34,8 +34,10 @@ G_BEGIN_DECLS /* not exported */ -G_GNUC_INTERNAL void _mcd_dispatcher_take_channels ( - McdDispatcher *dispatcher, GList *channels, gboolean requested, +G_GNUC_INTERNAL void _mcd_dispatcher_add_channel ( + McdDispatcher *dispatcher, + McdChannel *channel, + gboolean requested, gboolean only_observe); G_GNUC_INTERNAL void _mcd_dispatcher_add_channel_request (McdDispatcher *dispatcher, diff --git a/src/mcd-dispatcher.c b/src/mcd-dispatcher.c index 19d11d6..9c17050 100644 --- a/src/mcd-dispatcher.c +++ b/src/mcd-dispatcher.c @@ -924,36 +924,35 @@ mcd_dispatcher_new (TpDBusDaemon *dbus_daemon, McdMaster *master) } /* - * _mcd_dispatcher_take_channels: + * _mcd_dispatcher_add_channel: * @dispatcher: the #McdDispatcher. - * @channels: a #GList of #McdChannel elements, each of which must own a - * #TpChannel + * @channel: (transfer none): a #McdChannel which must own a #TpChannel * @requested: whether the channels were requested by MC. * - * Dispatch @channels. The #GList @channels will be no longer valid after this - * function has been called. + * Add @channel to the dispatching state machine. */ void -_mcd_dispatcher_take_channels (McdDispatcher *dispatcher, GList *channels, - gboolean requested, gboolean only_observe) +_mcd_dispatcher_add_channel (McdDispatcher *dispatcher, + McdChannel *channel, + gboolean requested, + gboolean only_observe) { - GList *list; + GList *channels = NULL; + TpChannel *tp_channel = NULL; GList *tp_channels = NULL; GStrv possible_handlers; McdRequest *request = NULL; gboolean internal_request = FALSE; - if (channels == NULL) - { - DEBUG ("trivial case - no channels"); - return; - } + g_return_if_fail (MCD_IS_DISPATCHER (dispatcher)); + g_return_if_fail (MCD_IS_CHANNEL (channel)); - DEBUG ("%s channel %p (%s): %s", + DEBUG ("%s channel %p: %s", requested ? "requested" : "unrequested", - channels->data, - channels->next == NULL ? "only" : "and more", - mcd_channel_get_object_path (channels->data)); + channel, + mcd_channel_get_object_path (channel)); + + channels = g_list_prepend (NULL, channel); if (only_observe) { @@ -967,23 +966,13 @@ _mcd_dispatcher_take_channels (McdDispatcher *dispatcher, GList *channels, return; } - /* These channels must have the TpChannel part of McdChannel's double life. - * They might also have the McdRequest part. */ - for (list = channels; list != NULL; list = list->next) - { - TpChannel *tp_channel = mcd_channel_get_tp_channel (list->data); - - g_assert (tp_channel != NULL); - tp_channels = g_list_prepend (tp_channels, g_object_ref (tp_channel)); - - /* We take the channel request from the first McdChannel that (has|is) - * one.*/ - if (request == NULL) - { - request = _mcd_channel_get_request (list->data); - } - } + /* The channel must have the TpChannel part of McdChannel's double life. + * It might also have the McdRequest part. */ + tp_channel = mcd_channel_get_tp_channel (channel); + g_assert (tp_channel != NULL); + tp_channels = g_list_prepend (NULL, g_object_ref (tp_channel)); + request = _mcd_channel_get_request (channel); internal_request = _mcd_request_is_internal (request); /* See if there are any handlers that can take all these channels */ @@ -1000,37 +989,16 @@ _mcd_dispatcher_take_channels (McdDispatcher *dispatcher, GList *channels, if (possible_handlers == NULL) { - if (channels->next == NULL) - { - DEBUG ("One channel, which cannot be handled - making a CDO " - "anyway, to get Observers run"); - } - else - { - DEBUG ("Two or more channels, which cannot all be handled - " - "will split up the batch and try again"); - - while (channels != NULL) - { - list = channels; - channels = g_list_remove_link (channels, list); - _mcd_dispatcher_take_channels (dispatcher, list, requested, - FALSE); - } - - return; - } + DEBUG ("Channel cannot be handled - making a CDO " + "anyway, to get Observers run"); } else { - DEBUG ("%s handler(s) found, dispatching %u channels", - internal_request ? "internal" : "possible", - g_list_length (channels)); + DEBUG ("%s handler(s) found, dispatching channel", + internal_request ? "internal" : "possible"); } - for (list = channels; list != NULL; list = list->next) - _mcd_channel_set_status (MCD_CHANNEL (list->data), - MCD_CHANNEL_STATUS_DISPATCHING); + _mcd_channel_set_status (channel, MCD_CHANNEL_STATUS_DISPATCHING); _mcd_dispatcher_enter_state_machine (dispatcher, channels, (const gchar * const *) possible_handlers, requested, FALSE); @@ -1245,10 +1213,7 @@ _mcd_dispatcher_recover_channel (McdDispatcher *dispatcher, DEBUG ("%s is unhandled, redispatching", path); requested = mcd_channel_is_requested (channel); - _mcd_dispatcher_take_channels (dispatcher, - g_list_prepend (NULL, channel), - requested, - FALSE); + _mcd_dispatcher_add_channel (dispatcher, channel, requested, FALSE); } } -- 1.7.10.4