kopia lustrzana https://github.com/micropython/micropython-lib
asyncio_micro: Optimize size of SysCall objects.
We have to have type header for any object, so use type to "store" information about syscall type (my initial idea was to have single syscall class and dispatch on its attribute, that would save memory on having bunch of classes, but would increase size of each syscall object).pull/11/head
rodzic
06c8c6ce8f
commit
eff1250e3b
|
@ -7,9 +7,6 @@ import logging
|
||||||
|
|
||||||
log = logging.getLogger("asyncio")
|
log = logging.getLogger("asyncio")
|
||||||
|
|
||||||
IO_READ = 1
|
|
||||||
IO_WRITE = 2
|
|
||||||
|
|
||||||
type_gen = type((lambda: (yield))())
|
type_gen = type((lambda: (yield))())
|
||||||
|
|
||||||
class EventLoop:
|
class EventLoop:
|
||||||
|
@ -65,21 +62,21 @@ class EventLoop:
|
||||||
ret = cb.send(*args)
|
ret = cb.send(*args)
|
||||||
log.debug("Coroutine %s yield result: %s", cb, ret)
|
log.debug("Coroutine %s yield result: %s", cb, ret)
|
||||||
if isinstance(ret, SysCall):
|
if isinstance(ret, SysCall):
|
||||||
|
arg = ret.args[0]
|
||||||
if isinstance(ret, Sleep):
|
if isinstance(ret, Sleep):
|
||||||
delay = ret.args[0]
|
delay = arg
|
||||||
elif isinstance(ret, IORead):
|
elif isinstance(ret, IORead):
|
||||||
# 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 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(ret.obj.fileno(), lambda c, f: self.call_soon(c, f), cb, ret.obj)
|
||||||
self.add_reader(ret.obj.fileno(), lambda cb, f: self.call_soon(cb, f), cb, ret.obj)
|
self.add_reader(arg.fileno(), lambda cb, f: self.call_soon(cb, f), cb, arg)
|
||||||
continue
|
continue
|
||||||
elif isinstance(ret, IOWrite):
|
elif isinstance(ret, IOWrite):
|
||||||
self.add_writer(ret.obj.fileno(), lambda cb, f: self.call_soon(cb, f), cb, ret.obj)
|
self.add_writer(arg.fileno(), lambda cb, f: self.call_soon(cb, f), cb, arg)
|
||||||
continue
|
continue
|
||||||
elif isinstance(ret, IODone):
|
elif isinstance(ret, IOReadDone):
|
||||||
if ret.op == IO_READ:
|
self.remove_reader(arg.fileno())
|
||||||
self.remove_reader(ret.obj.fileno())
|
elif isinstance(ret, IOWriteDone):
|
||||||
elif ret.op == IO_WRITE:
|
self.remove_writer(arg.fileno())
|
||||||
self.remove_writer(ret.obj.fileno())
|
|
||||||
elif isinstance(ret, type_gen):
|
elif isinstance(ret, type_gen):
|
||||||
self.call_soon(ret)
|
self.call_soon(ret)
|
||||||
elif ret is None:
|
elif ret is None:
|
||||||
|
@ -146,8 +143,7 @@ class EpollEventLoop(EventLoop):
|
||||||
|
|
||||||
class SysCall:
|
class SysCall:
|
||||||
|
|
||||||
def __init__(self, call, *args):
|
def __init__(self, *args):
|
||||||
self.call = call
|
|
||||||
self.args = args
|
self.args = args
|
||||||
|
|
||||||
def handle(self):
|
def handle(self):
|
||||||
|
@ -157,20 +153,16 @@ class Sleep(SysCall):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class IORead(SysCall):
|
class IORead(SysCall):
|
||||||
|
pass
|
||||||
def __init__(self, obj):
|
|
||||||
self.obj = obj
|
|
||||||
|
|
||||||
class IOWrite(SysCall):
|
class IOWrite(SysCall):
|
||||||
|
pass
|
||||||
|
|
||||||
def __init__(self, obj):
|
class IOReadDone(SysCall):
|
||||||
self.obj = obj
|
pass
|
||||||
|
|
||||||
class IODone(SysCall):
|
class IOWriteDone(SysCall):
|
||||||
|
pass
|
||||||
def __init__(self, op, obj):
|
|
||||||
self.op = op
|
|
||||||
self.obj = obj
|
|
||||||
|
|
||||||
|
|
||||||
def get_event_loop():
|
def get_event_loop():
|
||||||
|
@ -184,7 +176,7 @@ def async(coro):
|
||||||
return coro
|
return coro
|
||||||
|
|
||||||
def sleep(secs):
|
def sleep(secs):
|
||||||
yield Sleep("sleep", secs)
|
yield Sleep(secs)
|
||||||
|
|
||||||
|
|
||||||
import microsocket as _socket
|
import microsocket as _socket
|
||||||
|
@ -202,7 +194,7 @@ class StreamReader:
|
||||||
break
|
break
|
||||||
log.warn("Empty read")
|
log.warn("Empty read")
|
||||||
if not res:
|
if not res:
|
||||||
yield IODone(IO_READ, self.s)
|
yield IOReadDone(self.s)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def readline(self):
|
def readline(self):
|
||||||
|
@ -215,7 +207,7 @@ class StreamReader:
|
||||||
break
|
break
|
||||||
log.warn("Empty read")
|
log.warn("Empty read")
|
||||||
if not res:
|
if not res:
|
||||||
yield IODone(IO_READ, self.s)
|
yield IOReadDone(self.s)
|
||||||
log.debug("StreamReader.readline(): res: %s", res)
|
log.debug("StreamReader.readline(): res: %s", res)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
@ -247,7 +239,7 @@ class StreamWriter:
|
||||||
log.debug("StreamWriter.awrite(): can write more")
|
log.debug("StreamWriter.awrite(): can write more")
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
yield IODone(IO_WRITE, self.s)
|
yield IOWriteDone(self.s)
|
||||||
self.s.close()
|
self.s.close()
|
||||||
|
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue