kern/45291: kevent(2) ignores timeout if nevents == 0

John-Mark Gurney gurney_j at
Mon Oct 13 15:47:18 PDT 2003

John Polstra wrote this message on Mon, Oct 13, 2003 at 09:37 -0700:
> On 13-Oct-2003 John-Mark Gurney wrote:
> > Synopsis: kevent(2) ignores timeout if nevents == 0
> > 
> > State-Changed-From-To: open->feedback
> > State-Changed-By: jmg
> > State-Changed-When: Mon Oct 13 00:46:53 PDT 2003
> > State-Changed-Why: 
> > to quote the man page: If timeout is a non-NULL pointer, it specifies
> > a maximum interval to wait for an event,
> > 
> > The behavior is correct since you wanted to wait for 0 events, and since
> > it has delivered all the events it can (none), it returns.  Unless provide
> > with good reason (or maybe a patch to the manpage to document this feature?)
> > I will close the PR in 5 days.
> I disagree.  The current behavior is not correct.  It is inconsistent
> with the longstanding behavior of both poll() and select().  Also,
> from a practical standpoint, returning immediately instead of
> waiting for the timeout to expire makes writing a typical event loop
> more awkward.  It requires the addition of a special case in the
> application code to deal with the situation where no events are being
> awaited.  That's not necessary when using poll() or select().

Simple fix, you wait for a single event, adding a struct kevent such as:
	struct kevent ke;
    ret = kevent(qfd, NULL, 0, &ke, 1, &ts);

makes it wait the full 10 seconds.  so, are you suggesting that we change
the behavior to wait for the timeout to expire before we return ANY
events? (because that is what your suggesting).  Special caseing when
someone passes in 0 is not good IMO... it will probably brake lots of
code that may in advertantly set as ts, but expect immediate return
because of not specifing any return events.

  John-Mark Gurney				Voice: +1 415 225 5579

     "All that I will do, has been done, All that I have, has not."

More information about the freebsd-bugs mailing list