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