@@ -50,12 +50,11 @@ def _fileobj_to_fd(fileobj):
50
50
Object used to associate a file object to its backing
51
51
file descriptor, selected event mask, and attached data.
52
52
"""
53
- if sys .version_info >= (3 , 5 ):
54
- SelectorKey .fileobj .__doc__ = 'File object registered.'
55
- SelectorKey .fd .__doc__ = 'Underlying file descriptor.'
56
- SelectorKey .events .__doc__ = 'Events that must be waited for on this file object.'
57
- SelectorKey .data .__doc__ = ('''Optional opaque data associated to this file object.
58
- For example, this could be used to store a per-client session ID.''' )
53
+ SelectorKey .fileobj .__doc__ = 'File object registered.'
54
+ SelectorKey .fd .__doc__ = 'Underlying file descriptor.'
55
+ SelectorKey .events .__doc__ = 'Events that must be waited for on this file object.'
56
+ SelectorKey .data .__doc__ = ('''Optional opaque data associated to this file object.
57
+ For example, this could be used to store a per-client session ID.''' )
59
58
60
59
61
60
class _SelectorMapping (Mapping ):
@@ -510,6 +509,7 @@ class KqueueSelector(_BaseSelectorImpl):
510
509
def __init__ (self ):
511
510
super ().__init__ ()
512
511
self ._selector = select .kqueue ()
512
+ self ._max_events = 0
513
513
514
514
def fileno (self ):
515
515
return self ._selector .fileno ()
@@ -521,10 +521,12 @@ def register(self, fileobj, events, data=None):
521
521
kev = select .kevent (key .fd , select .KQ_FILTER_READ ,
522
522
select .KQ_EV_ADD )
523
523
self ._selector .control ([kev ], 0 , 0 )
524
+ self ._max_events += 1
524
525
if events & EVENT_WRITE :
525
526
kev = select .kevent (key .fd , select .KQ_FILTER_WRITE ,
526
527
select .KQ_EV_ADD )
527
528
self ._selector .control ([kev ], 0 , 0 )
529
+ self ._max_events += 1
528
530
except :
529
531
super ().unregister (fileobj )
530
532
raise
@@ -535,6 +537,7 @@ def unregister(self, fileobj):
535
537
if key .events & EVENT_READ :
536
538
kev = select .kevent (key .fd , select .KQ_FILTER_READ ,
537
539
select .KQ_EV_DELETE )
540
+ self ._max_events -= 1
538
541
try :
539
542
self ._selector .control ([kev ], 0 , 0 )
540
543
except OSError :
@@ -544,6 +547,7 @@ def unregister(self, fileobj):
544
547
if key .events & EVENT_WRITE :
545
548
kev = select .kevent (key .fd , select .KQ_FILTER_WRITE ,
546
549
select .KQ_EV_DELETE )
550
+ self ._max_events -= 1
547
551
try :
548
552
self ._selector .control ([kev ], 0 , 0 )
549
553
except OSError :
@@ -556,7 +560,7 @@ def select(self, timeout=None):
556
560
# If max_ev is 0, kqueue will ignore the timeout. For consistent
557
561
# behavior with the other selector classes, we prevent that here
558
562
# (using max). See https://bugs.python.org/issue29255
559
- max_ev = max ( len ( self ._fd_to_key ), 1 )
563
+ max_ev = self ._max_events or 1
560
564
ready = []
561
565
try :
562
566
kev_list = self ._selector .control (None , max_ev , timeout )
0 commit comments