[Libosinfo] [PATCH v3 1/5] Use GTask instead of GSimpleAsyncResult

Christophe Fergeau cfergeau at redhat.com
Mon Jan 11 13:37:05 UTC 2016


Series looks good to me apart from some minor comments,

Acked-by: Christophe Fergeau <cfergeau at redhat.com>

Christophe

On Mon, Jan 11, 2016 at 02:19:51PM +0100, Fabiano Fidêncio wrote:
> Instead of using GSimpleAsyncResult, use the new GTask API, which is
> much more straightforward.
> For using the new GTask API, let's bump GIO (part of GLib) dependency
> version to 2.36.
> what is safe based on major distro support:
> - Debian Jessie: glib-2.42
> - RHEL-7.1: glib-2.40
> - SLES12: glib-2.38
> - Ubuntu LTS 14.04: glib-2.40
> ---
>  configure.ac                   |  2 +-
>  osinfo/osinfo_install_script.c | 52 ++++++++++++++----------------------
>  osinfo/osinfo_media.c          | 60 +++++++++++++++++-------------------------
>  osinfo/osinfo_tree.c           | 34 +++++++++---------------
>  4 files changed, 57 insertions(+), 91 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index 4154134..5c38b96 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -37,7 +37,7 @@ m4_if(m4_version_compare([2.61a.100],
>  m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
>  
>  PKG_CHECK_MODULES([GOBJECT], [gobject-2.0])
> -PKG_CHECK_MODULES([GIO], [gio-2.0])
> +PKG_CHECK_MODULES([GIO], [gio-2.0 >= 2.36])
>  PKG_CHECK_MODULES([SOUP], [libsoup-2.4 >= 2.42])
>  PKG_CHECK_MODULES([LIBXML], [libxml-2.0 >= 2.6.0])
>  PKG_CHECK_MODULES([LIBXSLT], [libxslt >= 1.0.0])
> diff --git a/osinfo/osinfo_install_script.c b/osinfo/osinfo_install_script.c
> index 9ded116..7f0d863 100644
> --- a/osinfo/osinfo_install_script.c
> +++ b/osinfo/osinfo_install_script.c
> @@ -531,7 +531,7 @@ OsinfoAvatarFormat *osinfo_install_script_get_avatar_format(OsinfoInstallScript
>  }
>  
>  struct _OsinfoInstallScriptGenerateData {
> -    GSimpleAsyncResult *res;
> +    GTask *res;
>      OsinfoOs *os;
>      OsinfoMedia *media;
>      OsinfoInstallConfig *config;
> @@ -551,8 +551,7 @@ static void osinfo_install_script_generate_data_free(OsinfoInstallScriptGenerate
>  }
>  
>  struct _OsinfoInstallScriptGenerateOutputData {
> -    GSimpleAsyncResult *res;
> -    GCancellable *cancellable;
> +    GTask *res;
>      GError *error;
>      GFile *file;
>      GFileOutputStream *stream;
> @@ -882,7 +881,7 @@ static void osinfo_install_script_template_loaded(GObject *src,
>                                       NULL,
>                                       &error)) {
>          g_prefix_error(&error, _("Failed to load script template %s: "), uri);
> -        g_simple_async_result_take_error(data->res, error);
> +        g_task_return_error(data->res, error);
>          goto cleanup;
>      }
>  
> @@ -897,15 +896,13 @@ static void osinfo_install_script_template_loaded(GObject *src,
>                                                data->config,
>                                                &error)) {
>          g_prefix_error(&error, _("Failed to apply script template %s: "), uri);
> -        g_simple_async_result_take_error(data->res, error);
> +        g_task_return_error(data->res, error);
>          goto cleanup;
>      }
>  
> -    g_simple_async_result_set_op_res_gpointer(data->res,
> -                                              output, NULL);
> +    g_task_return_pointer(data->res, output, NULL);
>  
>   cleanup:
> -    g_simple_async_result_complete(data->res);
>      osinfo_install_script_generate_data_free(data);
>      g_free(uri);
>  }
> @@ -934,10 +931,10 @@ static void osinfo_install_script_generate_async_common(OsinfoInstallScript *scr
>          data->media = g_object_ref(media);
>      data->config = g_object_ref(config);
>      data->script = g_object_ref(script);
> -    data->res = g_simple_async_result_new(G_OBJECT(script),
> -                                          callback,
> -                                          user_data,
> -                                          osinfo_install_script_generate_async_common);
> +    data->res = g_task_new(G_OBJECT(script),
> +                           cancellable,
> +                           callback,
> +                           user_data);
>  
>      if (templateData) {
>          GError *error = NULL;
> @@ -952,14 +949,11 @@ static void osinfo_install_script_generate_async_common(OsinfoInstallScript *scr
>                                                    data->config,
>                                                    &error)) {
>              g_prefix_error(&error, "%s", _("Failed to apply script template: "));
> -            g_simple_async_result_take_error(data->res, error);
> -            g_simple_async_result_complete(data->res);
> +            g_task_return_error(data->res, error);
>              osinfo_install_script_generate_data_free(data);
>              return;
>          }
> -        g_simple_async_result_set_op_res_gpointer(data->res,
> -                                                  output, NULL);
> -        g_simple_async_result_complete_in_idle(data->res);
> +        g_task_return_pointer(data->res, output, NULL);
>          osinfo_install_script_generate_data_free(data);
>      } else {
>          GFile *file = g_file_new_for_uri(templateUri);
> @@ -1007,14 +1001,11 @@ static gpointer osinfo_install_script_generate_finish_common(OsinfoInstallScript
>                                                               GAsyncResult *res,
>                                                               GError **error)
>  {
> -    GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT(res);
> +    GTask *task = G_TASK(res);
>  
>      g_return_val_if_fail(error == NULL || *error == NULL, NULL);
>  
> -    if (g_simple_async_result_propagate_error(simple, error))
> -        return NULL;
> -
> -    return g_simple_async_result_get_op_res_gpointer(simple);
> +    return g_task_propagate_pointer(task, error);
>  }
>  
>  /**
> @@ -1132,9 +1123,7 @@ static void osinfo_install_script_generate_output_close_file(GObject *src,
>                                   res,
>                                   &data->error);
>  
> -    g_simple_async_result_set_op_res_gpointer(data->res,
> -                                              data->file, NULL);
> -    g_simple_async_result_complete_in_idle(data->res);
> +    g_task_return_pointer(data->res, data->file, NULL);
>  
>      osinfo_install_script_generate_output_data_free(data);
>  }
> @@ -1309,14 +1298,14 @@ static void osinfo_install_script_generate_output_write_file(GObject *src,
>                                      data->output + data->output_pos,
>                                      data->output_len - data->output_pos,
>                                      G_PRIORITY_DEFAULT,
> -                                    data->cancellable,
> +                                    g_task_get_cancellable(data->res),
>                                      osinfo_install_script_generate_output_write_file,
>                                      data);
>  
>      } else {
>          g_output_stream_close_async(G_OUTPUT_STREAM(data->stream),
>                                      G_PRIORITY_DEFAULT,
> -                                    data->cancellable,
> +                                    g_task_get_cancellable(data->res),
>                                      osinfo_install_script_generate_output_close_file,
>                                      data);
>      }
> @@ -1338,12 +1327,11 @@ static void osinfo_install_script_generate_output_async_common(OsinfoInstallScri
>  
>      OsinfoInstallScriptGenerateSyncData *data_sync = user_data;
>  
> -    data->res = g_simple_async_result_new(G_OBJECT(script),
> -                                          callback,
> -                                          user_data,
> -                                          osinfo_install_script_generate_output_async_common);
> +    data->res = g_task_new(G_OBJECT(script),
> +                           cancellable,
> +                           callback,
> +                           user_data);
>  
> -    data->cancellable = cancellable;
>      data->error = data_sync->error;
>      if (media != NULL) {
>          data->output = osinfo_install_script_generate_for_media(script,
> diff --git a/osinfo/osinfo_media.c b/osinfo/osinfo_media.c
> index 7ff48a9..d9fcba6 100644
> --- a/osinfo/osinfo_media.c
> +++ b/osinfo/osinfo_media.c
> @@ -75,10 +75,7 @@ typedef struct _CreateFromLocationAsyncData CreateFromLocationAsyncData;
>  struct _CreateFromLocationAsyncData {
>      GFile *file;
>  
> -    gint priority;
> -    GCancellable *cancellable;
> -
> -    GSimpleAsyncResult *res;
> +    GTask *res;
>  
>      PrimaryVolumeDescriptor pvd;
>      SupplementaryVolumeDescriptor svd;
> @@ -91,7 +88,6 @@ static void create_from_location_async_data_free
>                                  (CreateFromLocationAsyncData *data)
>  {
>     g_object_unref(data->file);
> -   g_clear_object(&data->cancellable);
>     g_object_unref(data->res);
>  
>     g_slice_free(CreateFromLocationAsyncData, data);
> @@ -707,8 +703,8 @@ static void on_svd_read(GObject *source,
>          g_input_stream_read_async(stream,
>                                    ((gchar *)&data->svd + data->offset),
>                                    data->length - data->offset,
> -                                  data->priority,
> -                                  data->cancellable,
> +                                  g_task_get_priority(data->res),
> +                                  g_task_get_cancellable(data->res),
>                                    on_svd_read,
>                                    data);
>          return;
> @@ -760,10 +756,9 @@ static void on_svd_read(GObject *source,
>  
>  EXIT:
>      if (error != NULL)
> -        g_simple_async_result_take_error(data->res, error);
> +        g_task_return_error(data->res, error);
>      else
> -        g_simple_async_result_set_op_res_gpointer(data->res, media, NULL);
> -    g_simple_async_result_complete(data->res);
> +        g_task_return_pointer(data->res, media, NULL);
>  
>      g_object_unref(stream);
>      create_from_location_async_data_free(data);
> @@ -800,8 +795,8 @@ static void on_pvd_read(GObject *source,
>          g_input_stream_read_async(stream,
>                                    ((gchar*)&data->pvd) + data->offset,
>                                    data->length - data->offset,
> -                                  data->priority,
> -                                  data->cancellable,
> +                                  g_task_get_priority(data->res),
> +                                  g_task_get_cancellable(data->res),
>                                    on_pvd_read,
>                                    data);
>          return;
> @@ -827,15 +822,14 @@ static void on_pvd_read(GObject *source,
>      g_input_stream_read_async(stream,
>                                (gchar *)&data->svd,
>                                data->length,
> -                              data->priority,
> -                              data->cancellable,
> +                              g_task_get_priority(data->res),
> +                              g_task_get_cancellable(data->res),
>                                on_svd_read,
>                                data);
>      return;
>  
>  ON_ERROR:
> -    g_simple_async_result_take_error(data->res, error);
> -    g_simple_async_result_complete(data->res);
> +    g_task_return_error(data->res, error);
>      create_from_location_async_data_free(data);
>  }
>  
> @@ -857,8 +851,7 @@ static void on_location_skipped(GObject *source,
>                          OSINFO_MEDIA_ERROR,
>                          OSINFO_MEDIA_ERROR_NO_DESCRIPTORS,
>                          _("No volume descriptors"));
> -        g_simple_async_result_take_error(data->res, error);
> -        g_simple_async_result_complete(data->res);
> +        g_task_return_error(data->res, error);
>          create_from_location_async_data_free(data);
>  
>          return;
> @@ -870,8 +863,8 @@ static void on_location_skipped(GObject *source,
>      g_input_stream_read_async(stream,
>                                (gchar *)&data->pvd,
>                                data->length,
> -                              data->priority,
> -                              data->cancellable,
> +                              g_task_get_priority(data->res),
> +                              g_task_get_cancellable(data->res),
>                                on_pvd_read,
>                                data);
>  }
> @@ -889,8 +882,7 @@ static void on_location_read(GObject *source,
>      stream = g_file_read_finish(G_FILE(source), res, &error);
>      if (error != NULL) {
>          g_prefix_error(&error, _("Failed to open file"));
> -        g_simple_async_result_take_error(data->res, error);
> -        g_simple_async_result_complete(data->res);
> +        g_task_return_error(data->res, error);
>          create_from_location_async_data_free(data);
>  
>          return;
> @@ -898,8 +890,8 @@ static void on_location_read(GObject *source,
>  
>      g_input_stream_skip_async(G_INPUT_STREAM(stream),
>                                PVD_OFFSET,
> -                              data->priority,
> -                              data->cancellable,
> +                              g_task_get_priority(data->res),
> +                              g_task_get_cancellable(data->res),
>                                on_location_skipped,
>                                data);
>  }
> @@ -925,14 +917,13 @@ void osinfo_media_create_from_location_async(const gchar *location,
>      g_return_if_fail(location != NULL);
>  
>      data = g_slice_new0(CreateFromLocationAsyncData);
> -    data->res = g_simple_async_result_new
> -                                (NULL,
> -                                 callback,
> -                                 user_data,
> -                                 osinfo_media_create_from_location_async);
> +    data->res = g_task_new(NULL,
> +                           cancellable,
> +                           callback,
> +                           user_data);
> +    g_task_set_priority(data->res, priority);
> +
>      data->file = g_file_new_for_commandline_arg(location);
> -    data->priority = priority;
> -    data->cancellable = cancellable;
>      g_file_read_async(data->file,
>                        priority,
>                        cancellable,
> @@ -953,14 +944,11 @@ void osinfo_media_create_from_location_async(const gchar *location,
>  OsinfoMedia *osinfo_media_create_from_location_finish(GAsyncResult *res,
>                                                        GError **error)
>  {
> -    GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT(res);
> +    GTask *task = G_TASK(res);
>  
>      g_return_val_if_fail(error == NULL || *error == NULL, NULL);
>  
> -    if (g_simple_async_result_propagate_error(simple, error))
> -        return NULL;
> -
> -    return g_simple_async_result_get_op_res_gpointer(simple);
> +    return g_task_propagate_pointer(task, error);
>  }
>  
>  /**
> diff --git a/osinfo/osinfo_tree.c b/osinfo/osinfo_tree.c
> index 55c572e..c80c62d 100644
> --- a/osinfo/osinfo_tree.c
> +++ b/osinfo/osinfo_tree.c
> @@ -36,10 +36,7 @@ struct _CreateFromLocationAsyncData {
>      GFile *file;
>      gchar *location;
>  
> -    gint priority;
> -    GCancellable *cancellable;
> -
> -    GSimpleAsyncResult *res;
> +    GTask *res;
>  
>      OsinfoTree *tree;
>  };
> @@ -49,7 +46,6 @@ static void create_from_location_async_data_free(CreateFromLocationAsyncData *da
>      if (data->tree)
>      g_object_unref(data->tree);
>      g_object_unref(data->file);
> -    g_clear_object(&data->cancellable);
>      g_object_unref(data->res);
>  
>      g_slice_free(CreateFromLocationAsyncData, data);
> @@ -604,8 +600,7 @@ static void on_location_read(GObject *source,
>                                       NULL,
>                                       &error)) {
>          g_prefix_error(&error, _("Failed to load .treeinfo file: "));
> -        g_simple_async_result_take_error(data->res, error);
> -        g_simple_async_result_complete(data->res);
> +        g_task_return_error(data->res, error);
>          create_from_location_async_data_free(data);
>          return;
>      }
> @@ -615,14 +610,13 @@ static void on_location_read(GObject *source,
>                               length,
>                               &error))) {
>          g_prefix_error(&error, _("Failed to process keyinfo file: "));
> -        g_simple_async_result_take_error(data->res, error);
> +        g_task_return_error(data->res, error);
>          goto cleanup;
>      }
>  
> -    g_simple_async_result_set_op_res_gpointer(data->res, ret, NULL);
> +    g_task_return_pointer(data->res, ret, NULL);
>  
>   cleanup:
> -    g_simple_async_result_complete(data->res);
>      create_from_location_async_data_free(data);
>      g_free(content);
>  }
> @@ -651,15 +645,14 @@ void osinfo_tree_create_from_location_async(const gchar *location,
>      treeinfo = g_strdup_printf("%s/.treeinfo", location);
>  
>      data = g_slice_new0(CreateFromLocationAsyncData);
> -    data->res = g_simple_async_result_new
> -        (NULL,
> -         callback,
> -         user_data,
> -         osinfo_tree_create_from_location_async);
> +    data->res = g_task_new(NULL,
> +                           cancellable,
> +                           callback,
> +                           user_data);
> +    g_task_set_priority(data->res, priority);
> +
>      data->file = g_file_new_for_uri(treeinfo);
>      data->location = g_strdup(location);
> -    data->priority = priority;
> -    data->cancellable = cancellable;
>  
>      /* XXX priority ? */
>      /* XXX probe other things besides just tree info */
> @@ -685,14 +678,11 @@ void osinfo_tree_create_from_location_async(const gchar *location,
>  OsinfoTree *osinfo_tree_create_from_location_finish(GAsyncResult *res,
>                                                      GError **error)
>  {
> -    GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT(res);
> +    GTask *task = G_TASK(res);
>  
>      g_return_val_if_fail(error == NULL || *error == NULL, NULL);
>  
> -    if (g_simple_async_result_propagate_error(simple, error))
> -        return NULL;
> -
> -    return g_simple_async_result_get_op_res_gpointer(simple);
> +    return g_task_propagate_pointer(task, error);
>  }
>  
>  /**
> -- 
> 2.5.0
> 
> _______________________________________________
> Libosinfo mailing list
> Libosinfo at redhat.com
> https://www.redhat.com/mailman/listinfo/libosinfo
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libosinfo/attachments/20160111/b5a4519b/attachment.sig>


More information about the Libosinfo mailing list