[Spice-devel] [PATCH v2 7/9] worker: unify flush_cursor_commands and flush_display_commands
Pavel Grunt
pgrunt at redhat.com
Tue Jan 26 05:51:15 PST 2016
On Tue, 2016-01-26 at 09:44 +0000, Frediano Ziglio wrote:
> 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_channe
> l);
> + 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);
Looks good, but for symmetry I would keep flush_cursor_commands
Pavel
> }
>
> static int common_channel_config_socket(RedChannelClient *rcc)
More information about the Spice-devel
mailing list