New submission from Nathaniel Smith:

When calling kevent(), selectors.KqueueSelector.select sets the "maxevents" 
argument to len(self._fd_to_key). So if there are no fds registered, it passes 
maxevents=0.

It turns out that the kevent() API has a special case behavior for maxevents=0: 
it returns immediately, ignoring timeout. I have no idea why kevent() works 
this way, but it's specifically called out in the man page:

   The nevents argument determines the size of eventlist.  When
   nevents is zero, kevent() will return immediately even if there is a
   timeout specified unlike select(2).

https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2

It happens that asyncio doesn't run into this because asyncio always has at 
least one fd registered with its selector, but this causes problems for other 
users of the selectors module, e.g.:
  https://github.com/dabeaz/curio/issues/156

I believe fix would just be to add some code like: "if max_ev == 0: max_ev = 1" 
to selectors.KqueueSelector.select.

----------
components: Library (Lib)
messages: 285352
nosy: njs
priority: normal
severity: normal
status: open
title: selects.KqueueSelector behaves incorrectly when no fds are registered
versions: Python 3.5, Python 3.6, Python 3.7

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue29255>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to