diff options
author | Adrian Szyndela <adrian.s@samsung.com> | 2020-01-17 16:50:13 +0100 |
---|---|---|
committer | Adrian Szyndela <adrian.s@samsung.com> | 2020-01-28 13:25:12 +0100 |
commit | 3c459edd259acca50370d3c1362a68f7fe8625f6 (patch) | |
tree | 19ecfe7da3cb32154db6c7db0b11eab1b3157b46 /gio/gtask.c | |
parent | 7aa26230d66c82ebcbf5e2f4419efc96ed4cdc9d (diff) | |
parent | a60402374ac62bf99a22f84f0801d5513b12fd66 (diff) | |
download | glib-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.c | 93 |
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)) { |