summaryrefslogtreecommitdiff
path: root/kvmd/aiotools.py
diff options
context:
space:
mode:
authorDevaev Maxim <[email protected]>2019-06-05 06:30:21 +0300
committerDevaev Maxim <[email protected]>2019-06-05 06:30:21 +0300
commit8aa333ba895e7b498e867f7b430335852a4a9f84 (patch)
treef7726c35505d5054115cf01192250c3198f3243e /kvmd/aiotools.py
parent234aa8bda4978a9d0bed70237e7548ea5a051422 (diff)
better atomic ops
Diffstat (limited to 'kvmd/aiotools.py')
-rw-r--r--kvmd/aiotools.py48
1 files changed, 48 insertions, 0 deletions
diff --git a/kvmd/aiotools.py b/kvmd/aiotools.py
new file mode 100644
index 00000000..d0c12537
--- /dev/null
+++ b/kvmd/aiotools.py
@@ -0,0 +1,48 @@
+# ========================================================================== #
+# #
+# 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 asyncio
+import functools
+
+import typing
+
+from typing import Callable
+from typing import TypeVar
+from typing import Any
+
+
+# =====
+_AtomicF = TypeVar("_AtomicF", bound=Callable[..., Any])
+
+
+def atomic(method: _AtomicF) -> _AtomicF:
+ @functools.wraps(method)
+ async def wrapper(*args: object, **kwargs: object) -> Any:
+ return (await asyncio.shield(method(*args, **kwargs)))
+ return typing.cast(_AtomicF, wrapper)
+
+
+def task(method: Callable[..., Any]) -> Callable[..., asyncio.Task]:
+ @functools.wraps(method)
+ async def wrapper(*args: object, **kwargs: object) -> asyncio.Task:
+ return asyncio.create_task(method(*args, **kwargs))
+ return typing.cast(Callable[..., asyncio.Task], wrapper)