[telepathy-mission-control/telepathy-mission-control-5.2] 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