Skip to content

Commit 69fecaf

Browse files
committed
uasyncio: Map socket to coroutine using uselect.poll "userdata" feature.
Instead of maintaining and querying external sock->coro map, use recently adding "associated userdata" feature of uselect.poll.
1 parent b8f91ce commit 69fecaf

File tree

1 file changed

+6
-14
lines changed

1 file changed

+6
-14
lines changed

uasyncio/uasyncio/__init__.py

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# (c) 2014-2018 Paul Sokolovsky. MIT license.
1+
# (c) 2014-2019 Paul Sokolovsky. MIT license.
22
import uerrno
33
import uselect as select
44
import usocket as _socket
@@ -21,38 +21,31 @@ class PollEventLoop(EventLoop):
2121
def __init__(self, runq_len=16, waitq_len=16):
2222
EventLoop.__init__(self, runq_len, waitq_len)
2323
self.poller = select.poll()
24-
self.objmap = {}
2524

2625
def add_reader(self, sock, cb, *args):
2726
if DEBUG and __debug__:
2827
log.debug("add_reader%s", (sock, cb, args))
2928
if args:
30-
self.poller.register(sock, select.POLLIN)
31-
self.objmap[id(sock)] = (cb, args)
29+
self.poller.register(sock, select.POLLIN, (cb, args))
3230
else:
33-
self.poller.register(sock, select.POLLIN)
34-
self.objmap[id(sock)] = cb
31+
self.poller.register(sock, select.POLLIN, cb)
3532

3633
def remove_reader(self, sock):
3734
if DEBUG and __debug__:
3835
log.debug("remove_reader(%s)", sock)
39-
self.objmap.pop(id(sock), None)
4036
self.poller.unregister(sock)
4137

4238
def add_writer(self, sock, cb, *args):
4339
if DEBUG and __debug__:
4440
log.debug("add_writer%s", (sock, cb, args))
4541
if args:
46-
self.poller.register(sock, select.POLLOUT)
47-
self.objmap[id(sock)] = (cb, args)
42+
self.poller.register(sock, select.POLLOUT, (cb, args))
4843
else:
49-
self.poller.register(sock, select.POLLOUT)
50-
self.objmap[id(sock)] = cb
44+
self.poller.register(sock, select.POLLOUT, cb)
5145

5246
def remove_writer(self, sock):
5347
if DEBUG and __debug__:
5448
log.debug("remove_writer(%s)", sock)
55-
self.objmap.pop(id(sock), None)
5649
# StreamWriter.awrite() first tries to write to a socket,
5750
# and if that succeeds, yield IOWrite may never be called
5851
# for that socket, and it will never be added to poller. So,
@@ -80,8 +73,7 @@ def wait(self, delay):
8073
# Remove "if res" workaround after
8174
# https://github.com/micropython/micropython/issues/2716 fixed.
8275
if res:
83-
for sock, ev in res:
84-
cb = self.objmap[id(sock)]
76+
for sock, ev, cb in res:
8577
if ev & (select.POLLHUP | select.POLLERR):
8678
# These events are returned even if not requested, and
8779
# are sticky, i.e. will be returned again and again.

0 commit comments

Comments
 (0)