1
1
import errno
2
- import select
2
+ import uselect as select
3
3
import usocket as _socket
4
4
from uasyncio .core import *
5
5
@@ -8,34 +8,41 @@ class EpollEventLoop(EventLoop):
8
8
9
9
def __init__ (self ):
10
10
EventLoop .__init__ (self )
11
- self .poller = select .epoll (1 )
11
+ self .poller = select .poll ()
12
+ self .objmap = {}
12
13
13
14
def add_reader (self , fd , cb , * args ):
14
15
if __debug__ :
15
16
log .debug ("add_reader%s" , (fd , cb , args ))
16
17
if args :
17
- self .poller .register (fd , select .EPOLLIN | select .EPOLLONESHOT , (cb , args ))
18
+ self .poller .register (fd , select .POLLIN )
19
+ self .objmap [fd ] = (cb , args )
18
20
else :
19
- self .poller .register (fd , select .EPOLLIN | select .EPOLLONESHOT , cb )
21
+ self .poller .register (fd , select .POLLIN )
22
+ self .objmap [fd ] = cb
20
23
21
24
def remove_reader (self , fd ):
22
25
if __debug__ :
23
26
log .debug ("remove_reader(%s)" , fd )
24
27
self .poller .unregister (fd )
28
+ del self .objmap [fd ]
25
29
26
30
def add_writer (self , fd , cb , * args ):
27
31
if __debug__ :
28
32
log .debug ("add_writer%s" , (fd , cb , args ))
29
33
if args :
30
- self .poller .register (fd , select .EPOLLOUT | select .EPOLLONESHOT , (cb , args ))
34
+ self .poller .register (fd , select .POLLOUT )
35
+ self .objmap [fd ] = (cb , args )
31
36
else :
32
- self .poller .register (fd , select .EPOLLOUT | select .EPOLLONESHOT , cb )
37
+ self .poller .register (fd , select .POLLOUT )
38
+ self .objmap [fd ] = cb
33
39
34
40
def remove_writer (self , fd ):
35
41
if __debug__ :
36
42
log .debug ("remove_writer(%s)" , fd )
37
43
try :
38
44
self .poller .unregister (fd )
45
+ self .objmap .pop (fd , None )
39
46
except OSError as e :
40
47
# StreamWriter.awrite() first tries to write to an fd,
41
48
# and if that succeeds, yield IOWrite may never be called
@@ -47,12 +54,14 @@ def remove_writer(self, fd):
47
54
def wait (self , delay ):
48
55
if __debug__ :
49
56
log .debug ("epoll.wait(%d)" , delay )
57
+ # We need one-shot behavior (second arg of 1 to .poll())
50
58
if delay == - 1 :
51
- res = self .poller .poll (- 1 )
59
+ res = self .poller .poll (- 1 , 1 )
52
60
else :
53
- res = self .poller .poll (int (delay * 1000 ))
61
+ res = self .poller .poll (int (delay * 1000 ), 1 )
54
62
#log.debug("epoll result: %s", res)
55
- for cb , ev in res :
63
+ for fd , ev in res :
64
+ cb = self .objmap [fd ]
56
65
if __debug__ :
57
66
log .debug ("Calling IO callback: %r" , cb )
58
67
if isinstance (cb , tuple ):
0 commit comments