summaryrefslogtreecommitdiffstatshomepage
path: root/extmod/uasyncio/event.py
diff options
context:
space:
mode:
Diffstat (limited to 'extmod/uasyncio/event.py')
-rw-r--r--extmod/uasyncio/event.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/extmod/uasyncio/event.py b/extmod/uasyncio/event.py
new file mode 100644
index 0000000000..31cb00e055
--- /dev/null
+++ b/extmod/uasyncio/event.py
@@ -0,0 +1,31 @@
+# MicroPython uasyncio module
+# MIT license; Copyright (c) 2019-2020 Damien P. George
+
+from . import core
+
+# Event class for primitive events that can be waited on, set, and cleared
+class Event:
+ def __init__(self):
+ self.state = False # False=unset; True=set
+ self.waiting = core.TaskQueue() # Queue of Tasks waiting on completion of this event
+
+ def is_set(self):
+ return self.state
+
+ def set(self):
+ # Event becomes set, schedule any tasks waiting on it
+ while self.waiting.peek():
+ core._task_queue.push_head(self.waiting.pop_head())
+ self.state = True
+
+ def clear(self):
+ self.state = False
+
+ async def wait(self):
+ if not self.state:
+ # Event not set, put the calling task on the event's waiting queue
+ self.waiting.push_head(core.cur_task)
+ # Set calling task's data to the event's queue so it can be removed if needed
+ core.cur_task.data = self.waiting
+ yield
+ return True