[Spice-devel] [PATCH v2 02/13] channel-main: Use GTask instead of GSimpleAsyncResult
Jonathon Jongsma
jjongsma at redhat.com
Tue Feb 16 20:03:30 UTC 2016
On Fri, 2016-02-12 at 10:46 +0100, Fabiano FidĂȘncio wrote:
> Instead of using GSimpleAsyncResult, use the new GTask API, which is
> much more straightforward.
> ---
> src/channel-main.c | 82 ++++++++++++++++++++++-------------------------------
> -
> 1 file changed, 33 insertions(+), 49 deletions(-)
>
> diff --git a/src/channel-main.c b/src/channel-main.c
> index 06dd121..5dc0b34 100644
> --- a/src/channel-main.c
> +++ b/src/channel-main.c
> @@ -923,10 +923,9 @@ static gboolean flush_foreach_remove(gpointer key
> G_GNUC_UNUSED,
> gpointer value, gpointer user_data)
> {
> gboolean success = GPOINTER_TO_UINT(user_data);
> - GSimpleAsyncResult *result = G_SIMPLE_ASYNC_RESULT(value);
> + GTask *result = value;
> + g_task_return_boolean(result, success);
>
> - g_simple_async_result_set_op_res_gboolean(result, success);
> - g_simple_async_result_complete_in_idle(result);
> return TRUE;
> }
>
> @@ -940,38 +939,31 @@ static void file_xfer_flushed(SpiceMainChannel *channel,
> gboolean success)
> static void file_xfer_flush_async(SpiceMainChannel *channel, GCancellable
> *cancellable,
> GAsyncReadyCallback callback, gpointer
> user_data)
> {
> - GSimpleAsyncResult *simple;
> + GTask *task;
> SpiceMainChannelPrivate *c = channel->priv;
> gboolean was_empty;
>
> - simple = g_simple_async_result_new(G_OBJECT(channel), callback,
> user_data,
> - file_xfer_flush_async);
> + task = g_task_new(channel, cancellable, callback, user_data);
>
> was_empty = g_queue_is_empty(c->agent_msg_queue);
> if (was_empty) {
> - g_simple_async_result_set_op_res_gboolean(simple, TRUE);
> - g_simple_async_result_complete_in_idle(simple);
> - g_object_unref(simple);
> + g_task_return_boolean(task, TRUE);
> + g_object_unref(task);
> return;
> }
>
> /* wait until the last message currently in the queue has been sent */
> - g_hash_table_insert(c->flushing, g_queue_peek_tail(c->agent_msg_queue),
> simple);
> + g_hash_table_insert(c->flushing, g_queue_peek_tail(c->agent_msg_queue),
> task);
> }
>
> static gboolean file_xfer_flush_finish(SpiceMainChannel *channel,
> GAsyncResult *result,
> GError **error)
> {
> - GSimpleAsyncResult *simple = (GSimpleAsyncResult *)result;
> + GTask *task = G_TASK(result);
>
> - g_return_val_if_fail(g_simple_async_result_is_valid(result,
> - G_OBJECT(channel), file_xfer_flush_async), FALSE);
> + g_return_val_if_fail(g_task_is_valid(result, channel), FALSE);
>
> - if (g_simple_async_result_propagate_error(simple, error)) {
> - return FALSE;
> - }
> -
> - return g_simple_async_result_get_op_res_gboolean(simple);
> + return g_task_propagate_boolean(task, error);
> }
>
> /* coroutine context */
> @@ -982,16 +974,15 @@ static void agent_send_msg_queue(SpiceMainChannel
> *channel)
>
> while (c->agent_tokens > 0 &&
> !g_queue_is_empty(c->agent_msg_queue)) {
> - GSimpleAsyncResult *simple;
> + GTask *task;
> c->agent_tokens--;
> out = g_queue_pop_head(c->agent_msg_queue);
> spice_msg_out_send_internal(out);
>
> - simple = g_hash_table_lookup(c->flushing, out);
> - if (simple) {
> + task = g_hash_table_lookup(c->flushing, out);
> + if (task) {
> /* if there's a flush task waiting for this message, finish it */
> - g_simple_async_result_set_op_res_gboolean(simple, TRUE);
> - g_simple_async_result_complete_in_idle(simple);
> + g_task_return_boolean(task, TRUE);
> g_hash_table_remove(c->flushing, out);
> }
> }
> @@ -1776,7 +1767,7 @@ static void file_xfer_close_cb(GObject *object,
> GAsyncResult *close_res,
> gpointer user_data)
> {
> - GSimpleAsyncResult *res;
> + GTask *task;
> SpiceFileTransferTask *self;
> GError *error = NULL;
>
> @@ -1794,15 +1785,15 @@ static void file_xfer_close_cb(GObject *object,
>
> /* Notify to user that files have been transferred or something error
> happened. */
> - res = g_simple_async_result_new(G_OBJECT(self->priv->channel),
> - self->priv->callback,
> - self->priv->user_data,
> - spice_main_file_copy_async);
> + task = g_task_new(self->priv->channel,
> + self->priv->cancellable,
> + self->priv->callback,
> + self->priv->user_data);
> +
> if (self->priv->error) {
> - g_simple_async_result_take_error(res, self->priv->error);
> - g_simple_async_result_set_op_res_gboolean(res, FALSE);
> + g_task_return_error(task, self->priv->error);
> } else {
> - g_simple_async_result_set_op_res_gboolean(res, TRUE);
> + g_task_return_boolean(task, TRUE);
You could move the g_task_return_boolean() calls outside of the if() block and
simply do
g_task_return_boolean(task, self->priv->error == NULL);
But maybe that's not useful since we still need an if statement for the debug
output.
> if (spice_util_get_debug()) {
> gint64 now = g_get_monotonic_time();
> gchar *basename = g_file_get_basename(self->priv->file);
> @@ -1819,8 +1810,7 @@ static void file_xfer_close_cb(GObject *object,
> g_free(transfer_speed_str);
> }
> }
> - g_simple_async_result_complete_in_idle(res);
> - g_object_unref(res);
> + g_object_unref(task);
>
> g_object_unref(self);
> }
> @@ -3147,12 +3137,13 @@ void spice_main_file_copy_async(SpiceMainChannel
> *channel,
> g_return_if_fail(sources != NULL);
>
> if (!c->agent_connected) {
> - g_simple_async_report_error_in_idle(G_OBJECT(channel),
> - callback,
> - user_data,
> - SPICE_CLIENT_ERROR,
> - SPICE_CLIENT_ERROR_FAILED,
> - "The agent is not connected");
> + g_task_report_new_error(channel,
> + callback,
> + user_data,
> + spice_main_file_copy_async,
> + SPICE_CLIENT_ERROR,
> + SPICE_CLIENT_ERROR_FAILED,
> + "The agent is not connected");
> return;
> }
>
> @@ -3181,19 +3172,12 @@ gboolean spice_main_file_copy_finish(SpiceMainChannel
> *channel,
> GAsyncResult *result,
> GError **error)
> {
> - GSimpleAsyncResult *simple;
> + GTask *task = G_TASK(result);;
>
> g_return_val_if_fail(SPICE_IS_MAIN_CHANNEL(channel), FALSE);
> - g_return_val_if_fail(g_simple_async_result_is_valid(result,
> - G_OBJECT(channel), spice_main_file_copy_async), FALSE);
> -
> - simple = (GSimpleAsyncResult *)result;
> -
> - if (g_simple_async_result_propagate_error(simple, error)) {
> - return FALSE;
> - }
> + g_return_val_if_fail(g_task_is_valid(task, channel), FALSE);
>
> - return g_simple_async_result_get_op_res_gboolean(simple);
> + return g_task_propagate_boolean(task, error);
> }
>
>
Acked-by: Jonathon Jongsma <jjongsma at redhat.com>
More information about the Spice-devel
mailing list