[Spice-devel] [spice-gtk v3 11/13] vmcstream: Use GTask instead of GSimpleAsyncResult
Fabiano FidĂȘncio
fidencio at redhat.com
Mon Mar 14 15:19:04 UTC 2016
Instead of using GSimpleAsyncResult, use the new GTask API, which is
much more straightforward.
Signed-off-by: Fabiano FidĂȘncio <fidencio at redhat.com>
---
src/vmcstream.c | 129 +++++++++++++++++++++++---------------------------------
1 file changed, 52 insertions(+), 77 deletions(-)
diff --git a/src/vmcstream.c b/src/vmcstream.c
index 483dd5a..05dba7d 100644
--- a/src/vmcstream.c
+++ b/src/vmcstream.c
@@ -27,7 +27,7 @@
struct _SpiceVmcInputStream
{
GInputStream parent_instance;
- GSimpleAsyncResult *result;
+ GTask *task;
struct coroutine *coroutine;
SpiceChannel *channel;
@@ -36,7 +36,6 @@ struct _SpiceVmcInputStream
gsize count;
gsize pos;
- GCancellable *cancellable;
gulong cancel_id;
};
@@ -118,11 +117,12 @@ spice_vmc_input_stream_co_data(SpiceVmcInputStream *self,
self->coroutine = coroutine_self();
while (size > 0) {
- SPICE_DEBUG("spicevmc co_data %p", self->result);
- if (!self->result)
+ GCancellable *cancellable;
+ SPICE_DEBUG("spicevmc co_data %p", self->task);
+ if (!self->task)
coroutine_yield(NULL);
- g_return_if_fail(self->result != NULL);
+ g_return_if_fail(self->task != NULL);
gsize min = MIN(self->count, size);
memcpy(self->buffer, data, min);
@@ -139,14 +139,13 @@ spice_vmc_input_stream_co_data(SpiceVmcInputStream *self,
if (self->all && min > 0 && self->pos != self->count)
continue;
- g_simple_async_result_set_op_res_gssize(self->result, self->pos);
+ g_task_return_int(self->task, self->pos);
+
+ cancellable = g_task_get_cancellable(self->task);
+ if (cancellable)
+ g_cancellable_disconnect(cancellable, self->cancel_id);
- g_simple_async_result_complete_in_idle(self->result);
- g_clear_object(&self->result);
- if (self->cancellable) {
- g_cancellable_disconnect(self->cancellable, self->cancel_id);
- g_clear_object(&self->cancellable);
- }
+ g_clear_object(&self->task);
}
self->coroutine = NULL;
@@ -158,13 +157,12 @@ read_cancelled(GCancellable *cancellable,
{
SpiceVmcInputStream *self = SPICE_VMC_INPUT_STREAM(user_data);
- SPICE_DEBUG("read cancelled, %p", self->result);
- g_simple_async_result_set_error(self->result,
- G_IO_ERROR, G_IO_ERROR_CANCELLED,
- "read cancelled");
- g_simple_async_result_complete_in_idle(self->result);
+ SPICE_DEBUG("read cancelled, %p", self->task);
+ g_task_return_new_error(self->task,
+ G_IO_ERROR, G_IO_ERROR_CANCELLED,
+ "read cancelled");
- g_clear_object(&self->result);
+ g_clear_object(&self->task);
/* See FIXME */
/* if (self->cancellable) { */
@@ -183,21 +181,20 @@ spice_vmc_input_stream_read_all_async(GInputStream *stream,
gpointer user_data)
{
SpiceVmcInputStream *self = SPICE_VMC_INPUT_STREAM(stream);
- GSimpleAsyncResult *result;
+ GTask *task;
/* no concurrent read permitted by ginputstream */
- g_return_if_fail(self->result == NULL);
- g_return_if_fail(self->cancellable == NULL);
+ g_return_if_fail(self->task == NULL);
+ g_return_if_fail(g_task_get_cancellable(self->task) == NULL);
self->all = TRUE;
self->buffer = buffer;
self->count = count;
self->pos = 0;
- result = g_simple_async_result_new(G_OBJECT(self),
- callback,
- user_data,
- spice_vmc_input_stream_read_async);
- self->result = result;
- self->cancellable = g_object_ref(cancellable);
+ task = g_task_new(self,
+ cancellable,
+ callback,
+ user_data);
+ self->task = task;
if (cancellable)
self->cancel_id =
g_cancellable_connect(cancellable, G_CALLBACK(read_cancelled), self, NULL);
@@ -211,27 +208,19 @@ spice_vmc_input_stream_read_all_finish(GInputStream *stream,
GAsyncResult *result,
GError **error)
{
- GSimpleAsyncResult *simple;
+ GTask *task = G_TASK(result);
+ GCancellable *cancellable;
SpiceVmcInputStream *self = SPICE_VMC_INPUT_STREAM(stream);
- g_return_val_if_fail(g_simple_async_result_is_valid(result,
- G_OBJECT(self),
- spice_vmc_input_stream_read_async),
- -1);
-
- simple = (GSimpleAsyncResult *)result;
+ g_return_val_if_fail(g_task_is_valid(task, self), -1);
/* FIXME: calling _finish() is required. Disconnecting in
read_cancelled() causes a deadlock. #705395 */
- if (self->cancellable) {
- g_cancellable_disconnect(self->cancellable, self->cancel_id);
- g_clear_object(&self->cancellable);
- }
-
- if (g_simple_async_result_propagate_error(simple, error))
- return -1;
+ cancellable = g_task_get_cancellable(task);
+ if (cancellable)
+ g_cancellable_disconnect(cancellable, self->cancel_id);
- return g_simple_async_result_get_op_res_gssize(simple);
+ return g_task_propagate_int(task, error);
}
static void
@@ -244,21 +233,18 @@ spice_vmc_input_stream_read_async(GInputStream *stream,
gpointer user_data)
{
SpiceVmcInputStream *self = SPICE_VMC_INPUT_STREAM(stream);
- GSimpleAsyncResult *result;
+ GTask *task;
/* no concurrent read permitted by ginputstream */
- g_return_if_fail(self->result == NULL);
- g_return_if_fail(self->cancellable == NULL);
+ g_return_if_fail(self->task == NULL);
+ g_return_if_fail(g_task_get_cancellable(self->task) == NULL);
self->all = FALSE;
self->buffer = buffer;
self->count = count;
self->pos = 0;
- result = g_simple_async_result_new(G_OBJECT(self),
- callback,
- user_data,
- spice_vmc_input_stream_read_async);
- self->result = result;
- self->cancellable = g_object_ref(cancellable);
+
+ task = g_task_new(self, cancellable, callback, user_data);
+ self->task = task;
if (cancellable)
self->cancel_id =
g_cancellable_connect(cancellable, G_CALLBACK(read_cancelled), self, NULL);
@@ -272,27 +258,19 @@ spice_vmc_input_stream_read_finish(GInputStream *stream,
GAsyncResult *result,
GError **error)
{
- GSimpleAsyncResult *simple;
+ GTask *task = G_TASK(result);
+ GCancellable *cancellable;
SpiceVmcInputStream *self = SPICE_VMC_INPUT_STREAM(stream);
- g_return_val_if_fail(g_simple_async_result_is_valid(result,
- G_OBJECT(self),
- spice_vmc_input_stream_read_async),
- -1);
-
- simple = (GSimpleAsyncResult *)result;
+ g_return_val_if_fail(g_task_is_valid(task, self), -1);
/* FIXME: calling _finish() is required. Disconnecting in
read_cancelled() causes a deadlock. #705395 */
- if (self->cancellable) {
- g_cancellable_disconnect(self->cancellable, self->cancel_id);
- g_clear_object(&self->cancellable);
- }
-
- if (g_simple_async_result_propagate_error(simple, error))
- return -1;
+ cancellable = g_task_get_cancellable(task);
+ if (cancellable)
+ g_cancellable_disconnect(cancellable, self->cancel_id);
- return g_simple_async_result_get_op_res_gssize(simple);
+ return g_task_propagate_int(task, error);
}
static gssize
@@ -407,11 +385,10 @@ spice_vmc_output_stream_write_finish(GOutputStream *stream,
GError **error)
{
SpiceVmcOutputStream *self = SPICE_VMC_OUTPUT_STREAM(stream);
- GSimpleAsyncResult *res =
- g_simple_async_result_get_op_res_gpointer(G_SIMPLE_ASYNC_RESULT(simple));
+ GAsyncResult *res = g_task_propagate_pointer(G_TASK(simple), error);
SPICE_DEBUG("spicevmc write finish");
- return spice_vmc_write_finish(self->channel, G_ASYNC_RESULT(res), error);
+ return spice_vmc_write_finish(self->channel, res, error);
}
static void
@@ -419,12 +396,11 @@ write_cb(GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
- GSimpleAsyncResult *simple = user_data;
+ GTask *task = user_data;
- g_simple_async_result_set_op_res_gpointer(simple, res, NULL);
+ g_task_return_pointer(task, g_object_ref(task), g_object_unref);
- g_simple_async_result_complete(simple);
- g_object_unref(simple);
+ g_object_unref(task);
}
static void
@@ -437,16 +413,15 @@ spice_vmc_output_stream_write_async(GOutputStream *stream,
gpointer user_data)
{
SpiceVmcOutputStream *self = SPICE_VMC_OUTPUT_STREAM(stream);
- GSimpleAsyncResult *simple;
+ GTask *task;
SPICE_DEBUG("spicevmc write async");
/* an AsyncResult to forward async op to channel */
- simple = g_simple_async_result_new(G_OBJECT(self), callback, user_data,
- spice_vmc_output_stream_write_async);
+ task = g_task_new(self, cancellable, callback, user_data);
spice_vmc_write_async(self->channel, buffer, count,
cancellable, write_cb,
- simple);
+ task);
}
/* STREAM */
--
2.5.0
More information about the Spice-devel
mailing list