[Spice-devel,01/14] channel-base: Use GTask instead of GSimpleAsyncResult

Submitted by Fabiano FidĂȘncio on Jan. 18, 2016, 9:05 a.m.

Details

Message ID 1453107950-21840-2-git-send-email-fidencio@redhat.com
State New
Headers show
Series "gobject: Use GTask API" ( rev: 2 1 ) in Spice

Not browsing as part of any series.

Commit Message

Fabiano FidĂȘncio Jan. 18, 2016, 9:05 a.m.
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, which 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       |  6 +++---
 src/channel-base.c | 26 ++++++++++----------------
 2 files changed, 13 insertions(+), 19 deletions(-)

Patch hide | download patch | download mbox

diff --git a/configure.ac b/configure.ac
index 38db8b5..e113487 100644
--- a/configure.ac
+++ b/configure.ac
@@ -201,7 +201,7 @@  fi
 
 AC_CHECK_FUNCS(clearenv strtok_r)
 
-PKG_CHECK_MODULES(GLIB2, glib-2.0 >= 2.28)
+PKG_CHECK_MODULES(GLIB2, glib-2.0)
 AC_SUBST(GLIB2_CFLAGS)
 AC_SUBST(GLIB2_LIBS)
 
@@ -209,7 +209,7 @@  PKG_CHECK_MODULES(GOBJECT2, gobject-2.0)
 AC_SUBST(GOBJECT2_CFLAGS)
 AC_SUBST(GOBJECT2_LIBS)
 
-PKG_CHECK_MODULES(GIO, gio-2.0 >= 2.10.0 $gio_os)
+PKG_CHECK_MODULES(GIO, gio-2.0 >= 2.36 $gio_os)
 AC_SUBST(GIO_CFLAGS)
 AC_SUBST(GIO_LIBS)
 
@@ -217,7 +217,7 @@  PKG_CHECK_MODULES(CAIRO, cairo >= 1.2.0)
 AC_SUBST(CAIRO_CFLAGS)
 AC_SUBST(CAIRO_LIBS)
 
-PKG_CHECK_MODULES(GTHREAD, gthread-2.0 > 2.0.0)
+PKG_CHECK_MODULES(GTHREAD, gthread-2.0)
 AC_SUBST(GTHREAD_CFLAGS)
 AC_SUBST(GTHREAD_LIBS)
 
diff --git a/src/channel-base.c b/src/channel-base.c
index 13e4ced..517e7b2 100644
--- a/src/channel-base.c
+++ b/src/channel-base.c
@@ -240,10 +240,9 @@  void spice_channel_set_handlers(SpiceChannelClass *klass,
 static void
 vmc_write_free_cb(uint8_t *data, void *user_data)
 {
-    GSimpleAsyncResult *result = user_data;
+    GTask *task = user_data;
 
-    g_simple_async_result_complete_in_idle(result);
-    g_object_unref(result);
+    g_object_unref(task);
 }
 
 G_GNUC_INTERNAL
@@ -254,15 +253,14 @@  void spice_vmc_write_async(SpiceChannel *self,
                            gpointer user_data)
 {
     SpiceMsgOut *msg;
-    GSimpleAsyncResult *simple;
+    GTask *task;
 
-    simple = g_simple_async_result_new(G_OBJECT(self), callback, user_data,
-                                       spice_port_write_async);
-    g_simple_async_result_set_op_res_gssize(simple, count);
+    task = g_task_new(self, cancellable, callback, user_data);
+    g_task_return_int(task, count);
 
     msg = spice_msg_out_new(SPICE_CHANNEL(self), SPICE_MSGC_SPICEVMC_DATA);
     spice_marshaller_add_ref_full(msg->marshaller, (uint8_t*)buffer, count,
-                                  vmc_write_free_cb, simple);
+                                  vmc_write_free_cb, task);
     spice_msg_out_send(msg);
 }
 
