classification
Title: selects.KqueueSelector behaves incorrectly when no fds are registered
Type: Stage: resolved
Components: Library (Lib) Versions: Python 3.7, Python 3.6, Python 3.5
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: gvanrossum, njs, russelldavis
Priority: normal Keywords: patch

Created on 2017-01-12 23:35 by njs, last changed 2020-04-15 18:57 by gvanrossum. This issue is now closed.

Pull Requests
URL Status Linked Edit
PR 19508 merged russelldavis, 2020-04-14 08:12
Messages (3)
msg285352 - (view) Author: Nathaniel Smith (njs) * (Python committer) Date: 2017-01-12 23:35
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.
msg366162 - (view) Author: Russell Davis (russelldavis) * Date: 2020-04-10 22:52
This looks like it's the cause of https://bugs.python.org/issue25680
msg366540 - (view) Author: Guido van Rossum (gvanrossum) * (Python committer) Date: 2020-04-15 18:57
New changeset ba1bcffe5cafc1bb0ac6fdf9ecef51e75e342707 by Russell Davis in branch 'master':
bpo-29255: Wait in KqueueSelector.select when no fds are registered (GH-19508)
https://github.com/python/cpython/commit/ba1bcffe5cafc1bb0ac6fdf9ecef51e75e342707
History
Date User Action Args
2020-04-15 18:57:42gvanrossumsetstatus: open -> closed
resolution: fixed
stage: patch review -> resolved
2020-04-15 18:57:12gvanrossumsetnosy: + gvanrossum
messages: + msg366540
2020-04-14 08:12:25russelldavissetkeywords: + patch
stage: patch review
pull_requests: + pull_request18860
2020-04-10 22:52:55russelldavissetnosy: + russelldavis
messages: + msg366162
2017-01-12 23:35:07njscreate