On Tue, Feb 02, 2021 at 07:47:09PM +0000, Roy Marples wrote: > On 02/02/2021 19:43, Manuel Bouyer wrote: > > On Tue, Feb 02, 2021 at 07:39:39PM +0000, Roy Marples wrote: > > > On 02/02/2021 18:20, Manuel Bouyer wrote: > > > > Hello, > > > > I've been debugging an issue wuth Xen, where xenstored loops at 100% > > > > CPU on poll(2). > > > > after code analysis it's looping on closed Unix socket desriptors. > > > > From what I understood the code expect poll(2) to return something > > > > different from POLLIN when the remote end of the socket is > > > > closed (it checks for (~(POLLOUT|POLLIN)) to it could be either > > > > POLLERR or POLLHUP I guess - or eventually POLLRDHUP which we don't > > > > have). > > > > > > > > Who is right here, linux or NetBSD (linux claims to be posix, while > > > > our man page doens't mention it) ? > > > > > > > > Is there a way to check if a connection has been closed without a > > > > read() ? > > > > > > Oddly enough I was looking at this in poll myself recently. > > > As it turns out, if the socket has a remote end (which sockets do) then > > > the > > > EOF or hangup needs to be read via POLLIN. > > > If thre is no remote end (like say a file descriptor) then you get > > > POLLHUP. > > > > > > This is common with other OS's and select(2). > > > The rationale is that the peer closing the socket (ie shutdown()) need is > > > sent on the wire and is thus a read(), whereas the local file desciptor is > > > an event. > > > > > > So short answer - no. You need to read() and get the error that way. > > > > I didn't mention it specifically, but the socket used by Xen is a > > Unix (connected) socket. but I guess it's no different from network sockets. > > Correct. > > If you use kqueue(2) and EVFILT_READ on a socket then our man page claims > that EV_EOF is set in flags. > > Is that of any use to you? > It does mean using a BSD only interface though, changing from poll to kqueue.
thanks. This will require code reorg but it may be an option. -- Manuel Bouyer <bou...@antioche.eu.org> NetBSD: 26 ans d'experience feront toujours la difference --