summaryrefslogtreecommitdiff
path: root/gio/gtask.c
diff options
context:
space:
mode:
authorAdrian Szyndela <adrian.s@samsung.com>2020-01-17 16:50:13 +0100
committerAdrian Szyndela <adrian.s@samsung.com>2020-01-28 13:25:12 +0100
commit3c459edd259acca50370d3c1362a68f7fe8625f6 (patch)
tree19ecfe7da3cb32154db6c7db0b11eab1b3157b46 /gio/gtask.c
parent7aa26230d66c82ebcbf5e2f4419efc96ed4cdc9d (diff)
parenta60402374ac62bf99a22f84f0801d5513b12fd66 (diff)
downloadglib-3c459edd259acca50370d3c1362a68f7fe8625f6.tar.gz
glib-3c459edd259acca50370d3c1362a68f7fe8625f6.tar.bz2
glib-3c459edd259acca50370d3c1362a68f7fe8625f6.zip
Merge 2.59.0 into tizen
Change-Id: I5fce88747c10d0f110d405e1e6be536d0cc8f2d0
Diffstat (limited to 'gio/gtask.c')
-rw-r--r--gio/gtask.c93
1 files changed, 77 insertions, 16 deletions
diff --git a/gio/gtask.c b/gio/gtask.c
index 4087543e6..a2f316d2e 100644
--- a/gio/gtask.c
+++ b/gio/gtask.c
@@ -543,6 +543,7 @@ struct _GTask {
gpointer source_object;
gpointer source_tag;
+ gchar *name; /* (owned); may only be modified before the #GTask is threaded */
gpointer task_data;
GDestroyNotify task_data_destroy;
@@ -551,20 +552,26 @@ struct _GTask {
gint64 creation_time;
gint priority;
GCancellable *cancellable;
- gboolean check_cancellable;
GAsyncReadyCallback callback;
gpointer callback_data;
- gboolean completed;
GTaskThreadFunc task_func;
GMutex lock;
GCond cond;
- gboolean return_on_cancel;
+
+ /* This can’t be in the bit field because we access it from TRACE(). */
gboolean thread_cancelled;
- gboolean synchronous;
- gboolean thread_complete;
- gboolean blocking_other_task;
+
+ gboolean check_cancellable : 1;
+ gboolean completed : 1;
+ gboolean return_on_cancel : 1;
+ gboolean synchronous : 1;
+ gboolean thread_complete : 1;
+ gboolean blocking_other_task : 1;
+ gboolean had_error : 1;
+ gboolean result_set : 1;
+ gboolean ever_returned : 1;
GError *error;
union {
@@ -573,8 +580,6 @@ struct _GTask {
gboolean boolean;
} result;
GDestroyNotify result_destroy;
- gboolean had_error;
- gboolean result_set;
};
#define G_TASK_IS_THREADED(task) ((task)->task_func != NULL)
@@ -633,6 +638,7 @@ g_task_finalize (GObject *object)
g_clear_object (&task->source_object);
g_clear_object (&task->cancellable);
+ g_free (task->name);
if (task->context)
g_main_context_unref (task->context);
@@ -975,6 +981,36 @@ g_task_set_source_tag (GTask *task,
}
/**
+ * g_task_set_name:
+ * @task: a #GTask
+ * @name: (nullable): a human readable name for the task, or %NULL to unset it
+ *
+ * Sets @task’s name, used in debugging and profiling. The name defaults to
+ * %NULL.
+ *
+ * The task name should describe in a human readable way what the task does.
+ * For example, ‘Open file’ or ‘Connect to network host’. It is used to set the
+ * name of the #GSource used for idle completion of the task.
+ *
+ * This function may only be called before the @task is first used in a thread
+ * other than the one it was constructed in.
+ *
+ * Since: 2.60
+ */
+void
+g_task_set_name (GTask *task,
+ const gchar *name)
+{
+ gchar *new_name;
+
+ g_return_if_fail (G_IS_TASK (task));
+
+ new_name = g_strdup (name);
+ g_free (task->name);
+ task->name = g_steal_pointer (&new_name);
+}
+
+/**
* g_task_get_source_object:
* @task: a #GTask
*
@@ -1134,6 +1170,22 @@ g_task_get_source_tag (GTask *task)
return task->source_tag;
}
+/**
+ * g_task_get_name:
+ * @task: a #GTask
+ *
+ * Gets @task’s name. See g_task_set_name().
+ *
+ * Returns: (nullable) (transfer none): @task’s name, or %NULL
+ * Since: 2.60
+ */
+const gchar *
+g_task_get_name (GTask *task)
+{
+ g_return_val_if_fail (G_IS_TASK (task), NULL);
+
+ return task->name;
+}
static void
g_task_return_now (GTask *task)
@@ -1176,6 +1228,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;
@@ -1520,6 +1575,9 @@ g_task_run_in_thread_sync (GTask *task,
* #GMainContext with @task's [priority][io-priority], and sets @source's
* callback to @callback, with @task as the callback's `user_data`.
*
+ * It will set the @source’s name to the task’s name (as set with
+ * g_task_set_name()), if one has been set.
+ *
* This takes a reference on @task until @source is destroyed.
*
* Since: 2.36
@@ -1534,6 +1592,9 @@ g_task_attach_source (GTask *task,
g_source_set_callback (source, callback,
g_object_ref (task), g_object_unref);
g_source_set_priority (source, task->priority);
+ if (task->name != NULL)
+ g_source_set_name (source, task->name);
+
g_source_attach (source, task->context);
}
@@ -1596,7 +1657,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;
@@ -1631,7 +1692,7 @@ g_task_propagate_pointer (GTask *task,
if (g_task_propagate_error (task, error))
return NULL;
- g_return_val_if_fail (task->result_set == TRUE, NULL);
+ g_return_val_if_fail (task->result_set, NULL);
task->result_destroy = NULL;
task->result_set = FALSE;
@@ -1654,7 +1715,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;
@@ -1687,7 +1748,7 @@ g_task_propagate_int (GTask *task,
if (g_task_propagate_error (task, error))
return -1;
- g_return_val_if_fail (task->result_set == TRUE, -1);
+ g_return_val_if_fail (task->result_set, -1);
task->result_set = FALSE;
return task->result.size;
@@ -1709,7 +1770,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;
@@ -1742,7 +1803,7 @@ g_task_propagate_boolean (GTask *task,
if (g_task_propagate_error (task, error))
return FALSE;
- g_return_val_if_fail (task->result_set == TRUE, FALSE);
+ g_return_val_if_fail (task->result_set, FALSE);
task->result_set = FALSE;
return task->result.boolean;
@@ -1772,7 +1833,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 +1894,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))
{