On Sat, May 20, 2023 at 10:01 AM Jacob Champion <jchamp...@timescale.com> wrote: > - The client implementation is currently epoll-/Linux-specific. I think > kqueue shouldn't be too much trouble for the BSDs, but it's even more > code to maintain.
I guess you also need a fallback that uses plain old POSIX poll()? I see you're not just using epoll but also timerfd. Could that be converted to plain old timeout bookkeeping? That should be enough to get every other Unix and *possibly* also Windows to work with the same code path. > - Unless someone is aware of some amazing Winsock magic, I'm pretty sure > the multiplexed-socket approach is dead in the water on Windows. I think > the strategy there probably has to be a background thread plus a fake > "self-pipe" (loopback socket) for polling... which may be controversial? I am not a Windows user or hacker, but there are certainly several ways to multiplex sockets. First there is the WSAEventSelect() + WaitForMultipleObjects() approach that latch.c uses. It has the advantage that it allows socket readiness to be multiplexed with various other things that use Windows "events". But if you don't need that, ie you *only* need readiness-based wakeup for a bunch of sockets and no other kinds of fd or object, you can use winsock's plain old select() or its fairly faithful poll() clone called WSAPoll(). It looks a bit like that'd be true here if you could kill the timerfd? It's a shame to write modern code using select(), but you can find lots of shouting all over the internet about WSAPoll()'s defects, most famously the cURL guys[1] whose blog is widely cited, so people still do it. Possibly some good news on that front: by my reading of the docs, it looks like that problem was fixed in Windows 10 2004[2] which itself is by now EOL, so all systems should have the fix? I suspect that means that, finally, you could probably just use the same poll() code path for Unix (when epoll is not available) *and* Windows these days, making porting a lot easier. But I've never tried it, so I don't know what other problems there might be. Another thing people complain about is the lack of socketpair() or similar in winsock which means you unfortunately can't easily make anonymous select/poll-compatible local sockets, but that doesn't seem to be needed here. [1] https://daniel.haxx.se/blog/2012/10/10/wsapoll-is-broken/ [2] https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsapoll