I known about this blog post:
  https://daniel.haxx.se/blog/2012/10/10/wsapoll-is-broken/

But it looks like things in Winsock has improved in 10 years.
Experimenting with using WSAPoll()' in select.c, it works fine
except for the 'POLLPRI' bit (throwing 'WSAEINVAL').

MSDN [1] states:
  Priority data may be read without blocking. This flag is
  not supported by the Microsoft Winsock provider.

So with this patch:

--- a/lib/select.c 2022-07-05 11:24:59
+++ b/lib/select.c 2022-07-05 12:39:24
@@ -309,7 +309,16 @@
     pending_ms = -1;
   else
     pending_ms = 0;
+
+#ifdef USE_WINSOCK
+  /* Remove the unsupported 'POLLPRI' bits */
+  for (i = 0; i < nfds; i++)
+      ufds[i].events &= ~POLLPRI;
+  r = WSAPoll(ufds, nfds, pending_ms);
+#else
   r = poll(ufds, nfds, pending_ms);
+#endif
+
   if(r <= 0) {
     if((r == -1) && (SOCKERRNO == EINTR))
       /* make EINTR from select or poll not a "lethal" error */

-----

it works fine. But I've done little testing. And I've not seen
any improvement in speed or CPU-load.

So how about supporting 'WSAPoll()' with a 'HAVE_POLL_FINE'?

Perhaps this could be configurable? Like in
nmap --nsock-engine=poll, nmap --nsock-engine=iocp etc?

[1] 
https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsapoll#remarks

--
--gv
--
Unsubscribe: https://lists.haxx.se/listinfo/curl-library
Etiquette:   https://curl.se/mail/etiquette.html

Reply via email to