[Spice-devel] [PATCH spice-server 21/33] dispatcher: Port to Windows
Frediano Ziglio
fziglio at redhat.com
Fri Dec 21 12:03:09 UTC 2018
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.
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
More information about the Spice-devel
mailing list