summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2020-04-14 13:40:52 +0200
committerRobert Mader <robert.mader@posteo.de>2020-04-16 16:26:04 +0000
commit655a783891ac38c01834cb6d9631aa5834666892 (patch)
tree16d0a46283223e0d314e4efb98f5e3fdf1e146d8
parenta4596becc43959c3cd049fd49a236a9920fd9f24 (diff)
downloadmutter-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.c11
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;