summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kvmd/aiotools.py21
-rw-r--r--kvmd/plugins/atx/gpio.py4
-rw-r--r--kvmd/plugins/msd/otg/__init__.py4
-rw-r--r--kvmd/plugins/msd/relay.py12
-rw-r--r--testenv/tests/test_aiotools.py22
5 files changed, 31 insertions, 32 deletions
diff --git a/kvmd/aiotools.py b/kvmd/aiotools.py
index 9f854489..f8965edd 100644
--- a/kvmd/aiotools.py
+++ b/kvmd/aiotools.py
@@ -32,7 +32,6 @@ import typing
from typing import List
from typing import Callable
from typing import Coroutine
-from typing import Generator
from typing import AsyncGenerator
from typing import Type
from typing import TypeVar
@@ -136,34 +135,34 @@ class AioExclusiveRegion:
def is_busy(self) -> bool:
return self.__busy
- def enter(self) -> None:
+ async def enter(self) -> None:
if not self.__busy:
self.__busy = True
return
raise self.__exc_type()
- def exit(self) -> None:
+ async def exit(self) -> None:
self.__busy = False
- @contextlib.contextmanager
- def exit_only_on_exception(self) -> Generator[None, None, None]:
- self.enter()
+ @contextlib.asynccontextmanager
+ async def exit_only_on_exception(self) -> AsyncGenerator[None, None]:
+ await self.enter()
try:
yield
except: # noqa: E722
- self.exit()
+ await self.exit()
raise
- def __enter__(self) -> None:
- self.enter()
+ async def __aenter__(self) -> None:
+ await self.enter()
- def __exit__(
+ async def __aexit__(
self,
_exc_type: Type[BaseException],
_exc: BaseException,
_tb: types.TracebackType,
) -> None:
- self.exit()
+ await self.exit()
# =====
diff --git a/kvmd/plugins/atx/gpio.py b/kvmd/plugins/atx/gpio.py
index cca58a18..51b063bc 100644
--- a/kvmd/plugins/atx/gpio.py
+++ b/kvmd/plugins/atx/gpio.py
@@ -162,7 +162,7 @@ class Plugin(BaseAtx): # pylint: disable=too-many-instance-attributes
@aiotools.atomic
async def __click(self, name: str, pin: int, delay: float) -> None:
- with self.__region.exit_only_on_exception():
+ async with self.__region.exit_only_on_exception():
await self.__inner_click(name, pin, delay)
@aiotools.tasked
@@ -176,5 +176,5 @@ class Plugin(BaseAtx): # pylint: disable=too-many-instance-attributes
gpio.write(pin, False)
await asyncio.sleep(1)
finally:
- self.__region.exit()
+ await self.__region.exit()
get_logger(0).info("Clicked ATX button %r", name)
diff --git a/kvmd/plugins/msd/otg/__init__.py b/kvmd/plugins/msd/otg/__init__.py
index 24d666f9..ff5014cb 100644
--- a/kvmd/plugins/msd/otg/__init__.py
+++ b/kvmd/plugins/msd/otg/__init__.py
@@ -114,7 +114,7 @@ class _State:
@contextlib.asynccontextmanager
async def busy(self, check_online: bool=True) -> AsyncGenerator[None, None]:
- with self._region:
+ async with self._region:
async with self._lock:
await self.__notifier.notify()
if check_online:
@@ -304,7 +304,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
@contextlib.asynccontextmanager
async def write_image(self, name: str) -> AsyncGenerator[None, None]:
try:
- with self.__state._region: # pylint: disable=protected-access
+ async with self.__state._region: # pylint: disable=protected-access
try:
async with self.__state._lock: # pylint: disable=protected-access
await self.__state_notifier.notify()
diff --git a/kvmd/plugins/msd/relay.py b/kvmd/plugins/msd/relay.py
index 81456efa..71a76e9c 100644
--- a/kvmd/plugins/msd/relay.py
+++ b/kvmd/plugins/msd/relay.py
@@ -234,7 +234,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
@aiotools.atomic
async def reset(self) -> None:
- with self.__region.exit_only_on_exception():
+ async with self.__region.exit_only_on_exception():
await self.__inner_reset()
@aiotools.tasked
@@ -254,7 +254,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
try:
gpio.write(self.__reset_pin, False)
finally:
- self.__region.exit()
+ await self.__region.exit()
await self.__state_queue.put(await self.get_state())
@aiotools.atomic
@@ -277,7 +277,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
async with self.__working():
notify = False
try:
- with self.__region:
+ async with self.__region:
if self.__connected:
raise MsdConnectedError()
notify = True
@@ -294,7 +294,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
async with self.__working():
notify = False
try:
- with self.__region:
+ async with self.__region:
if not self.__connected:
raise MsdDisconnectedError()
notify = True
@@ -315,7 +315,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
@contextlib.asynccontextmanager
async def write_image(self, name: str) -> AsyncGenerator[None, None]:
async with self.__working():
- self.__region.enter()
+ await self.__region.enter()
try:
assert self.__device_info
if self.__connected:
@@ -333,7 +333,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
await self.__close_device_file()
await self.__load_device_info()
finally:
- self.__region.exit()
+ await self.__region.exit()
await self.__state_queue.put(await self.get_state())
async def write_image_chunk(self, chunk: bytes) -> int:
diff --git a/testenv/tests/test_aiotools.py b/testenv/tests/test_aiotools.py
index 9d1c87c7..ea635e68 100644
--- a/testenv/tests/test_aiotools.py
+++ b/testenv/tests/test_aiotools.py
@@ -39,14 +39,14 @@ async def test_ok__region__access_one() -> None:
async def func() -> None:
assert not region.is_busy()
- with region:
+ async with region:
assert region.is_busy()
assert not region.is_busy()
await func()
assert not region.is_busy()
- region.exit()
+ await region.exit()
assert not region.is_busy()
@@ -56,16 +56,16 @@ async def test_fail__region__access_one() -> None:
async def func() -> None:
assert not region.is_busy()
- with region:
+ async with region:
assert region.is_busy()
- region.enter()
+ await region.enter()
assert not region.is_busy()
with pytest.raises(RegionIsBusyError):
await func()
assert not region.is_busy()
- region.exit()
+ await region.exit()
assert not region.is_busy()
@@ -75,21 +75,21 @@ async def test_ok__region__access_two() -> None:
region = AioExclusiveRegion(RegionIsBusyError)
async def func1() -> None:
- with region:
+ async with region:
await asyncio.sleep(1)
print("done func1()")
async def func2() -> None:
await asyncio.sleep(2)
print("waiking up func2()")
- with region:
+ async with region:
await asyncio.sleep(1)
print("done func2()")
await asyncio.gather(func1(), func2())
assert not region.is_busy()
- region.exit()
+ await region.exit()
assert not region.is_busy()
@@ -98,13 +98,13 @@ async def test_fail__region__access_two() -> None:
region = AioExclusiveRegion(RegionIsBusyError)
async def func1() -> None:
- with region:
+ async with region:
await asyncio.sleep(2)
print("done func1()")
async def func2() -> None:
await asyncio.sleep(1)
- with region:
+ async with region:
await asyncio.sleep(1)
print("done func2()")
@@ -113,5 +113,5 @@ async def test_fail__region__access_two() -> None:
assert type(results[1]) == RegionIsBusyError # pylint: disable=unidiomatic-typecheck
assert not region.is_busy()
- region.exit()
+ await region.exit()
assert not region.is_busy()