[telepathy-mission-control/master] McdDispatchOperation: don't allow Claim() to return successfully until we're allowed to finish
Simon McVittie
simon.mcvittie at collabora.co.uk
Tue Aug 25 09:23:10 PDT 2009
In particular, if some approvers haven't returned yet, don't allow the
dispatch operation to be claimed from under them.
---
src/mcd-dispatch-operation.c | 21 ++++++++++++++++++---
1 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/src/mcd-dispatch-operation.c b/src/mcd-dispatch-operation.c
index 6ad1d16..79f7ce3 100644
--- a/src/mcd-dispatch-operation.c
+++ b/src/mcd-dispatch-operation.c
@@ -85,6 +85,7 @@ struct _McdDispatchOperationPrivate
guint finished : 1;
gchar *handler;
gchar *claimer;
+ DBusGMethodInvocation *claim_context;
/* DBUS connection */
TpDBusDaemon *dbus_daemon;
@@ -213,6 +214,18 @@ properties_iface_init (TpSvcDBusPropertiesClass *iface, gpointer iface_data)
#undef IMPLEMENT
}
+static void
+mcd_dispatch_operation_actually_finish (McdDispatchOperation *self)
+{
+ tp_svc_channel_dispatch_operation_emit_finished (self);
+
+ if (self->priv->claim_context != NULL)
+ {
+ tp_svc_channel_dispatch_operation_return_from_claim (self->priv->claim_context);
+ self->priv->claim_context = NULL;
+ }
+}
+
gboolean
_mcd_dispatch_operation_finish (McdDispatchOperation *operation)
{
@@ -228,7 +241,7 @@ _mcd_dispatch_operation_finish (McdDispatchOperation *operation)
if (priv->block_finished == 0)
{
DEBUG ("%s/%p has finished", priv->unique_name, operation);
- tp_svc_channel_dispatch_operation_emit_finished (operation);
+ mcd_dispatch_operation_actually_finish (operation);
}
else
{
@@ -273,8 +286,10 @@ dispatch_operation_claim (TpSvcChannelDispatchOperation *self,
return;
}
+ g_assert (priv->claimer == NULL);
+ g_assert (priv->claim_context == NULL);
priv->claimer = dbus_g_method_get_sender (context);
- tp_svc_channel_dispatch_operation_return_from_claim (context);
+ priv->claim_context = context;
_mcd_dispatch_operation_finish (MCD_DISPATCH_OPERATION (self));
}
@@ -801,7 +816,7 @@ _mcd_dispatch_operation_unblock_finished (McdDispatchOperation *self)
if (self->priv->finished)
{
DEBUG ("%s/%p finished", self->priv->unique_name, self);
- tp_svc_channel_dispatch_operation_emit_finished (self);
+ mcd_dispatch_operation_actually_finish (self);
}
}
}
--
1.5.6.5
More information about the telepathy-commits
mailing list