| 
									
										
										
										
											2020-11-24 20:08:54 +02:00
										 |  |  | """Event loop mixins.""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import threading | 
					
						
							|  |  |  | from . import events | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _global_lock = threading.Lock() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-25 13:50:44 +02:00
										 |  |  | # Used as a sentinel for loop parameter | 
					
						
							|  |  |  | _marker = object() | 
					
						
							| 
									
										
										
										
											2020-11-24 20:08:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-25 13:50:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | class _LoopBoundMixin: | 
					
						
							| 
									
										
										
										
											2020-11-24 20:08:54 +02:00
										 |  |  |     _loop = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-25 13:50:44 +02:00
										 |  |  |     def __init__(self, *, loop=_marker): | 
					
						
							|  |  |  |         if loop is not _marker: | 
					
						
							|  |  |  |             raise TypeError( | 
					
						
							|  |  |  |                 f'As of 3.10, the *loop* parameter was removed from ' | 
					
						
							|  |  |  |                 f'{type(self).__name__}() since it is no longer necessary' | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-24 20:08:54 +02:00
										 |  |  |     def _get_loop(self): | 
					
						
							|  |  |  |         loop = events._get_running_loop() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if self._loop is None: | 
					
						
							|  |  |  |             with _global_lock: | 
					
						
							|  |  |  |                 if self._loop is None: | 
					
						
							|  |  |  |                     self._loop = loop | 
					
						
							|  |  |  |         if loop is not self._loop: | 
					
						
							| 
									
										
										
										
											2020-11-25 13:50:44 +02:00
										 |  |  |             raise RuntimeError(f'{self!r} is bound to a different event loop') | 
					
						
							| 
									
										
										
										
											2020-11-24 20:08:54 +02:00
										 |  |  |         return loop |