Skip to content

Commit d9e72f1

Browse files
committed
uasyncio.core: Switch to ticks_ms() as timing source.
This makes uasyncio.core compatible with baremetal/embedded ports. Includes switching to "uheapq timeq" for task queue.
1 parent f81e979 commit d9e72f1

File tree

1 file changed

+17
-8
lines changed

1 file changed

+17
-8
lines changed

uasyncio.core/uasyncio/core.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def __init__(self):
1717
self.cnt = 0
1818

1919
def time(self):
20-
return time.time()
20+
return time.ticks_ms()
2121

2222
def create_task(self, coro):
2323
# CPython 3.4.2
@@ -28,13 +28,16 @@ def call_soon(self, callback, *args):
2828
self.call_at(self.time(), callback, *args)
2929

3030
def call_later(self, delay, callback, *args):
31-
self.call_at(self.time() + delay, callback, *args)
31+
self.call_at(time.ticks_add(self.time(), int(delay * 1000)), callback, *args)
32+
33+
def call_later_ms(self, delay, callback, *args):
34+
self.call_at(time.ticks_add(self.time(), delay), callback, *args)
3235

3336
def call_at(self, time, callback, *args):
3437
# Including self.cnt is a workaround per heapq docs
3538
if __debug__:
3639
log.debug("Scheduling %s", (time, self.cnt, callback, args))
37-
heapq.heappush(self.q, (time, self.cnt, callback, args))
40+
heapq.heappush(self.q, (time, self.cnt, callback, args), True)
3841
# print(self.q)
3942
self.cnt += 1
4043

@@ -43,17 +46,17 @@ def wait(self, delay):
4346
# with IO scheduling
4447
if __debug__:
4548
log.debug("Sleeping for: %s", delay)
46-
time.sleep(delay)
49+
time.sleep_ms(delay)
4750

4851
def run_forever(self):
4952
while True:
5053
if self.q:
51-
t, cnt, cb, args = heapq.heappop(self.q)
54+
t, cnt, cb, args = heapq.heappop(self.q, True)
5255
if __debug__:
5356
log.debug("Next coroutine to run: %s", (t, cnt, cb, args))
5457
# __main__.mem_info()
5558
tnow = self.time()
56-
delay = t - tnow
59+
delay = time.ticks_diff(t, tnow)
5760
if delay > 0:
5861
self.wait(delay)
5962
else:
@@ -95,6 +98,9 @@ def run_forever(self):
9598
return arg
9699
elif isinstance(ret, type_gen):
97100
self.call_soon(ret)
101+
elif isinstance(ret, int):
102+
# Delay
103+
delay = ret
98104
elif ret is None:
99105
# Just reschedule
100106
pass
@@ -104,7 +110,7 @@ def run_forever(self):
104110
if __debug__:
105111
log.debug("Coroutine finished: %s", cb)
106112
continue
107-
self.call_later(delay, cb, *args)
113+
self.call_later_ms(delay, cb, *args)
108114

109115
def run_until_complete(self, coro):
110116
def _run_and_stop():
@@ -159,7 +165,10 @@ def get_event_loop():
159165
return _event_loop
160166

161167
def sleep(secs):
162-
yield Sleep(secs)
168+
yield int(secs * 1000)
169+
170+
def sleep_ms(ms):
171+
yield ms
163172

164173
def coroutine(f):
165174
return f

0 commit comments

Comments
 (0)