x11: Don't stall on write_async()

If a write_async() comes up while we are flushing on the background,
the task will be queued, but not deemed a reason on itself to keep
flushing (and finish the task) after a property delete event.

To fix this, do not ever queue up write_async tasks (this leaves
priv->pending_task only used for flush(), so the "flush to end"
behavior in the background is consistent). We only start a
background flush if there's reasons to do it, but the tasks are
immediately finished.

All data will still be ensured to be transfered on flush/close,
this makes the caller in this situation still able to reach to it.

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1198

(cherry picked from commit 655a783891)
This commit is contained in:
Carlos Garnacho 2020-04-14 13:40:52 +02:00 committed by Robert Mader
parent d985517573
commit 1e17f8813b

View File

@ -384,16 +384,11 @@ meta_x11_selection_output_stream_write_async (GOutputStream *output_stream
g_object_unref (task); g_object_unref (task);
return; return;
} }
else if (!meta_x11_selection_output_stream_can_flush (stream))
{
g_assert (priv->pending_task == NULL);
priv->pending_task = task;
g_task_set_task_data (task, GSIZE_TO_POINTER (count), NULL);
return;
}
else else
{ {
meta_x11_selection_output_stream_perform_flush (stream); if (meta_x11_selection_output_stream_can_flush (stream))
meta_x11_selection_output_stream_perform_flush (stream);
g_task_return_int (task, count); g_task_return_int (task, count);
g_object_unref (task); g_object_unref (task);
return; return;