Re: [PATCH 02/14] channel-main: Use GTask instead of GSimpleAsyncResult

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Jan 18, 2016 at 11:31 AM, Christophe Fergeau
<cfergeau@xxxxxxxxxx> wrote:
> On Mon, Jan 18, 2016 at 10:05:38AM +0100, Fabiano Fidêncio wrote:
>> Instead of using GSimpleAsyncResult, use the new GTask API, which is
>> much more straightforward.
>> ---
>>  src/channel-main.c | 83 ++++++++++++++++++++++--------------------------------
>>  1 file changed, 34 insertions(+), 49 deletions(-)
>>
>> diff --git a/src/channel-main.c b/src/channel-main.c
>> index 06dd121..6c0f238 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);
>> +        g_task_return_boolean(task, FALSE);
>
> Not sure what GTask behaviour will be if you queue these 2 calls. Just
> calling g_task_return_error() is going to be enough as
> g_task_propagate_boolean() returns FALSE when an error is set.

Hmm. It shouldn't be in this way. I missed this part :-\
So, I do believe that in case of explicit errors we can call
g_task_return_boolean() instead of g_task_return_error() (as I did
with the other situations similar to this one).

Is okay for you if I do the same here?


>
> Christophe
_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]