summaryrefslogtreecommitdiffstatshomepage
path: root/extmod/uasyncio/lock.py
diff options
context:
space:
mode:
Diffstat (limited to 'extmod/uasyncio/lock.py')
-rw-r--r--extmod/uasyncio/lock.py55
1 files changed, 0 insertions, 55 deletions
diff --git a/extmod/uasyncio/lock.py b/extmod/uasyncio/lock.py
deleted file mode 100644
index 85a9437b4f..0000000000
--- a/extmod/uasyncio/lock.py
+++ /dev/null
@@ -1,55 +0,0 @@
-# MicroPython uasyncio module
-# MIT license; Copyright (c) 2019-2020 Damien P. George
-
-from . import core
-
-
-# Lock class for primitive mutex capability
-class Lock:
- def __init__(self):
- # The state can take the following values:
- # - 0: unlocked
- # - 1: locked
- # - <Task>: unlocked but this task has been scheduled to acquire the lock next
- self.state = 0
- # Queue of Tasks waiting to acquire this Lock
- self.waiting = core.TaskQueue()
-
- def locked(self):
- return self.state == 1
-
- def release(self):
- if self.state != 1:
- raise RuntimeError("Lock not acquired")
- if self.waiting.peek():
- # Task(s) waiting on lock, schedule next Task
- self.state = self.waiting.pop()
- core._task_queue.push(self.state)
- else:
- # No Task waiting so unlock
- self.state = 0
-
- # async
- def acquire(self):
- if self.state != 0:
- # Lock unavailable, put the calling Task on the waiting queue
- self.waiting.push(core.cur_task)
- # Set calling task's data to the lock's queue so it can be removed if needed
- core.cur_task.data = self.waiting
- try:
- yield
- except core.CancelledError as er:
- if self.state == core.cur_task:
- # Cancelled while pending on resume, schedule next waiting Task
- self.state = 1
- self.release()
- raise er
- # Lock available, set it as locked
- self.state = 1
- return True
-
- async def __aenter__(self):
- return await self.acquire()
-
- async def __aexit__(self, exc_type, exc, tb):
- return self.release()