From 28acc93ef932f57d7bfb67b80f5e477ed09fde2a Mon Sep 17 00:00:00 2001 From: Daniel Mizyrycki Date: Sun, 25 Dec 2016 17:22:55 -0800 Subject: [PATCH] uasyncio: Add minimum esp8266 support --- uasyncio.core/uasyncio/core.py | 8 ++++---- uasyncio/uasyncio/__init__.py | 22 +++++++++++++++------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/uasyncio.core/uasyncio/core.py b/uasyncio.core/uasyncio/core.py index e945fc7ae..a0d0e11b0 100644 --- a/uasyncio.core/uasyncio/core.py +++ b/uasyncio.core/uasyncio/core.py @@ -91,16 +91,16 @@ def run_forever(self): # self.add_reader(ret.obj.fileno(), lambda self, c, f: self.call_soon(c, f), self, cb, ret.obj) # self.add_reader(ret.obj.fileno(), lambda c, f: self.call_soon(c, f), cb, ret.obj) # self.add_reader(arg.fileno(), lambda cb: self.call_soon(cb), cb) - self.add_reader(arg.fileno(), cb) + self.add_reader(arg, cb) continue elif isinstance(ret, IOWrite): # self.add_writer(arg.fileno(), lambda cb: self.call_soon(cb), cb) - self.add_writer(arg.fileno(), cb) + self.add_writer(arg, cb) continue elif isinstance(ret, IOReadDone): - self.remove_reader(arg.fileno()) + self.remove_reader(arg) elif isinstance(ret, IOWriteDone): - self.remove_writer(arg.fileno()) + self.remove_writer(arg) elif isinstance(ret, StopLoop): return arg elif isinstance(ret, type_gen): diff --git a/uasyncio/uasyncio/__init__.py b/uasyncio/uasyncio/__init__.py index 3d1fffc22..bae8b97a9 100644 --- a/uasyncio/uasyncio/__init__.py +++ b/uasyncio/uasyncio/__init__.py @@ -2,6 +2,14 @@ import uselect as select import usocket as _socket from uasyncio.core import * +from sys import platform + +def sock_fd(sock_ref): + # Compute socket file descriptor replacement for esp8266 + # sock_ref is a fd in most systems. esp8266 uses sockets instead + if isinstance(sock_ref, int): + return sock_ref + return sock_ref.fileno() if platform != 'esp8266' else id(sock_ref) class EpollEventLoop(EventLoop): @@ -16,33 +24,33 @@ def add_reader(self, fd, cb, *args): log.debug("add_reader%s", (fd, cb, args)) if args: self.poller.register(fd, select.POLLIN) - self.objmap[fd] = (cb, args) + self.objmap[sock_fd(fd)] = (cb, args) else: self.poller.register(fd, select.POLLIN) - self.objmap[fd] = cb + self.objmap[sock_fd(fd)] = cb def remove_reader(self, fd): if __debug__: log.debug("remove_reader(%s)", fd) self.poller.unregister(fd) - del self.objmap[fd] + del self.objmap[sock_fd(fd)] def add_writer(self, fd, cb, *args): if __debug__: log.debug("add_writer%s", (fd, cb, args)) if args: self.poller.register(fd, select.POLLOUT) - self.objmap[fd] = (cb, args) + self.objmap[sock_fd(fd)] = (cb, args) else: self.poller.register(fd, select.POLLOUT) - self.objmap[fd] = cb + self.objmap[sock_fd(fd)] = cb def remove_writer(self, fd): if __debug__: log.debug("remove_writer(%s)", fd) try: self.poller.unregister(fd) - self.objmap.pop(fd, None) + self.objmap.pop(sock_fd(fd), None) except OSError as e: # StreamWriter.awrite() first tries to write to an fd, # and if that succeeds, yield IOWrite may never be called @@ -61,7 +69,7 @@ def wait(self, delay): res = self.poller.poll(delay, 1) #log.debug("epoll result: %s", res) for fd, ev in res: - cb = self.objmap[fd] + cb = self.objmap[sock_fd(fd)] if __debug__: log.debug("Calling IO callback: %r", cb) if isinstance(cb, tuple):