@@ -270,17 +268,13 @@  G_GNUC_INTERNAL
 gssize spice_vmc_write_finish(SpiceChannel *self,
                               GAsyncResult *result, GError **error)
 {
-    GSimpleAsyncResult *simple;
+    GTask *task;
 
     g_return_val_if_fail(result != NULL, -1);
 
-    simple = (GSimpleAsyncResult *)result;
+    task = G_TASK(result);
 
-    if (g_simple_async_result_propagate_error(simple, error))
-        return -1;
+    g_return_val_if_fail(g_task_is_valid(task, self), -1);
 
-    g_return_val_if_fail(g_simple_async_result_is_valid(result, G_OBJECT(self),
-                                                        spice_port_write_async), -1);
-
-    return g_simple_async_result_get_op_res_gssize(simple);
+    return g_task_propagate_int(task, error);
 }

Comments

On Mon, Jan 18, 2016 at 10:05:37AM +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, which 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       |  6 +++---
>  src/channel-base.c | 26 ++++++++++----------------
>  2 files changed, 13 insertions(+), 19 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index 38db8b5..e113487 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -201,7 +201,7 @@ fi
>  
>  AC_CHECK_FUNCS(clearenv strtok_r)
>  
> -PKG_CHECK_MODULES(GLIB2, glib-2.0 >= 2.28)
> +PKG_CHECK_MODULES(GLIB2, glib-2.0)
>  AC_SUBST(GLIB2_CFLAGS)
>  AC_SUBST(GLIB2_LIBS)
>  
> @@ -209,7 +209,7 @@ PKG_CHECK_MODULES(GOBJECT2, gobject-2.0)
>  AC_SUBST(GOBJECT2_CFLAGS)
>  AC_SUBST(GOBJECT2_LIBS)
>  
> -PKG_CHECK_MODULES(GIO, gio-2.0 >= 2.10.0 $gio_os)
> +PKG_CHECK_MODULES(GIO, gio-2.0 >= 2.36 $gio_os)
>  AC_SUBST(GIO_CFLAGS)
>  AC_SUBST(GIO_LIBS)
>  
> @@ -217,7 +217,7 @@ PKG_CHECK_MODULES(CAIRO, cairo >= 1.2.0)
>  AC_SUBST(CAIRO_CFLAGS)
>  AC_SUBST(CAIRO_LIBS)
>  
> -PKG_CHECK_MODULES(GTHREAD, gthread-2.0 > 2.0.0)
> +PKG_CHECK_MODULES(GTHREAD, gthread-2.0)
>  AC_SUBST(GTHREAD_CFLAGS)
>  AC_SUBST(GTHREAD_LIBS)
>  
> diff --git a/src/channel-base.c b/src/channel-base.c
> index 13e4ced..517e7b2 100644
> --- a/src/channel-base.c
> +++ b/src/channel-base.c
> @@ -240,10 +240,9 @@ void spice_channel_set_handlers(SpiceChannelClass *klass,
>  static void
>  vmc_write_free_cb(uint8_t *data, void *user_data)
>  {
> -    GSimpleAsyncResult *result = user_data;
> +    GTask *task = user_data;
>  
> -    g_simple_async_result_complete_in_idle(result);

The callback for the async call was called after vmc_write_free_cb()
runs (ie after the message has been sent in spice_channel_write_msg)...

> -    g_object_unref(result);
> +    g_object_unref(task);
>  }
>  
>  G_GNUC_INTERNAL
> @@ -254,15 +253,14 @@ void spice_vmc_write_async(SpiceChannel *self,
>                             gpointer user_data)
>  {
>      SpiceMsgOut *msg;
> -    GSimpleAsyncResult *simple;
> +    GTask *task;
>  
> -    simple = g_simple_async_result_new(G_OBJECT(self), callback, user_data,
> -                                       spice_port_write_async);
> -    g_simple_async_result_set_op_res_gssize(simple, count);
> +    task = g_task_new(self, cancellable, callback, user_data);
> +    g_task_return_int(task, count);

... but with this call here, I suspect the ordering of the async
callback being called, and spice_channel_write_msg() being called become
unspecified.
Have you checked that it's actually a non-issue? If yes, this would
deserve detailed explanations in the commit log.

Christophe