diff --git a/gio/gdbusnamewatching.c b/gio/gdbusnamewatching.c index f74952a19..c103bb484 100644 --- a/gio/gdbusnamewatching.c +++ b/gio/gdbusnamewatching.c @@ -148,6 +148,11 @@ call_handler_data_free (CallHandlerData *data) static void actually_do_call (Client *client, GDBusConnection *connection, const gchar *name_owner, CallType call_type) { + /* The client might have been cancelled (g_bus_unwatch_name()) while we were + * sitting in the #GMainContext dispatch queue. */ + if (client->cancelled) + return; + switch (call_type) { case CALL_TYPE_NAME_APPEARED: @@ -234,13 +239,12 @@ call_appeared_handler (Client *client) } static void -call_vanished_handler (Client *client, - gboolean ignore_cancelled) +call_vanished_handler (Client *client) { if (client->previous_call != PREVIOUS_CALL_VANISHED) { client->previous_call = PREVIOUS_CALL_VANISHED; - if (((!client->cancelled) || ignore_cancelled) && client->name_vanished_handler != NULL) + if (!client->cancelled && client->name_vanished_handler != NULL) { do_call (client, CALL_TYPE_NAME_VANISHED); } @@ -296,7 +300,7 @@ on_connection_disconnected (GDBusConnection *connection, client->name_owner_changed_subscription_id = 0; client->connection = NULL; - call_vanished_handler (client, FALSE); + call_vanished_handler (client); client_unref (client); } @@ -345,7 +349,7 @@ on_name_owner_changed (GDBusConnection *connection, { g_free (client->name_owner); client->name_owner = NULL; - call_vanished_handler (client, FALSE); + call_vanished_handler (client); } if (new_owner != NULL && strlen (new_owner) > 0) @@ -390,7 +394,7 @@ get_name_owner_cb (GObject *source_object, } else { - call_vanished_handler (client, FALSE); + call_vanished_handler (client); } client->initialized = TRUE; @@ -450,7 +454,7 @@ start_service_by_name_cb (GObject *source_object, else { g_warning ("Unexpected reply %d from StartServiceByName() method", start_service_result); - call_vanished_handler (client, FALSE); + call_vanished_handler (client); client->initialized = TRUE; } } @@ -529,7 +533,7 @@ connection_get_cb (GObject *source_object, client->connection = g_bus_get_finish (res, NULL); if (client->connection == NULL) { - call_vanished_handler (client, FALSE); + call_vanished_handler (client); goto out; }