diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2020-04-14 13:40:52 +0200 |
---|---|---|
committer | Robert Mader <robert.mader@posteo.de> | 2020-04-16 16:26:04 +0000 |
commit | 655a783891ac38c01834cb6d9631aa5834666892 (patch) | |
tree | 16d0a46283223e0d314e4efb98f5e3fdf1e146d8 | |
parent | a4596becc43959c3cd049fd49a236a9920fd9f24 (diff) | |
download | mutter-655a783891ac38c01834cb6d9631aa5834666892.tar.gz |
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
-rw-r--r-- | src/x11/meta-x11-selection-output-stream.c | 11 |
1 files changed, 3 insertions, 8 deletions
diff --git a/src/x11/meta-x11-selection-output-stream.c b/src/x11/meta-x11-selection-output-stream.c index bc13dbcd9..3ba05aba0 100644 --- a/src/x11/meta-x11-selection-output-stream.c +++ b/src/x11/meta-x11-selection-output-stream.c @@ -384,16 +384,11 @@ meta_x11_selection_output_stream_write_async (GOutputStream *output_stream g_object_unref (task); 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 { - 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_object_unref (task); return; |