[Spice-devel] [spice-gtk (rebased) v3 1/2] file-transfer: increase reference for channel-main
Pavel Grunt
pgrunt at redhat.com
Wed Aug 10 11:45:59 UTC 2016
Ack for both patches
Pavel
On Wed, 2016-08-10 at 10:06 +0200, Victor Toso wrote:
> SpiceMainChannel uses the SpiceFileTransferTask reference given in the
> hash table provided by spice_file_transfer_task_create_tasks(). That
> means SpiceFileTransferTask is not holding a reference for itself but
> it relies on it due the async calls it provides.
>
> This patch increases the reference of each SpiceFileTransferTask for
> the hash table which will be unref'ed by channel-main in
> file_transfer_operation_task_finished(); the original reference is
> kept to SpiceFileTransferTask to be freed after the finish signal is
> emitted on spice_file_transfer_task_close_stream_cb().
>
> This patch fixes some critical warnings as we have two g_object_unref
> but only one reference.
> ---
> src/spice-file-transfer-task.c | 10 ++++++----
> 1 file changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/src/spice-file-transfer-task.c b/src/spice-file-transfer-task.c
> index 4689b71..58340e3 100644
> --- a/src/spice-file-transfer-task.c
> +++ b/src/spice-file-transfer-task.c
> @@ -325,6 +325,7 @@ void
> spice_file_transfer_task_completed(SpiceFileTransferTask *self,
> self->pending = TRUE;
> signal:
> g_signal_emit(self, task_signals[SIGNAL_FINISHED], 0, self->error);
> + /* SpiceFileTransferTask unref is done after input stream is closed */
> }
>
> G_GNUC_INTERNAL
> @@ -364,9 +365,10 @@ guint64
> spice_file_transfer_task_get_bytes_read(SpiceFileTransferTask *self)
>
> /* Helper function which only creates a SpiceFileTransferTask per GFile
> * in @files and returns a HashTable mapping task-id to the task itself
> - * Note that the HashTable does not free its values upon destruction:
> - * The SpiceFileTransferTask reference created here should be freed by
> - * spice_file_transfer_task_completed */
> + * The SpiceFileTransferTask created here has two references, one should be
> + * freed by spice_file_transfer_task_close_stream_cb() after
> + * spice_file_transfer_task_completed() is called and the other reference
> + * belongs to the caller and should be freed upon GHashTable destruction */
> G_GNUC_INTERNAL
> GHashTable *spice_file_transfer_task_create_tasks(GFile **files,
> SpiceMainChannel *channel,
> @@ -385,7 +387,7 @@ GHashTable *spice_file_transfer_task_create_tasks(GFile
> **files,
>
> xfer_task = spice_file_transfer_task_new(channel, files[i], flags,
> cancellable);
> task_id = spice_file_transfer_task_get_id(xfer_task);
> - g_hash_table_insert(xfer_ht, GUINT_TO_POINTER(task_id), xfer_task);
> + g_hash_table_insert(xfer_ht, GUINT_TO_POINTER(task_id),
> g_object_ref(xfer_task));
> }
> return xfer_ht;
> }
More information about the Spice-devel
mailing list