summaryrefslogtreecommitdiffstats
path: root/src/gtask-helper.c
diff options
context:
space:
mode:
authorFabiano Fidêncio <fidencio@redhat.com>2016-03-23 03:50:40 +0100
committerFabiano Fidêncio <fidencio@redhat.com>2016-03-23 04:22:37 +0100
commit0fa5895d6218269cce31315c36cb588c72a52fe0 (patch)
treec814ae20419b8c9715c93971d1a69f84aa0837eb /src/gtask-helper.c
parentf973df7e54b296f5cd2eca7498aea285a84ab007 (diff)
downloadspice-gtk-wip/gtask-helper.tar.gz
spice-gtk-wip/gtask-helper.tar.xz
spice-gtk-wip/gtask-helper.zip
Introduce gtask-helper.[ch]wip/gtask-helper
As noticed, GTask's heurestic for return a task in idle or immediately doesn't work when using Coroutine and that's okay, we just need to do the idle ourself. And in order to avoid code duplication, let's introduce and make usage of the new g_task_helper_return_* functions. These functions match exactly with the existing g_task_return_* functions and the only difference is that they return on idle instead of returning immediately. Signed-off-by: Fabiano Fidêncio <fidencio@redhat.com>
Diffstat (limited to 'src/gtask-helper.c')
-rw-r--r--src/gtask-helper.c152
1 files changed, 152 insertions, 0 deletions
diff --git a/src/gtask-helper.c b/src/gtask-helper.c
new file mode 100644
index 0000000..2dd042f
--- /dev/null
+++ b/src/gtask-helper.c
@@ -0,0 +1,152 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ Copyright (C) 2016 Red Hat, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.0 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+#include "config.h"
+
+#include "gtask-helper.h"
+
+typedef struct _GTaskHelperData
+{
+ GTask *task;
+ GError *error;
+ gint integer;
+ gboolean boolean;
+ gpointer pointer;
+ GDestroyNotify destroy_notify_cb;
+} GTaskHelperData;
+
+static GTaskHelperData *
+g_task_helper_new(void)
+{
+ return g_new0(GTaskHelperData, 1);
+}
+
+static void
+g_task_helper_data_free(GTaskHelperData *data)
+{
+ g_clear_object(&data->task);
+ g_free(data);
+}
+
+static gboolean
+complete_in_idle_boolean_cb(gpointer user_data)
+{
+ GTaskHelperData *data = user_data;
+
+ g_task_return_boolean(data->task, data->boolean);
+ g_task_helper_data_free(data);
+
+ return FALSE;
+}
+
+static gboolean
+complete_in_idle_integer_cb(gpointer user_data)
+{
+ GTaskHelperData *data = user_data;
+
+ g_task_return_int(data->task, data->integer);
+ g_task_helper_data_free(data);
+
+ return FALSE;
+}
+
+static gboolean
+complete_in_idle_error_cb(gpointer user_data)
+{
+ GTaskHelperData *data = user_data;
+
+ g_task_return_error(data->task, data->error);
+ g_task_helper_data_free(data);
+
+ return FALSE;
+}
+
+static gboolean
+complete_in_idle_pointer_cb(gpointer user_data)
+{
+ GTaskHelperData *data = user_data;
+
+ g_task_return_pointer(data->task, data->pointer, data->destroy_notify_cb);
+ g_task_helper_data_free(data);
+
+ return FALSE;
+}
+
+void
+g_task_helper_return_boolean(GTask *task,
+ gboolean boolean)
+{
+ GTaskHelperData *data = g_task_helper_new();
+ data->task = g_object_ref(task);
+ data->boolean = boolean;
+
+ g_idle_add(complete_in_idle_boolean_cb, data);
+}
+
+void
+g_task_helper_return_integer(GTask *task,
+ gint integer)
+{
+ GTaskHelperData *data = g_task_helper_new();
+ data->task = g_object_ref(task);
+ data->integer = integer;
+
+ g_idle_add(complete_in_idle_integer_cb, data);
+}
+
+
+void
+g_task_helper_return_error(GTask *task,
+ GError *error)
+{
+ GTaskHelperData *data = g_task_helper_new();
+ data->task = g_object_ref(task);
+ g_propagate_error(&data->error, error);
+
+ g_idle_add(complete_in_idle_error_cb, data);
+}
+
+void
+g_task_helper_return_new_error(GTask *task,
+ GQuark domain,
+ gint code,
+ const char *format,
+ ...)
+{
+ GTaskHelperData *data = g_task_helper_new();
+ va_list args;
+
+ data->task = g_object_ref(task);
+ va_start(args, format);
+ data->error = g_error_new_valist(domain, code, format, args);
+ va_end(args);
+
+ g_idle_add(complete_in_idle_error_cb, data);
+}
+
+void g_task_helper_return_pointer(GTask *task,
+ gpointer pointer,
+ GDestroyNotify destroy_notify_cb)
+{
+ GTaskHelperData *data = g_task_helper_new();
+ data->task = g_object_ref(task);
+ data->pointer = pointer;
+ data->destroy_notify_cb = destroy_notify_cb;
+
+ g_idle_add(complete_in_idle_pointer_cb, data);
+}