[Spice-devel] [PATCH 02/11] worker: simplify process loops

Jonathon Jongsma jjongsma at redhat.com
Thu Feb 11 20:05:23 UTC 2016


Nice thorough explanation

Acked-by: Jonathon Jongsma <jjongsma at redhat.com>


On Tue, 2016-02-09 at 10:27 +0000, Frediano Ziglio wrote:
> It was not clear when req_cmd_notification was called.
> This code reproduce just the old behavior but is easier to read.
> 
> Steps are:
> 
> // original
> 
> if (worker->display_poll_tries < CMD_RING_POLL_RETRIES) {
>     worker->display_poll_tries++;
>     worker->event_timeout = MIN(worker->event_timeout, CMD_RING_POLL_TIMEOUT);
>     return n;
> }
> if (worker->display_poll_tries > CMD_RING_POLL_RETRIES ||
>              worker->qxl->st->qif->req_cmd_notification(worker->qxl)) {
>     worker->display_poll_tries++;
>     return n;
> }
> continue;
> 
> // split if
> 
> if (worker->display_poll_tries < CMD_RING_POLL_RETRIES) {
>     worker->display_poll_tries++;
>     worker->event_timeout = MIN(worker->event_timeout, CMD_RING_POLL_TIMEOUT);
>     return n;
> }
> if (worker->display_poll_tries > CMD_RING_POLL_RETRIES) {
>     worker->display_poll_tries++;
>     return n;
> }
> if (worker->qxl->st->qif->req_cmd_notification(worker->qxl)) {
>     worker->display_poll_tries++;
>     return n;
> }
> continue;
> 
> // order inside if
> 
> if (worker->display_poll_tries < CMD_RING_POLL_RETRIES) {
>     worker->event_timeout = MIN(worker->event_timeout, CMD_RING_POLL_TIMEOUT);
>     worker->display_poll_tries++;
>     return n;
> }
> if (worker->display_poll_tries > CMD_RING_POLL_RETRIES) {
>     worker->display_poll_tries++;
>     return n;
> }
> if (worker->qxl->st->qif->req_cmd_notification(worker->qxl)) {
>     worker->display_poll_tries++;
>     return n;
> }
> continue;
> 
> // consider cases
> 
> if (worker->display_poll_tries < CMD_RING_POLL_RETRIES) {
>     worker->event_timeout = MIN(worker->event_timeout, CMD_RING_POLL_TIMEOUT);
>     worker->display_poll_tries++;
>     return n;
> }
> if (worker->display_poll_tries > CMD_RING_POLL_RETRIES) {
>     worker->display_poll_tries++;
>     return n;
> }
> if (worker->display_poll_tries == CMD_RING_POLL_RETRIES) {
>     if (worker->qxl->st->qif->req_cmd_notification(worker->qxl)) {
>         worker->display_poll_tries++;
>         return n;
>     }
>     continue;
> }
> // unreachable
> 
> // invert if
> 
> if (worker->display_poll_tries < CMD_RING_POLL_RETRIES) {
>     worker->event_timeout = MIN(worker->event_timeout, CMD_RING_POLL_TIMEOUT);
>     worker->display_poll_tries++;
>     return n;
> }
> if (worker->display_poll_tries > CMD_RING_POLL_RETRIES) {
>     worker->display_poll_tries++;
>     return n;
> }
> if (worker->display_poll_tries == CMD_RING_POLL_RETRIES) {
>     if (!worker->qxl->st->qif->req_cmd_notification(worker->qxl)) {
>         continue;
>     }
>     worker->display_poll_tries++;
>     return n;
> }
> // unreachable
> 
> // reuse code
> 
> if (worker->display_poll_tries < CMD_RING_POLL_RETRIES) {
>     worker->event_timeout = MIN(worker->event_timeout, CMD_RING_POLL_TIMEOUT);
> } else if (worker->display_poll_tries > CMD_RING_POLL_RETRIES) {
> } else if (worker->display_poll_tries == CMD_RING_POLL_RETRIES) {
>     if (!worker->qxl->st->qif->req_cmd_notification(worker->qxl)) {
>         continue;
>     }
> }
> worker->display_poll_tries++;
> return n;
> 
> // remove empty if
> 
> if (worker->display_poll_tries < CMD_RING_POLL_RETRIES) {
>     worker->event_timeout = MIN(worker->event_timeout, CMD_RING_POLL_TIMEOUT);
> } else if (worker->display_poll_tries == CMD_RING_POLL_RETRIES) {
>     if (!worker->qxl->st->qif->req_cmd_notification(worker->qxl)) {
>         continue;
>     }
> }
> worker->display_poll_tries++;
> return n;
> 
> // collapse two conditions
> 
> if (worker->display_poll_tries < CMD_RING_POLL_RETRIES) {
>     worker->event_timeout = MIN(worker->event_timeout, CMD_RING_POLL_TIMEOUT);
> } else if (worker->display_poll_tries == CMD_RING_POLL_RETRIES &&
>            !worker->qxl->st->qif->req_cmd_notification(worker->qxl)) {
>     continue;
> }
> worker->display_poll_tries++;
> return n;
> 
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  server/red-worker.c | 26 ++++++++++----------------
>  1 file changed, 10 insertions(+), 16 deletions(-)
> 
> diff --git a/server/red-worker.c b/server/red-worker.c
> index e70c9df..ba37b6c 100644
> --- a/server/red-worker.c
> +++ b/server/red-worker.c
> @@ -167,16 +167,13 @@ static int red_process_cursor(RedWorker *worker, int
> *ring_is_empty)
>          if (!worker->qxl->st->qif->get_cursor_command(worker->qxl, &ext_cmd))
> {
>              *ring_is_empty = TRUE;
>              if (worker->cursor_poll_tries < CMD_RING_POLL_RETRIES) {
> -                worker->cursor_poll_tries++;
>                  worker->event_timeout = MIN(worker->event_timeout,
> CMD_RING_POLL_TIMEOUT);
> -                return n;
> +            } else if (worker->cursor_poll_tries == CMD_RING_POLL_RETRIES &&
> +                       !worker->qxl->st->qif->req_cursor_notification(worker
> ->qxl)) {
> +                continue;
>              }
> -            if (worker->cursor_poll_tries > CMD_RING_POLL_RETRIES ||
> -                worker->qxl->st->qif->req_cursor_notification(worker->qxl)) {
> -                worker->cursor_poll_tries++;
> -                return n;
> -            }
> -            continue;
> +            worker->cursor_poll_tries++;
> +            return n;
>          }
>          worker->cursor_poll_tries = 0;
>          switch (ext_cmd.cmd.type) {
> @@ -228,16 +225,13 @@ static int red_process_display(RedWorker *worker, int
> *ring_is_empty)
>          if (!worker->qxl->st->qif->get_command(worker->qxl, &ext_cmd)) {
>              *ring_is_empty = TRUE;
>              if (worker->display_poll_tries < CMD_RING_POLL_RETRIES) {
> -                worker->display_poll_tries++;
>                  worker->event_timeout = MIN(worker->event_timeout,
> CMD_RING_POLL_TIMEOUT);
> -                return n;
> +            } else if (worker->display_poll_tries == CMD_RING_POLL_RETRIES &&
> +                       !worker->qxl->st->qif->req_cmd_notification(worker
> ->qxl)) {
> +                continue;
>              }
> -            if (worker->display_poll_tries > CMD_RING_POLL_RETRIES ||
> -                         worker->qxl->st->qif->req_cmd_notification(worker
> ->qxl)) {
> -                worker->display_poll_tries++;
> -                return n;
> -            }
> -            continue;
> +            worker->display_poll_tries++;
> +            return n;
>          }
>  
>          if (worker->record_fd)


More information about the Spice-devel mailing list