From: Benjamin Otte Date: Mon, 13 Dec 2021 00:41:04 +0000 (+0100) Subject: x11: Keep a reference to the SelectionOutputStream while writing X-Git-Tag: archive/raspbian/4.6.5+ds-1+rpi1~1^2~19^2~5^2~65^2~3 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=645d4807c3ab0b6ac20cb08f16f39893a95bd2f2;p=gtk4.git x11: Keep a reference to the SelectionOutputStream while writing This ensures close() isn't called from dispose() while we're still busy writing. In theory this should never happen, but in practice it just did. --- diff --git a/gdk/x11/gdkselectionoutputstream-x11.c b/gdk/x11/gdkselectionoutputstream-x11.c index b9aad4c3f3..7b45638dd3 100644 --- a/gdk/x11/gdkselectionoutputstream-x11.c +++ b/gdk/x11/gdkselectionoutputstream-x11.c @@ -57,7 +57,7 @@ struct _GdkX11SelectionOutputStreamPrivate { GTask *pending_task; guint incr : 1; - guint delete_pending : 1; + guint delete_pending : 1; /* owns a reference */ }; struct _GdkX11PendingSelectionNotify @@ -292,6 +292,7 @@ gdk_x11_selection_output_stream_perform_flush (GdkX11SelectionOutputStream *stre priv->notify = NULL; } + g_object_ref (stream); priv->delete_pending = TRUE; g_cond_broadcast (&priv->cond); g_mutex_unlock (&priv->mutex); @@ -628,6 +629,7 @@ gdk_x11_selection_output_stream_xevent (GdkDisplay *display, if (gdk_x11_selection_output_stream_needs_flush (stream) && gdk_x11_selection_output_stream_can_flush (stream)) gdk_x11_selection_output_stream_perform_flush (stream); + g_object_unref (stream); /* from unsetting the delete_pending */ return FALSE; default: