[Spice-devel] [PATCH spice-gtk 1/2] vmcstream: fix task cancellation
Victor Toso
victortoso at redhat.com
Thu Aug 22 08:37:06 UTC 2019
Hi,
On Tue, Aug 20, 2019 at 04:05:46PM +0200, Jakub Janků wrote:
> If the task is cancelled, g_task_propagate_pointer()
> in spice_vmc_output_stream_write_finish() returns NULL
> which produces following errors:
>
> (spicy:13597): GSpice-CRITICAL **: 15:39:46.168: spice_vmc_write_finish: assertion 'result != NULL' failed
>
> (spicy:13597): GLib-GObject-CRITICAL **: 15:39:46.168: g_object_unref: assertion 'G_IS_OBJECT (object)' failed
What I found weird was actually that we do _ref() on write_cb()
but this got cleanup anyway, seems like a bug somewhere.
I don't see nothing wrong with your proposal, actually thinks it
is better to do the write on write_cb() and let the _finish()
just provide the overall feedback of the _async() call.
> To fix this, call spice_vmc_write_finish() immediately in the
> corresponding write_cb().
>
> Signed-off-by: Jakub Janků <jjanku at redhat.com>
Acked-by: Victor Toso <victortoso at redhat.com>
> ---
> src/vmcstream.c | 23 ++++++++++++-----------
> 1 file changed, 12 insertions(+), 11 deletions(-)
>
> diff --git a/src/vmcstream.c b/src/vmcstream.c
> index b6f6d1a..b7da103 100644
> --- a/src/vmcstream.c
> +++ b/src/vmcstream.c
> @@ -397,18 +397,11 @@ spice_vmc_output_stream_write_fn(GOutputStream *stream,
>
> static gssize
> spice_vmc_output_stream_write_finish(GOutputStream *stream,
> - GAsyncResult *simple,
> + GAsyncResult *result,
> GError **error)
> {
> - SpiceVmcOutputStream *self = SPICE_VMC_OUTPUT_STREAM(stream);
> - GAsyncResult *res = g_task_propagate_pointer(G_TASK(simple), error);
> - gssize bytes_written;
> -
> - SPICE_DEBUG("spicevmc write finish");
> - bytes_written = spice_vmc_write_finish(self->channel, res, error);
> - g_object_unref(res);
> -
> - return bytes_written;
> + g_return_val_if_fail(g_task_is_valid(result, stream), -1);
> + return g_task_propagate_int(G_TASK(result), error);
> }
>
> static void
> @@ -417,9 +410,17 @@ write_cb(GObject *source_object,
> gpointer user_data)
> {
> GTask *task = user_data;
> + GError *error = NULL;
> + gssize bytes_written;
>
> - g_task_return_pointer(task, g_object_ref(res), g_object_unref);
> + SPICE_DEBUG("spicevmc write finish");
> + bytes_written = spice_vmc_write_finish(SPICE_CHANNEL(source_object), res, &error);
>
> + if (error) {
> + g_task_return_error(task, error);
> + } else {
> + g_task_return_int(task, bytes_written);
> + }
> g_object_unref(task);
> }
>
> --
> 2.21.0
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20190822/6cc61542/attachment.sig>
More information about the Spice-devel
mailing list