x11: Keep a reference to the SelectionOutputStream while writing
authorBenjamin Otte <otte@redhat.com>
Mon, 13 Dec 2021 00:41:04 +0000 (01:41 +0100)
committerBenjamin Otte <otte@redhat.com>
Mon, 13 Dec 2021 00:42:45 +0000 (01:42 +0100)
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.

gdk/x11/gdkselectionoutputstream-x11.c

index b9aad4c3f399b6bcbd0edfcde9d0a7d78cf805a1..7b45638dd3bd4fb028ffe1f630fb2bd9d376094d 100644 (file)
@@ -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: