diff options
author | Devaev Maxim <[email protected]> | 2020-02-29 17:23:57 +0300 |
---|---|---|
committer | Devaev Maxim <[email protected]> | 2020-02-29 17:23:57 +0300 |
commit | 75d9b858d73bf3ed31597e554b27520e3e31f72e (patch) | |
tree | f52e60f468d7ad99d8e9abf2df590026a4502862 /kvmd | |
parent | 5ef5e00da9e5d15270cdc253eb67bef72174b78f (diff) |
moved AioExclusiveRegion to aiotools
Diffstat (limited to 'kvmd')
-rw-r--r-- | kvmd/aioregion.py | 55 | ||||
-rw-r--r-- | kvmd/aiotools.py | 53 | ||||
-rw-r--r-- | kvmd/plugins/atx/gpio.py | 5 | ||||
-rw-r--r-- | kvmd/plugins/msd/otg/__init__.py | 3 | ||||
-rw-r--r-- | kvmd/plugins/msd/relay.py | 5 |
5 files changed, 46 insertions, 75 deletions
diff --git a/kvmd/aioregion.py b/kvmd/aioregion.py deleted file mode 100644 index 4d5e16bc..00000000 --- a/kvmd/aioregion.py +++ /dev/null @@ -1,55 +0,0 @@ -# ========================================================================== # -# # -# KVMD - The main Pi-KVM daemon. # -# # -# Copyright (C) 2018 Maxim Devaev <[email protected]> # -# # -# This program is free software: you can redistribute it and/or modify # -# it under the terms of the GNU General Public License as published by # -# the Free Software Foundation, either version 3 of the License, or # -# (at your option) any later version. # -# # -# This program is distributed in the hope that it will be useful, # -# but WITHOUT ANY WARRANTY; without even the implied warranty of # -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # -# GNU General Public License for more details. # -# # -# You should have received a copy of the GNU General Public License # -# along with this program. If not, see <https://www.gnu.org/licenses/>. # -# # -# ========================================================================== # - - -import types - -from typing import Type - - -# ===== -class AioExclusiveRegion: - def __init__(self, exc_type: Type[Exception]) -> None: - self.__exc_type = exc_type - self.__busy = False - - def is_busy(self) -> bool: - return self.__busy - - def enter(self) -> None: - if not self.__busy: - self.__busy = True - return - raise self.__exc_type() - - def exit(self) -> None: - self.__busy = False - - def __enter__(self) -> None: - self.enter() - - def __exit__( - self, - _exc_type: Type[BaseException], - _exc: BaseException, - _tb: types.TracebackType, - ) -> None: - self.exit() diff --git a/kvmd/aiotools.py b/kvmd/aiotools.py index 98a2a524..76798e5c 100644 --- a/kvmd/aiotools.py +++ b/kvmd/aiotools.py @@ -24,6 +24,7 @@ import os import asyncio import functools import contextlib +import types import typing @@ -32,14 +33,13 @@ from typing import Callable from typing import Coroutine from typing import Generator from typing import AsyncGenerator +from typing import Type from typing import TypeVar from typing import Any import aiofiles import aiofiles.base -from . import aioregion - from .logging import get_logger @@ -104,16 +104,6 @@ def run_sync(coro: Coroutine[Any, Any, _RetvalT]) -> _RetvalT: # ===== -def unregion_only_on_exception(region: aioregion.AioExclusiveRegion) -> Generator[None, None, None]: - region.enter() - try: - yield - except: # noqa: E722 - region.exit() - raise - - @contextlib.asynccontextmanager async def unlock_only_on_exception(lock: asyncio.Lock) -> AsyncGenerator[None, None]: await lock.acquire() @@ -129,3 +119,42 @@ async def afile_write_now(afile: aiofiles.base.AiofilesContextManager, data: byt await afile.write(data) await afile.flush() await run_async(os.fsync, afile.fileno()) + + +# ===== +class AioExclusiveRegion: + def __init__(self, exc_type: Type[Exception]) -> None: + self.__exc_type = exc_type + self.__busy = False + + def is_busy(self) -> bool: + return self.__busy + + def enter(self) -> None: + if not self.__busy: + self.__busy = True + return + raise self.__exc_type() + + def exit(self) -> None: + self.__busy = False + + @contextlib.contextmanager + def exit_only_on_exception(self) -> Generator[None, None, None]: + self.enter() + try: + yield + except: # noqa: E722 + self.exit() + raise + + def __enter__(self) -> None: + self.enter() + + def __exit__( + self, + _exc_type: Type[BaseException], + _exc: BaseException, + _tb: types.TracebackType, + ) -> None: + self.exit() diff --git a/kvmd/plugins/atx/gpio.py b/kvmd/plugins/atx/gpio.py index c657a7f3..cca58a18 100644 --- a/kvmd/plugins/atx/gpio.py +++ b/kvmd/plugins/atx/gpio.py @@ -29,7 +29,6 @@ from typing import AsyncGenerator from ...logging import get_logger from ... import aiotools -from ... import aioregion from ... import gpio from ...yamlconf import Option @@ -75,7 +74,7 @@ class Plugin(BaseAtx): # pylint: disable=too-many-instance-attributes self.__state_poll = state_poll - self.__region = aioregion.AioExclusiveRegion(AtxIsBusyError) + self.__region = aiotools.AioExclusiveRegion(AtxIsBusyError) @classmethod def get_plugin_options(cls) -> Dict: @@ -163,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 aiotools.unregion_only_on_exception(self.__region): + with self.__region.exit_only_on_exception(): await self.__inner_click(name, pin, delay) @aiotools.tasked diff --git a/kvmd/plugins/msd/otg/__init__.py b/kvmd/plugins/msd/otg/__init__.py index 41e1653f..f3695530 100644 --- a/kvmd/plugins/msd/otg/__init__.py +++ b/kvmd/plugins/msd/otg/__init__.py @@ -45,7 +45,6 @@ from ....validators.os import valid_abs_dir from ....validators.os import valid_command from .... import aiotools -from .... import aioregion from .. import MsdError from .. import MsdIsBusyError @@ -111,7 +110,7 @@ class _State: self.vd: Optional[_VirtualDriveState] = None self._lock = asyncio.Lock() - self._region = aioregion.AioExclusiveRegion(MsdIsBusyError) + self._region = aiotools.AioExclusiveRegion(MsdIsBusyError) @contextlib.asynccontextmanager async def busy(self, check_online: bool=True) -> AsyncGenerator[None, None]: diff --git a/kvmd/plugins/msd/relay.py b/kvmd/plugins/msd/relay.py index 4e621cc2..81456efa 100644 --- a/kvmd/plugins/msd/relay.py +++ b/kvmd/plugins/msd/relay.py @@ -40,7 +40,6 @@ import aiofiles.base from ...logging import get_logger from ... import aiotools -from ... import aioregion from ... import gpio from ...yamlconf import Option @@ -174,7 +173,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes self.__init_retries = init_retries self.__reset_delay = reset_delay - self.__region = aioregion.AioExclusiveRegion(MsdIsBusyError) + self.__region = aiotools.AioExclusiveRegion(MsdIsBusyError) self.__device_info: Optional[_DeviceInfo] = None self.__connected = False @@ -235,7 +234,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes @aiotools.atomic async def reset(self) -> None: - with aiotools.unregion_only_on_exception(self.__region): + with self.__region.exit_only_on_exception(): await self.__inner_reset() @aiotools.tasked |