X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgtask.c;h=51259bd54244c75c0878011ec59096c438447fbb;hb=2a53b4d0e2c98a14aedf31e38f0ad1fb2e8fe26f;hp=48d8ff52e0ea9c2048515fe0b289f534d6fc4b13;hpb=bc6ee788b4ff6590513da6ab657448885e92b20b;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gtask.c b/gio/gtask.c index 48d8ff5..51259bd 100644 --- a/gio/gtask.c +++ b/gio/gtask.c @@ -346,6 +346,7 @@ * task = g_task_new (self, cancellable, callback, user_data); * g_task_set_task_data (task, cake_data, (GDestroyNotify) cake_data_free); * g_task_run_in_thread (task, bake_cake_thread); + * g_object_unref (task); * } * * Cake * @@ -539,7 +540,7 @@ struct _GTask { GDestroyNotify task_data_destroy; GMainContext *context; - guint64 creation_time; + gint64 creation_time; gint priority; GCancellable *cancellable; gboolean check_cancellable; @@ -1058,7 +1059,7 @@ g_task_get_return_on_cancel (GTask *task) * * Gets @task's source tag. See g_task_set_source_tag(). * - * Return value: (transfer none): @task's source tag + * Returns: (transfer none): @task's source tag * * Since: 2.36 */ @@ -1135,6 +1136,7 @@ g_task_return (GTask *task, /* Otherwise, complete in the next iteration */ source = g_idle_source_new (); g_task_attach_source (task, source, complete_in_idle_cb); + g_source_set_name (source, "[gio] complete_in_idle_cb"); g_source_unref (source); } @@ -1272,16 +1274,22 @@ g_task_start_task_thread (GTask *task, return; } + /* This introduces a reference count loop between the GTask and + * GCancellable, but is necessary to avoid a race on finalising the GTask + * between task_thread_cancelled() (in one thread) and + * g_task_thread_complete() (in another). + * + * Accordingly, the signal handler *must* be removed once the task has + * completed. + */ g_signal_connect_data (task->cancellable, "cancelled", G_CALLBACK (task_thread_cancelled), g_object_ref (task), task_thread_cancelled_disconnect_notify, 0); } - g_thread_pool_push (task_pool, g_object_ref (task), &task->error); - if (task->error) - task->thread_complete = TRUE; - else if (g_private_get (&task_private)) + g_thread_pool_push (task_pool, g_object_ref (task), NULL); + if (g_private_get (&task_private)) { /* This thread is being spawned from another GTask thread, so * bump up max-threads so we don't starve. @@ -1662,7 +1670,7 @@ g_task_return_new_error (GTask *task, * g_task_return_pointer() for more discussion of exactly what this * means). * - * Return value: %TRUE if @task has been cancelled, %FALSE if not + * Returns: %TRUE if @task has been cancelled, %FALSE if not * * Since: 2.36 */ @@ -1720,7 +1728,7 @@ g_task_had_error (GTask *task) * source object (or that @source_object is %NULL and @result has no * source object). This can be used in g_return_if_fail() checks. * - * Return value: %TRUE if @result and @source_object are valid, %FALSE + * Returns: %TRUE if @result and @source_object are valid, %FALSE * if not * * Since: 2.36