glib2/gtask-Check-an-error-hasn-t-been-returned-when-calli.patch
2019-09-30 10:40:42 -04:00

97 lines
3.0 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From bea37709353533e4abb1c652a655f483e6f9aeac Mon Sep 17 00:00:00 2001
From: Philip Withnall <withnall@endlessm.com>
Date: Wed, 21 Mar 2018 14:47:52 +0000
Subject: [PATCH 121/682] =?UTF-8?q?gtask:=20Check=20an=20error=20hasn?=
=?UTF-8?q?=E2=80=99t=20been=20returned=20when=20calling=20g=5Ftask=5Fretu?=
=?UTF-8?q?rn*()?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
These functions already check to see if a successful result has already
been returned; expand them to also check to see if an error has been
returned.
We cant just check GTask.result_set, as thats actually an indicator
for whether the GTask.result member is filled — when
g_task_propagate_*() is called, its cleared again. We need a new state
bit.
Signed-off-by: Philip Withnall <withnall@endlessm.com>
https://gitlab.gnome.org/GNOME/glib/issues/1525
---
gio/gtask.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/gio/gtask.c b/gio/gtask.c
index 4087543e6..a31bd613a 100644
--- a/gio/gtask.c
+++ b/gio/gtask.c
@@ -575,6 +575,7 @@ struct _GTask {
GDestroyNotify result_destroy;
gboolean had_error;
gboolean result_set;
+ gboolean ever_returned;
};
#define G_TASK_IS_THREADED(task) ((task)->task_func != NULL)
@@ -1176,6 +1177,9 @@ g_task_return (GTask *task,
{
GSource *source;
+ if (type != G_TASK_RETURN_FROM_THREAD)
+ task->ever_returned = TRUE;
+
if (type == G_TASK_RETURN_SUCCESS)
task->result_set = TRUE;
@@ -1596,7 +1600,7 @@ g_task_return_pointer (GTask *task,
GDestroyNotify result_destroy)
{
g_return_if_fail (G_IS_TASK (task));
- g_return_if_fail (task->result_set == FALSE);
+ g_return_if_fail (!task->ever_returned);
task->result.pointer = result;
task->result_destroy = result_destroy;
@@ -1654,7 +1658,7 @@ g_task_return_int (GTask *task,
gssize result)
{
g_return_if_fail (G_IS_TASK (task));
- g_return_if_fail (task->result_set == FALSE);
+ g_return_if_fail (!task->ever_returned);
task->result.size = result;
@@ -1709,7 +1713,7 @@ g_task_return_boolean (GTask *task,
gboolean result)
{
g_return_if_fail (G_IS_TASK (task));
- g_return_if_fail (task->result_set == FALSE);
+ g_return_if_fail (!task->ever_returned);
task->result.boolean = result;
@@ -1772,7 +1776,7 @@ g_task_return_error (GTask *task,
GError *error)
{
g_return_if_fail (G_IS_TASK (task));
- g_return_if_fail (task->result_set == FALSE);
+ g_return_if_fail (!task->ever_returned);
g_return_if_fail (error != NULL);
task->error = error;
@@ -1833,7 +1837,7 @@ g_task_return_error_if_cancelled (GTask *task)
GError *error = NULL;
g_return_val_if_fail (G_IS_TASK (task), FALSE);
- g_return_val_if_fail (task->result_set == FALSE, FALSE);
+ g_return_val_if_fail (!task->ever_returned, FALSE);
if (g_cancellable_set_error_if_cancelled (task->cancellable, &error))
{
--
2.19.1