[Spice-devel] [PATCH spice-server 21/33] dispatcher: Port to Windows

Marc-André Lureau marcandre.lureau at gmail.com
Sat Dec 22 10:17:57 UTC 2018


Hi

On Fri, Dec 21, 2018 at 4:04 PM Frediano Ziglio <fziglio at redhat.com> wrote:
>
> Replace poll call with select.
> As socket is set to non-blocking we must support it so if
> we detect an EAGAIN error wait for data.

I am not fond of the two code paths, why not switch the code to select()?

I wonder if existing poll() could be easily replaced with WSAPoll.


>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  server/dispatcher.c | 20 ++++++++++++++++++++
>  1 file changed, 20 insertions(+)
>
> diff --git a/server/dispatcher.c b/server/dispatcher.c
> index 4cd91f11..9a55a4c9 100644
> --- a/server/dispatcher.c
> +++ b/server/dispatcher.c
> @@ -197,6 +197,7 @@ static int read_safe(socket_t fd, uint8_t *buf, size_t size, int block)
>      }
>
>      if (!block) {
> +#ifndef _WIN32
>          struct pollfd pollfd = {.fd = socket_get_raw(fd), .events = POLLIN, .revents = 0};
>          while ((ret = poll(&pollfd, 1, 0)) == -1) {
>              if (errno == EINTR) {
> @@ -209,6 +210,15 @@ static int read_safe(socket_t fd, uint8_t *buf, size_t size, int block)
>          if (!(pollfd.revents & POLLIN)) {
>              return 0;
>          }
> +#else
> +        struct timeval tv = { 0, 0 };
> +        fd_set fds;
> +        FD_ZERO(&fds);
> +        FD_SET(socket_get_raw(fd), &fds);
> +        if (select(1, &fds, NULL, NULL, &tv) < 1) {
> +            return 0;
> +        }
> +#endif
>      }
>      while (read_size < size) {
>          ret = socket_read(fd, buf + read_size, size - read_size);
> @@ -217,6 +227,16 @@ static int read_safe(socket_t fd, uint8_t *buf, size_t size, int block)
>                  spice_debug("EINTR in read");
>                  continue;
>              }
> +#ifdef _WIN32
> +            // Windows turns this socket not-blocking
> +            if (errno == EAGAIN) {
> +                fd_set fds;
> +                FD_ZERO(&fds);
> +                FD_SET(socket_get_raw(fd), &fds);
> +                select(1, &fds, NULL, NULL, NULL);
> +                continue;
> +            }
> +#endif
>              return -1;
>          }
>          if (ret == 0) {
> --
> 2.17.2
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel



--
Marc-André Lureau


More information about the Spice-devel mailing list