[Spice-devel] [PATCH] worker: unify flush_cursor_commands and flush_display_commands
Jonathon Jongsma
jjongsma at redhat.com
Thu Jan 28 11:28:00 PST 2016
Acked-by: Jonathon Jongsma <jjongsma at redhat.com>
On Thu, 2016-01-28 at 16:15 +0000, Frediano Ziglio wrote:
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> server/red-worker.c | 75 +++++++++++++++++++---------------------------------
> -
> 1 file changed, 26 insertions(+), 49 deletions(-)
>
> diff --git a/server/red-worker.c b/server/red-worker.c
> index eb87813..90ece22 100644
> --- a/server/red-worker.c
> +++ b/server/red-worker.c
> @@ -340,15 +340,15 @@ static void red_push(RedWorker *worker)
> }
> }
>
> -void red_disconnect_all_display_TODO_remove_me(RedChannel *channel)
> +static void red_disconnect_display(RedWorker *worker)
> {
> + spice_warning("update timeout");
> +
> // TODO: we need to record the client that actually causes the timeout.
> So
> // we need to check the locations of the various pipe heads when
> counting,
> // and disconnect only those/that.
> - if (!channel) {
> - return;
> - }
> - red_channel_apply_clients(channel, red_channel_client_disconnect);
> + red_channel_apply_clients(RED_CHANNEL(worker->display_channel),
> + red_channel_client_disconnect);
> }
>
> static void red_migrate_display(DisplayChannel *display, RedChannelClient
> *rcc)
> @@ -369,20 +369,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);
> }
>
> @@ -390,7 +392,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) {
> @@ -401,54 +402,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 flush_display_commands(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;
> - }
> + flush_commands(worker, RED_CHANNEL(worker->display_channel),
> + red_process_display, red_disconnect_display);
> +}
>
> - while (red_process_cursor(worker, &ring_is_empty)) {
> - red_channel_push(red_channel);
> - }
> +static void red_disconnect_cursor(RedWorker *worker)
> +{
> + spice_warning("flush cursor timeout");
> + cursor_channel_disconnect(worker->cursor_channel);
> +}
>
> - 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 flush_cursor_commands(RedWorker *worker)
> +{
> + flush_commands(worker, RED_CHANNEL(worker->cursor_channel),
> + red_process_cursor, red_disconnect_cursor);
> }
>
> // TODO: on timeout, don't disconnect all channels immediatly - try to
> disconnect the slowest ones
More information about the Spice-devel
mailing list