[Spice-devel] [PATCH v2 7/9] worker: unify flush_cursor_commands and flush_display_commands
Frediano Ziglio
fziglio at redhat.com
Tue Jan 26 01:44:34 PST 2016
Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
server/red-worker.c | 68 ++++++++++++++++++-----------------------------------
1 file changed, 23 insertions(+), 45 deletions(-)
diff --git a/server/red-worker.c b/server/red-worker.c
index dd20bd5..5eb54f2 100644
--- a/server/red-worker.c
+++ b/server/red-worker.c
@@ -368,20 +368,22 @@ static void red_migrate_display(DisplayChannel *display, RedChannelClient *rcc)
}
}
-static void flush_display_commands(RedWorker *worker)
-{
- RedChannel *red_channel = RED_CHANNEL(worker->display_channel);
+typedef int (*red_process_t)(RedWorker *worker, int *ring_is_empty);
+typedef void (*red_disconnect_t)(RedWorker *worker);
+static void flush_commands(RedWorker *worker, RedChannel *red_channel,
+ red_process_t process, red_disconnect_t disconnect)
+{
for (;;) {
uint64_t end_time;
int ring_is_empty;
- red_process_display(worker, &ring_is_empty);
+ process(worker, &ring_is_empty);
if (ring_is_empty) {
break;
}
- while (red_process_display(worker, &ring_is_empty)) {
+ while (process(worker, &ring_is_empty)) {
red_channel_push(red_channel);
}
@@ -389,7 +391,6 @@ static void flush_display_commands(RedWorker *worker)
break;
}
end_time = spice_get_monotonic_time_ns() + COMMON_CLIENT_TIMEOUT;
- int sleep_count = 0;
for (;;) {
red_channel_push(red_channel);
if (red_channel_max_pipe_size(red_channel) <= MAX_PIPE_SIZE) {
@@ -400,54 +401,30 @@ static void flush_display_commands(RedWorker *worker)
// TODO: MC: the whole timeout will break since it takes lowest timeout, should
// do it client by client.
if (spice_get_monotonic_time_ns() >= end_time) {
- spice_warning("update timeout");
- red_disconnect_all_display_TODO_remove_me(red_channel);
+ disconnect(worker);
} else {
- sleep_count++;
usleep(DISPLAY_CLIENT_RETRY_INTERVAL);
}
}
}
}
-static void flush_cursor_commands(RedWorker *worker)
+static void red_disconnect_display(RedWorker *worker)
{
- RedChannel *red_channel = RED_CHANNEL(worker->cursor_channel);
-
- for (;;) {
- uint64_t end_time;
- int ring_is_empty = FALSE;
-
- red_process_cursor(worker, &ring_is_empty);
- if (ring_is_empty) {
- break;
- }
+ spice_warning("update timeout");
+ red_disconnect_all_display_TODO_remove_me(RED_CHANNEL(worker->display_channel));
+}
- while (red_process_cursor(worker, &ring_is_empty)) {
- red_channel_push(red_channel);
- }
+static void flush_display_commands(RedWorker *worker)
+{
+ flush_commands(worker, RED_CHANNEL(worker->display_channel),
+ red_process_display, red_disconnect_display);
+}
- if (ring_is_empty) {
- break;
- }
- end_time = spice_get_monotonic_time_ns() + COMMON_CLIENT_TIMEOUT;
- int sleep_count = 0;
- for (;;) {
- red_channel_push(red_channel);
- if (red_channel_max_pipe_size(red_channel) <= MAX_PIPE_SIZE) {
- break;
- }
- red_channel_receive(red_channel);
- red_channel_send(red_channel);
- if (spice_get_monotonic_time_ns() >= end_time) {
- spice_warning("flush cursor timeout");
- cursor_channel_disconnect(worker->cursor_channel);
- } else {
- sleep_count++;
- usleep(DISPLAY_CLIENT_RETRY_INTERVAL);
- }
- }
- }
+static void red_disconnect_cursor(RedWorker *worker)
+{
+ spice_warning("flush cursor timeout");
+ cursor_channel_disconnect(worker->cursor_channel);
}
// TODO: on timeout, don't disconnect all channels immediatly - try to disconnect the slowest ones
@@ -456,7 +433,8 @@ static void flush_cursor_commands(RedWorker *worker)
static void flush_all_qxl_commands(RedWorker *worker)
{
flush_display_commands(worker);
- flush_cursor_commands(worker);
+ flush_commands(worker, RED_CHANNEL(worker->cursor_channel),
+ red_process_cursor, red_disconnect_cursor);
}
static int common_channel_config_socket(RedChannelClient *rcc)
--
2.4.3
More information about the Spice-devel
mailing list