From 4a4afa2901f8b71eb4e999a62746188d65e73864 Mon Sep 17 00:00:00 2001 From: Pavel Grunt Date: Tue, 25 Aug 2015 16:32:47 +0200 Subject: [PATCH 11/11] file-xfer: Add debug messages about a file transfer progress During the file transfer debug messages about the progress are printed every 20 seconds for each of the file transfer tasks. Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1140512 Acked-by: Frediano Ziglio --- gtk/channel-main.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/gtk/channel-main.c b/gtk/channel-main.c index 7ab3407..ae22333 100644 --- a/gtk/channel-main.c +++ b/gtk/channel-main.c @@ -70,6 +70,8 @@ typedef struct SpiceFileXferTask { char buffer[FILE_XFER_CHUNK_SIZE]; uint64_t read_bytes; uint64_t file_size; + GDateTime *start_time; + GDateTime *last_update; GError *error; } SpiceFileXferTask; @@ -1559,6 +1561,10 @@ static void file_xfer_task_free(SpiceFileXferTask *task) g_clear_object(&task->channel); g_clear_object(&task->file); g_clear_object(&task->file_stream); + if (spice_util_get_debug()) { + g_date_time_unref(task->start_time); + g_date_time_unref(task->last_update); + } g_free(task); } @@ -1594,6 +1600,23 @@ static void file_xfer_close_cb(GObject *object, g_simple_async_result_set_op_res_gboolean(res, FALSE); } else { g_simple_async_result_set_op_res_gboolean(res, TRUE); + if (spice_util_get_debug()) { + GDateTime *now = g_date_time_new_now_local(); + gchar *basename = g_file_get_basename(task->file); + double seconds = + (double) g_date_time_difference(now, task->start_time) / G_TIME_SPAN_SECOND; + gchar *file_size_str = g_format_size(task->file_size); + gchar *transfer_speed_str = g_format_size(task->file_size / seconds); + + g_warn_if_fail(task->read_bytes == task->file_size); + SPICE_DEBUG("transferred file %s of %s size in %.1f seconds (%s/s)", + basename, file_size_str, seconds, transfer_speed_str); + + g_free(basename); + g_free(file_size_str); + g_free(transfer_speed_str); + g_date_time_unref(now); + } } g_simple_async_result_complete_in_idle(res); g_object_unref(res); @@ -1616,6 +1639,21 @@ static void file_xfer_data_flushed_cb(GObject *source_object, return; } + if (spice_util_get_debug()) { + const GTimeSpan interval = 20 * G_TIME_SPAN_SECOND; + GDateTime *now = g_date_time_new_now_local(); + + if (interval < g_date_time_difference(now, task->last_update)) { + gchar *basename = g_file_get_basename(task->file); + g_date_time_unref(task->last_update); + task->last_update = g_date_time_ref(now); + SPICE_DEBUG("transferred %.2f%% of the file %s", + 100.0 * task->read_bytes / task->file_size, basename); + g_free(basename); + } + g_date_time_unref(now); + } + if (task->progress_callback) task->progress_callback(task->read_bytes, task->file_size, task->progress_callback_data); @@ -2775,6 +2813,14 @@ static void file_xfer_send_start_msg_async(SpiceMainChannel *channel, task->callback = callback; task->user_data = user_data; + if (spice_util_get_debug()) { + gchar *basename = g_file_get_basename(task->file); + task->start_time = g_date_time_new_now_local(); + task->last_update = g_date_time_ref(task->start_time); + + SPICE_DEBUG("transfer of file %s has started", basename); + g_free(basename); + } CHANNEL_DEBUG(task->channel, "Insert a xfer task:%d to task list", task->id); g_hash_table_insert(c->file_xfer_tasks, GUINT_TO_POINTER(task->id), task); -- 2.4.3