diff options
Diffstat (limited to 'client')
-rw-r--r-- | client/gvfsdaemondbus.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/client/gvfsdaemondbus.c b/client/gvfsdaemondbus.c index e12d2936..f8deb097 100644 --- a/client/gvfsdaemondbus.c +++ b/client/gvfsdaemondbus.c @@ -365,10 +365,8 @@ cancelled_got_proxy (GObject *source_object, g_object_unref (proxy); } -/* Might be called on another thread */ -static void -async_call_cancelled_cb (GCancellable *cancellable, - gpointer _data) +static gboolean +async_call_cancelled_cb_on_idle (gpointer _data) { AsyncCallCancelData *data = _data; @@ -380,6 +378,29 @@ async_call_cancelled_cb (GCancellable *cancellable, NULL, cancelled_got_proxy, GUINT_TO_POINTER (data->serial)); /* not passing "data" in as long it may not exist anymore between async calls */ + + return FALSE; +} + +/* Might be called on another thread */ +static void +async_call_cancelled_cb (GCancellable *cancellable, + gpointer _data) +{ + AsyncCallCancelData *data = _data; + AsyncCallCancelData *idle_data; + + idle_data = g_new0 (AsyncCallCancelData, 1); + idle_data->connection = g_object_ref (data->connection); + idle_data->serial = data->serial; + + /* Call on idle to not block g_cancellable_disconnect() as it causes deadlocks + * in gdbus codes, see: https://gitlab.gnome.org/GNOME/glib/issues/1023. + */ + g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, + async_call_cancelled_cb_on_idle, + idle_data, + async_call_cancel_data_free); } gulong |