xref: /aosp_15_r20/prebuilts/build-tools/common/py3-stdlib/asyncio/mixins.py (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Worker"""Event loop mixins."""
2*cda5da8dSAndroid Build Coastguard Worker
3*cda5da8dSAndroid Build Coastguard Workerimport threading
4*cda5da8dSAndroid Build Coastguard Workerfrom . import events
5*cda5da8dSAndroid Build Coastguard Worker
6*cda5da8dSAndroid Build Coastguard Worker_global_lock = threading.Lock()
7*cda5da8dSAndroid Build Coastguard Worker
8*cda5da8dSAndroid Build Coastguard Worker
9*cda5da8dSAndroid Build Coastguard Workerclass _LoopBoundMixin:
10*cda5da8dSAndroid Build Coastguard Worker    _loop = None
11*cda5da8dSAndroid Build Coastguard Worker
12*cda5da8dSAndroid Build Coastguard Worker    def _get_loop(self):
13*cda5da8dSAndroid Build Coastguard Worker        loop = events._get_running_loop()
14*cda5da8dSAndroid Build Coastguard Worker
15*cda5da8dSAndroid Build Coastguard Worker        if self._loop is None:
16*cda5da8dSAndroid Build Coastguard Worker            with _global_lock:
17*cda5da8dSAndroid Build Coastguard Worker                if self._loop is None:
18*cda5da8dSAndroid Build Coastguard Worker                    self._loop = loop
19*cda5da8dSAndroid Build Coastguard Worker        if loop is not self._loop:
20*cda5da8dSAndroid Build Coastguard Worker            raise RuntimeError(f'{self!r} is bound to a different event loop')
21*cda5da8dSAndroid Build Coastguard Worker        return loop
22