blob: 650df05ccc93ea652d22637b740b56d8a4bb60a3 [file] [log] [blame]
Yurii Karabas0ec34ca2020-11-24 20:08:54 +02001"""Event loop mixins."""
2
3import threading
4from . import events
5
6_global_lock = threading.Lock()
7
Yurii Karabasb9127dd2020-11-25 13:50:44 +02008# Used as a sentinel for loop parameter
9_marker = object()
Yurii Karabas0ec34ca2020-11-24 20:08:54 +020010
Yurii Karabasb9127dd2020-11-25 13:50:44 +020011
12class _LoopBoundMixin:
Yurii Karabas0ec34ca2020-11-24 20:08:54 +020013 _loop = None
14
Yurii Karabasb9127dd2020-11-25 13:50:44 +020015 def __init__(self, *, loop=_marker):
16 if loop is not _marker:
17 raise TypeError(
18 f'As of 3.10, the *loop* parameter was removed from '
19 f'{type(self).__name__}() since it is no longer necessary'
20 )
21
Yurii Karabas0ec34ca2020-11-24 20:08:54 +020022 def _get_loop(self):
23 loop = events._get_running_loop()
24
25 if self._loop is None:
26 with _global_lock:
27 if self._loop is None:
28 self._loop = loop
29 if loop is not self._loop:
Yurii Karabasb9127dd2020-11-25 13:50:44 +020030 raise RuntimeError(f'{self!r} is bound to a different event loop')
Yurii Karabas0ec34ca2020-11-24 20:08:54 +020031 return loop