A (perhaps silly) kqueue question

Dan Nelson dnelson at allantgroup.com
Fri Mar 14 16:02:03 UTC 2008


In the last episode (Mar 14), Vlad GALU said:
> On 3/14/08, Vlad GALU <dudu at dudu.ro> wrote:
> > On 3/8/08, Vlad GALU <dudu at dudu.ro> wrote:
> > > On 3/8/08, Robert Watson <rwatson at freebsd.org> wrote:
> > > > On Fri, 7 Mar 2008, Vlad GALU wrote:
> > > > > I see an unusual symptom with one of our in-house
> > > > > applications. The main I/O loop calls kevent(), which in turn
> > > > > returns two events with EV_EOF error set, always for the same
> > > > > descriptors (they're both socket descriptors). As the man
> > > > > page is not pretty clear about it and I don't have my UNP
> > > > > copy at hand, I would like to ask the list whether the error
> > > > > events are supposed to be one-shot or not.
> > > >
> > > >  I wonder if it's returning one event for the read socket
> > > >  buffer, and one event for the write socket buffer, since there
> > > >  are really two event sources for each socket?  Not that this
> > > >  is desirable behavior, but it might explain it.  If you
> > > >  shutdown() only read, do you get back one EOF kevent and one
> > > >  writable kevent?
> > >
> > >  I'll try that and see. The only issue being the low frequency
> > >  this symptom appears at. I'll get back to the list once I have
> > >  more info.
> >
> >  Haven't gotten to the point of testing shutdown() behavior, but
> >  here's a truss excerpt of the symptom:
> >
> >  -- cut here --
> >  kevent(3,0x0,0,{0x7,EVFILT_WRITE,EV_EOF,54,0x832c,0x800d08080 0x7,EVFILT_READ,EV_EOF,54,0x2a,0x800d08080},1024,0x0) = 2 (0x2)
> >  kevent(3,0x0,0,{0x7,EVFILT_WRITE,EV_EOF,54,0x832c,0x800d08080 0x7,EVFILT_READ,EV_EOF,54,0x2a,0x800d08080},1024,0x0) = 2 (0x2)
> >  kevent(3,0x0,0,{0x7,EVFILT_WRITE,EV_EOF,54,0x832c,0x800d08080 0x7,EVFILT_READ,EV_EOF,54,0x2a,0x800d08080},1024,0x0) = 2 (0x2)
> >  -- and here --
> >
> >  So two EOF are returrned for descriptor 7, and errno would be
> >  ECONNRESET. The question is now, why isn't it oneshot?
> 
> Ah one more thing. When EOF is caught, a handler which forcibly
> removes the event is called, but it keeps poping up again and again.

Are you sure the event is being removed?  I used to have a hack that
made the kernel return its current eventlist for a kqueue when you
called kevent() with nchanges set to -1 (handy for placing in a program
and using truss to print the result), but it has rotted.  I'm attaching
it in case anyone wants to make it work again.

Since you got EOF status for both the read and write halves of the
socket, why not just close the fd?  From my reading of the manpages,
unless you specified EV_ONESHOT when you added the event, events will
fire until you remove them or the condition that triggers them stops.

-- 
	Dan Nelson
	dnelson at allantgroup.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: kern_kevent.c.diff
Type: text/x-diff
Size: 1786 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20080314/db5e20c3/kern_kevent.c.bin


More information about the freebsd-hackers mailing list