Skip to content

Commit 279487e

Browse files
committed
uasyncio: improve memory footprint
1 parent ba1ae98 commit 279487e

File tree

2 files changed

+22
-48
lines changed

2 files changed

+22
-48
lines changed

uasyncio.core/uasyncio/core.py

+8-23
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,7 @@
22
import utime as time
33
except ImportError:
44
import time
5-
try:
6-
from utimeq import utimeq
7-
except ImportError:
8-
class utimeq(object):
9-
# Simple utimeq drop-in
10-
_q = list()
11-
def __new__(cls, len=128):
12-
self = super(utimeq, cls).__new__(cls)
13-
self.__dict__ = None # Garbage collect unneeded instance dict
14-
return self
15-
def push(self, *args):
16-
self._q.append(args)
17-
def pop(self, l):
18-
l[:] = list(self._q.pop(0))
19-
def __len__(self):
20-
return len(self._q)
5+
import utimeq
216
import logging
227

238

@@ -27,10 +12,10 @@ def __len__(self):
2712

2813
type_gen = type((lambda: (yield))())
2914

30-
3115
class EventLoop:
16+
3217
def __init__(self, len=128):
33-
self.q = utimeq(len)
18+
self.q = utimeq.utimeq(len)
3419

3520
def time(self):
3621
return time.ticks_ms()
@@ -99,23 +84,23 @@ def run_forever(self):
9984
if __debug__ and DEBUG:
10085
log.debug("Coroutine %s yield result: %s", cb, ret)
10186
if isinstance(ret, SysCall1):
102-
sock = ret.arg
87+
arg = ret.arg
10388
if isinstance(ret, Sleep):
10489
delay = int(arg * 1000)
10590
elif isinstance(ret, IORead):
10691
# self.add_reader(ret.obj.fileno(), lambda self, c, f: self.call_soon(c, f), self, cb, ret.obj)
10792
# self.add_reader(ret.obj.fileno(), lambda c, f: self.call_soon(c, f), cb, ret.obj)
10893
# self.add_reader(arg.fileno(), lambda cb: self.call_soon(cb), cb)
109-
self.add_reader(sock, cb)
94+
self.add_reader(arg, cb)
11095
continue
11196
elif isinstance(ret, IOWrite):
11297
# self.add_writer(arg.fileno(), lambda cb: self.call_soon(cb), cb)
113-
self.add_writer(sock, cb)
98+
self.add_writer(arg, cb)
11499
continue
115100
elif isinstance(ret, IOReadDone):
116-
self.remove_reader(sock)
101+
self.remove_reader(arg)
117102
elif isinstance(ret, IOWriteDone):
118-
self.remove_writer(sock)
103+
self.remove_writer(arg)
119104
elif isinstance(ret, StopLoop):
120105
return arg
121106
elif isinstance(ret, type_gen):

uasyncio/uasyncio/__init__.py

+14-25
Original file line numberDiff line numberDiff line change
@@ -4,64 +4,53 @@
44
from uasyncio.core import *
55
from sys import platform
66

7-
class ObjMap(dict):
8-
@staticmethod
9-
def sock_fd(sock_ref):
10-
# Compute socket file descriptor replacement for esp8266
11-
# sock_ref is a fd in most systems. esp8266 uses sockets instead
12-
if isinstance(sock_ref, int):
13-
return sock_ref
14-
return sock_ref.fileno() if platform != 'esp8266' else id(sock_ref)
15-
def __getitem__(self, key):
16-
return super().__getitem__(self.sock_fd(key))
17-
def __setitem__(self, key, value):
18-
super().__setitem__(self.sock_fd(key), value)
19-
def __delitem__(self, key):
20-
return super().__delitem__(self.sock_fd(key))
21-
def __contains__(self, key):
22-
return True if self.sock_fd(key) in self.keys() else False
7+
def sock_fd(sock_ref):
8+
# Compute socket file descriptor replacement for esp8266
9+
# sock_ref is a fd in most systems. esp8266 uses sockets instead
10+
if isinstance(sock_ref, int):
11+
return sock_ref
12+
return sock_ref.fileno() if platform != 'esp8266' else id(sock_ref)
2313

2414

2515
class EpollEventLoop(EventLoop):
2616

2717
def __init__(self):
2818
EventLoop.__init__(self)
2919
self.poller = select.poll()
30-
self.objmap = ObjMap()
20+
self.objmap = {}
3121

3222
def add_reader(self, fd, cb, *args):
3323
if __debug__:
3424
log.debug("add_reader%s", (fd, cb, args))
3525
if args:
3626
self.poller.register(fd, select.POLLIN)
37-
self.objmap[fd] = (cb, args)
27+
self.objmap[sock_fd(fd)] = (cb, args)
3828
else:
3929
self.poller.register(fd, select.POLLIN)
40-
self.objmap[fd] = cb
30+
self.objmap[sock_fd(fd)] = cb
4131

4232
def remove_reader(self, fd):
4333
if __debug__:
4434
log.debug("remove_reader(%s)", fd)
4535
self.poller.unregister(fd)
46-
del self.objmap[fd]
36+
del self.objmap[sock_fd(fd)]
4737

4838
def add_writer(self, fd, cb, *args):
4939
if __debug__:
5040
log.debug("add_writer%s", (fd, cb, args))
5141
if args:
5242
self.poller.register(fd, select.POLLOUT)
53-
self.objmap[fd] = (cb, args)
43+
self.objmap[sock_fd(fd)] = (cb, args)
5444
else:
5545
self.poller.register(fd, select.POLLOUT)
56-
self.objmap[fd] = cb
46+
self.objmap[sock_fd(fd)] = cb
5747

5848
def remove_writer(self, fd):
5949
if __debug__:
6050
log.debug("remove_writer(%s)", fd)
6151
try:
6252
self.poller.unregister(fd)
63-
if fd in self.objmap:
64-
del self.objmap[fd]
53+
self.objmap.pop(sock_fd(fd), None)
6554
except OSError as e:
6655
# StreamWriter.awrite() first tries to write to an fd,
6756
# and if that succeeds, yield IOWrite may never be called
@@ -80,7 +69,7 @@ def wait(self, delay):
8069
res = self.poller.poll(delay, 1)
8170
#log.debug("epoll result: %s", res)
8271
for fd, ev in res:
83-
cb = self.objmap[fd]
72+
cb = self.objmap[sock_fd(fd)]
8473
if __debug__:
8574
log.debug("Calling IO callback: %r", cb)
8675
if isinstance(cb, tuple):

0 commit comments

Comments
 (0)