1*cda5da8dSAndroid Build Coastguard Worker"""Thread module emulating a subset of Java's threading model.""" 2*cda5da8dSAndroid Build Coastguard Worker 3*cda5da8dSAndroid Build Coastguard Workerimport os as _os 4*cda5da8dSAndroid Build Coastguard Workerimport sys as _sys 5*cda5da8dSAndroid Build Coastguard Workerimport _thread 6*cda5da8dSAndroid Build Coastguard Workerimport functools 7*cda5da8dSAndroid Build Coastguard Worker 8*cda5da8dSAndroid Build Coastguard Workerfrom time import monotonic as _time 9*cda5da8dSAndroid Build Coastguard Workerfrom _weakrefset import WeakSet 10*cda5da8dSAndroid Build Coastguard Workerfrom itertools import islice as _islice, count as _count 11*cda5da8dSAndroid Build Coastguard Workertry: 12*cda5da8dSAndroid Build Coastguard Worker from _collections import deque as _deque 13*cda5da8dSAndroid Build Coastguard Workerexcept ImportError: 14*cda5da8dSAndroid Build Coastguard Worker from collections import deque as _deque 15*cda5da8dSAndroid Build Coastguard Worker 16*cda5da8dSAndroid Build Coastguard Worker# Note regarding PEP 8 compliant names 17*cda5da8dSAndroid Build Coastguard Worker# This threading model was originally inspired by Java, and inherited 18*cda5da8dSAndroid Build Coastguard Worker# the convention of camelCase function and method names from that 19*cda5da8dSAndroid Build Coastguard Worker# language. Those original names are not in any imminent danger of 20*cda5da8dSAndroid Build Coastguard Worker# being deprecated (even for Py3k),so this module provides them as an 21*cda5da8dSAndroid Build Coastguard Worker# alias for the PEP 8 compliant names 22*cda5da8dSAndroid Build Coastguard Worker# Note that using the new PEP 8 compliant names facilitates substitution 23*cda5da8dSAndroid Build Coastguard Worker# with the multiprocessing module, which doesn't provide the old 24*cda5da8dSAndroid Build Coastguard Worker# Java inspired names. 25*cda5da8dSAndroid Build Coastguard Worker 26*cda5da8dSAndroid Build Coastguard Worker__all__ = ['get_ident', 'active_count', 'Condition', 'current_thread', 27*cda5da8dSAndroid Build Coastguard Worker 'enumerate', 'main_thread', 'TIMEOUT_MAX', 28*cda5da8dSAndroid Build Coastguard Worker 'Event', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread', 29*cda5da8dSAndroid Build Coastguard Worker 'Barrier', 'BrokenBarrierError', 'Timer', 'ThreadError', 30*cda5da8dSAndroid Build Coastguard Worker 'setprofile', 'settrace', 'local', 'stack_size', 31*cda5da8dSAndroid Build Coastguard Worker 'excepthook', 'ExceptHookArgs', 'gettrace', 'getprofile'] 32*cda5da8dSAndroid Build Coastguard Worker 33*cda5da8dSAndroid Build Coastguard Worker# Rename some stuff so "from threading import *" is safe 34*cda5da8dSAndroid Build Coastguard Worker_start_new_thread = _thread.start_new_thread 35*cda5da8dSAndroid Build Coastguard Worker_allocate_lock = _thread.allocate_lock 36*cda5da8dSAndroid Build Coastguard Worker_set_sentinel = _thread._set_sentinel 37*cda5da8dSAndroid Build Coastguard Workerget_ident = _thread.get_ident 38*cda5da8dSAndroid Build Coastguard Workertry: 39*cda5da8dSAndroid Build Coastguard Worker get_native_id = _thread.get_native_id 40*cda5da8dSAndroid Build Coastguard Worker _HAVE_THREAD_NATIVE_ID = True 41*cda5da8dSAndroid Build Coastguard Worker __all__.append('get_native_id') 42*cda5da8dSAndroid Build Coastguard Workerexcept AttributeError: 43*cda5da8dSAndroid Build Coastguard Worker _HAVE_THREAD_NATIVE_ID = False 44*cda5da8dSAndroid Build Coastguard WorkerThreadError = _thread.error 45*cda5da8dSAndroid Build Coastguard Workertry: 46*cda5da8dSAndroid Build Coastguard Worker _CRLock = _thread.RLock 47*cda5da8dSAndroid Build Coastguard Workerexcept AttributeError: 48*cda5da8dSAndroid Build Coastguard Worker _CRLock = None 49*cda5da8dSAndroid Build Coastguard WorkerTIMEOUT_MAX = _thread.TIMEOUT_MAX 50*cda5da8dSAndroid Build Coastguard Workerdel _thread 51*cda5da8dSAndroid Build Coastguard Worker 52*cda5da8dSAndroid Build Coastguard Worker 53*cda5da8dSAndroid Build Coastguard Worker# Support for profile and trace hooks 54*cda5da8dSAndroid Build Coastguard Worker 55*cda5da8dSAndroid Build Coastguard Worker_profile_hook = None 56*cda5da8dSAndroid Build Coastguard Worker_trace_hook = None 57*cda5da8dSAndroid Build Coastguard Worker 58*cda5da8dSAndroid Build Coastguard Workerdef setprofile(func): 59*cda5da8dSAndroid Build Coastguard Worker """Set a profile function for all threads started from the threading module. 60*cda5da8dSAndroid Build Coastguard Worker 61*cda5da8dSAndroid Build Coastguard Worker The func will be passed to sys.setprofile() for each thread, before its 62*cda5da8dSAndroid Build Coastguard Worker run() method is called. 63*cda5da8dSAndroid Build Coastguard Worker 64*cda5da8dSAndroid Build Coastguard Worker """ 65*cda5da8dSAndroid Build Coastguard Worker global _profile_hook 66*cda5da8dSAndroid Build Coastguard Worker _profile_hook = func 67*cda5da8dSAndroid Build Coastguard Worker 68*cda5da8dSAndroid Build Coastguard Workerdef getprofile(): 69*cda5da8dSAndroid Build Coastguard Worker """Get the profiler function as set by threading.setprofile().""" 70*cda5da8dSAndroid Build Coastguard Worker return _profile_hook 71*cda5da8dSAndroid Build Coastguard Worker 72*cda5da8dSAndroid Build Coastguard Workerdef settrace(func): 73*cda5da8dSAndroid Build Coastguard Worker """Set a trace function for all threads started from the threading module. 74*cda5da8dSAndroid Build Coastguard Worker 75*cda5da8dSAndroid Build Coastguard Worker The func will be passed to sys.settrace() for each thread, before its run() 76*cda5da8dSAndroid Build Coastguard Worker method is called. 77*cda5da8dSAndroid Build Coastguard Worker 78*cda5da8dSAndroid Build Coastguard Worker """ 79*cda5da8dSAndroid Build Coastguard Worker global _trace_hook 80*cda5da8dSAndroid Build Coastguard Worker _trace_hook = func 81*cda5da8dSAndroid Build Coastguard Worker 82*cda5da8dSAndroid Build Coastguard Workerdef gettrace(): 83*cda5da8dSAndroid Build Coastguard Worker """Get the trace function as set by threading.settrace().""" 84*cda5da8dSAndroid Build Coastguard Worker return _trace_hook 85*cda5da8dSAndroid Build Coastguard Worker 86*cda5da8dSAndroid Build Coastguard Worker# Synchronization classes 87*cda5da8dSAndroid Build Coastguard Worker 88*cda5da8dSAndroid Build Coastguard WorkerLock = _allocate_lock 89*cda5da8dSAndroid Build Coastguard Worker 90*cda5da8dSAndroid Build Coastguard Workerdef RLock(*args, **kwargs): 91*cda5da8dSAndroid Build Coastguard Worker """Factory function that returns a new reentrant lock. 92*cda5da8dSAndroid Build Coastguard Worker 93*cda5da8dSAndroid Build Coastguard Worker A reentrant lock must be released by the thread that acquired it. Once a 94*cda5da8dSAndroid Build Coastguard Worker thread has acquired a reentrant lock, the same thread may acquire it again 95*cda5da8dSAndroid Build Coastguard Worker without blocking; the thread must release it once for each time it has 96*cda5da8dSAndroid Build Coastguard Worker acquired it. 97*cda5da8dSAndroid Build Coastguard Worker 98*cda5da8dSAndroid Build Coastguard Worker """ 99*cda5da8dSAndroid Build Coastguard Worker if _CRLock is None: 100*cda5da8dSAndroid Build Coastguard Worker return _PyRLock(*args, **kwargs) 101*cda5da8dSAndroid Build Coastguard Worker return _CRLock(*args, **kwargs) 102*cda5da8dSAndroid Build Coastguard Worker 103*cda5da8dSAndroid Build Coastguard Workerclass _RLock: 104*cda5da8dSAndroid Build Coastguard Worker """This class implements reentrant lock objects. 105*cda5da8dSAndroid Build Coastguard Worker 106*cda5da8dSAndroid Build Coastguard Worker A reentrant lock must be released by the thread that acquired it. Once a 107*cda5da8dSAndroid Build Coastguard Worker thread has acquired a reentrant lock, the same thread may acquire it 108*cda5da8dSAndroid Build Coastguard Worker again without blocking; the thread must release it once for each time it 109*cda5da8dSAndroid Build Coastguard Worker has acquired it. 110*cda5da8dSAndroid Build Coastguard Worker 111*cda5da8dSAndroid Build Coastguard Worker """ 112*cda5da8dSAndroid Build Coastguard Worker 113*cda5da8dSAndroid Build Coastguard Worker def __init__(self): 114*cda5da8dSAndroid Build Coastguard Worker self._block = _allocate_lock() 115*cda5da8dSAndroid Build Coastguard Worker self._owner = None 116*cda5da8dSAndroid Build Coastguard Worker self._count = 0 117*cda5da8dSAndroid Build Coastguard Worker 118*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 119*cda5da8dSAndroid Build Coastguard Worker owner = self._owner 120*cda5da8dSAndroid Build Coastguard Worker try: 121*cda5da8dSAndroid Build Coastguard Worker owner = _active[owner].name 122*cda5da8dSAndroid Build Coastguard Worker except KeyError: 123*cda5da8dSAndroid Build Coastguard Worker pass 124*cda5da8dSAndroid Build Coastguard Worker return "<%s %s.%s object owner=%r count=%d at %s>" % ( 125*cda5da8dSAndroid Build Coastguard Worker "locked" if self._block.locked() else "unlocked", 126*cda5da8dSAndroid Build Coastguard Worker self.__class__.__module__, 127*cda5da8dSAndroid Build Coastguard Worker self.__class__.__qualname__, 128*cda5da8dSAndroid Build Coastguard Worker owner, 129*cda5da8dSAndroid Build Coastguard Worker self._count, 130*cda5da8dSAndroid Build Coastguard Worker hex(id(self)) 131*cda5da8dSAndroid Build Coastguard Worker ) 132*cda5da8dSAndroid Build Coastguard Worker 133*cda5da8dSAndroid Build Coastguard Worker def _at_fork_reinit(self): 134*cda5da8dSAndroid Build Coastguard Worker self._block._at_fork_reinit() 135*cda5da8dSAndroid Build Coastguard Worker self._owner = None 136*cda5da8dSAndroid Build Coastguard Worker self._count = 0 137*cda5da8dSAndroid Build Coastguard Worker 138*cda5da8dSAndroid Build Coastguard Worker def acquire(self, blocking=True, timeout=-1): 139*cda5da8dSAndroid Build Coastguard Worker """Acquire a lock, blocking or non-blocking. 140*cda5da8dSAndroid Build Coastguard Worker 141*cda5da8dSAndroid Build Coastguard Worker When invoked without arguments: if this thread already owns the lock, 142*cda5da8dSAndroid Build Coastguard Worker increment the recursion level by one, and return immediately. Otherwise, 143*cda5da8dSAndroid Build Coastguard Worker if another thread owns the lock, block until the lock is unlocked. Once 144*cda5da8dSAndroid Build Coastguard Worker the lock is unlocked (not owned by any thread), then grab ownership, set 145*cda5da8dSAndroid Build Coastguard Worker the recursion level to one, and return. If more than one thread is 146*cda5da8dSAndroid Build Coastguard Worker blocked waiting until the lock is unlocked, only one at a time will be 147*cda5da8dSAndroid Build Coastguard Worker able to grab ownership of the lock. There is no return value in this 148*cda5da8dSAndroid Build Coastguard Worker case. 149*cda5da8dSAndroid Build Coastguard Worker 150*cda5da8dSAndroid Build Coastguard Worker When invoked with the blocking argument set to true, do the same thing 151*cda5da8dSAndroid Build Coastguard Worker as when called without arguments, and return true. 152*cda5da8dSAndroid Build Coastguard Worker 153*cda5da8dSAndroid Build Coastguard Worker When invoked with the blocking argument set to false, do not block. If a 154*cda5da8dSAndroid Build Coastguard Worker call without an argument would block, return false immediately; 155*cda5da8dSAndroid Build Coastguard Worker otherwise, do the same thing as when called without arguments, and 156*cda5da8dSAndroid Build Coastguard Worker return true. 157*cda5da8dSAndroid Build Coastguard Worker 158*cda5da8dSAndroid Build Coastguard Worker When invoked with the floating-point timeout argument set to a positive 159*cda5da8dSAndroid Build Coastguard Worker value, block for at most the number of seconds specified by timeout 160*cda5da8dSAndroid Build Coastguard Worker and as long as the lock cannot be acquired. Return true if the lock has 161*cda5da8dSAndroid Build Coastguard Worker been acquired, false if the timeout has elapsed. 162*cda5da8dSAndroid Build Coastguard Worker 163*cda5da8dSAndroid Build Coastguard Worker """ 164*cda5da8dSAndroid Build Coastguard Worker me = get_ident() 165*cda5da8dSAndroid Build Coastguard Worker if self._owner == me: 166*cda5da8dSAndroid Build Coastguard Worker self._count += 1 167*cda5da8dSAndroid Build Coastguard Worker return 1 168*cda5da8dSAndroid Build Coastguard Worker rc = self._block.acquire(blocking, timeout) 169*cda5da8dSAndroid Build Coastguard Worker if rc: 170*cda5da8dSAndroid Build Coastguard Worker self._owner = me 171*cda5da8dSAndroid Build Coastguard Worker self._count = 1 172*cda5da8dSAndroid Build Coastguard Worker return rc 173*cda5da8dSAndroid Build Coastguard Worker 174*cda5da8dSAndroid Build Coastguard Worker __enter__ = acquire 175*cda5da8dSAndroid Build Coastguard Worker 176*cda5da8dSAndroid Build Coastguard Worker def release(self): 177*cda5da8dSAndroid Build Coastguard Worker """Release a lock, decrementing the recursion level. 178*cda5da8dSAndroid Build Coastguard Worker 179*cda5da8dSAndroid Build Coastguard Worker If after the decrement it is zero, reset the lock to unlocked (not owned 180*cda5da8dSAndroid Build Coastguard Worker by any thread), and if any other threads are blocked waiting for the 181*cda5da8dSAndroid Build Coastguard Worker lock to become unlocked, allow exactly one of them to proceed. If after 182*cda5da8dSAndroid Build Coastguard Worker the decrement the recursion level is still nonzero, the lock remains 183*cda5da8dSAndroid Build Coastguard Worker locked and owned by the calling thread. 184*cda5da8dSAndroid Build Coastguard Worker 185*cda5da8dSAndroid Build Coastguard Worker Only call this method when the calling thread owns the lock. A 186*cda5da8dSAndroid Build Coastguard Worker RuntimeError is raised if this method is called when the lock is 187*cda5da8dSAndroid Build Coastguard Worker unlocked. 188*cda5da8dSAndroid Build Coastguard Worker 189*cda5da8dSAndroid Build Coastguard Worker There is no return value. 190*cda5da8dSAndroid Build Coastguard Worker 191*cda5da8dSAndroid Build Coastguard Worker """ 192*cda5da8dSAndroid Build Coastguard Worker if self._owner != get_ident(): 193*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError("cannot release un-acquired lock") 194*cda5da8dSAndroid Build Coastguard Worker self._count = count = self._count - 1 195*cda5da8dSAndroid Build Coastguard Worker if not count: 196*cda5da8dSAndroid Build Coastguard Worker self._owner = None 197*cda5da8dSAndroid Build Coastguard Worker self._block.release() 198*cda5da8dSAndroid Build Coastguard Worker 199*cda5da8dSAndroid Build Coastguard Worker def __exit__(self, t, v, tb): 200*cda5da8dSAndroid Build Coastguard Worker self.release() 201*cda5da8dSAndroid Build Coastguard Worker 202*cda5da8dSAndroid Build Coastguard Worker # Internal methods used by condition variables 203*cda5da8dSAndroid Build Coastguard Worker 204*cda5da8dSAndroid Build Coastguard Worker def _acquire_restore(self, state): 205*cda5da8dSAndroid Build Coastguard Worker self._block.acquire() 206*cda5da8dSAndroid Build Coastguard Worker self._count, self._owner = state 207*cda5da8dSAndroid Build Coastguard Worker 208*cda5da8dSAndroid Build Coastguard Worker def _release_save(self): 209*cda5da8dSAndroid Build Coastguard Worker if self._count == 0: 210*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError("cannot release un-acquired lock") 211*cda5da8dSAndroid Build Coastguard Worker count = self._count 212*cda5da8dSAndroid Build Coastguard Worker self._count = 0 213*cda5da8dSAndroid Build Coastguard Worker owner = self._owner 214*cda5da8dSAndroid Build Coastguard Worker self._owner = None 215*cda5da8dSAndroid Build Coastguard Worker self._block.release() 216*cda5da8dSAndroid Build Coastguard Worker return (count, owner) 217*cda5da8dSAndroid Build Coastguard Worker 218*cda5da8dSAndroid Build Coastguard Worker def _is_owned(self): 219*cda5da8dSAndroid Build Coastguard Worker return self._owner == get_ident() 220*cda5da8dSAndroid Build Coastguard Worker 221*cda5da8dSAndroid Build Coastguard Worker_PyRLock = _RLock 222*cda5da8dSAndroid Build Coastguard Worker 223*cda5da8dSAndroid Build Coastguard Worker 224*cda5da8dSAndroid Build Coastguard Workerclass Condition: 225*cda5da8dSAndroid Build Coastguard Worker """Class that implements a condition variable. 226*cda5da8dSAndroid Build Coastguard Worker 227*cda5da8dSAndroid Build Coastguard Worker A condition variable allows one or more threads to wait until they are 228*cda5da8dSAndroid Build Coastguard Worker notified by another thread. 229*cda5da8dSAndroid Build Coastguard Worker 230*cda5da8dSAndroid Build Coastguard Worker If the lock argument is given and not None, it must be a Lock or RLock 231*cda5da8dSAndroid Build Coastguard Worker object, and it is used as the underlying lock. Otherwise, a new RLock object 232*cda5da8dSAndroid Build Coastguard Worker is created and used as the underlying lock. 233*cda5da8dSAndroid Build Coastguard Worker 234*cda5da8dSAndroid Build Coastguard Worker """ 235*cda5da8dSAndroid Build Coastguard Worker 236*cda5da8dSAndroid Build Coastguard Worker def __init__(self, lock=None): 237*cda5da8dSAndroid Build Coastguard Worker if lock is None: 238*cda5da8dSAndroid Build Coastguard Worker lock = RLock() 239*cda5da8dSAndroid Build Coastguard Worker self._lock = lock 240*cda5da8dSAndroid Build Coastguard Worker # Export the lock's acquire() and release() methods 241*cda5da8dSAndroid Build Coastguard Worker self.acquire = lock.acquire 242*cda5da8dSAndroid Build Coastguard Worker self.release = lock.release 243*cda5da8dSAndroid Build Coastguard Worker # If the lock defines _release_save() and/or _acquire_restore(), 244*cda5da8dSAndroid Build Coastguard Worker # these override the default implementations (which just call 245*cda5da8dSAndroid Build Coastguard Worker # release() and acquire() on the lock). Ditto for _is_owned(). 246*cda5da8dSAndroid Build Coastguard Worker try: 247*cda5da8dSAndroid Build Coastguard Worker self._release_save = lock._release_save 248*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 249*cda5da8dSAndroid Build Coastguard Worker pass 250*cda5da8dSAndroid Build Coastguard Worker try: 251*cda5da8dSAndroid Build Coastguard Worker self._acquire_restore = lock._acquire_restore 252*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 253*cda5da8dSAndroid Build Coastguard Worker pass 254*cda5da8dSAndroid Build Coastguard Worker try: 255*cda5da8dSAndroid Build Coastguard Worker self._is_owned = lock._is_owned 256*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 257*cda5da8dSAndroid Build Coastguard Worker pass 258*cda5da8dSAndroid Build Coastguard Worker self._waiters = _deque() 259*cda5da8dSAndroid Build Coastguard Worker 260*cda5da8dSAndroid Build Coastguard Worker def _at_fork_reinit(self): 261*cda5da8dSAndroid Build Coastguard Worker self._lock._at_fork_reinit() 262*cda5da8dSAndroid Build Coastguard Worker self._waiters.clear() 263*cda5da8dSAndroid Build Coastguard Worker 264*cda5da8dSAndroid Build Coastguard Worker def __enter__(self): 265*cda5da8dSAndroid Build Coastguard Worker return self._lock.__enter__() 266*cda5da8dSAndroid Build Coastguard Worker 267*cda5da8dSAndroid Build Coastguard Worker def __exit__(self, *args): 268*cda5da8dSAndroid Build Coastguard Worker return self._lock.__exit__(*args) 269*cda5da8dSAndroid Build Coastguard Worker 270*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 271*cda5da8dSAndroid Build Coastguard Worker return "<Condition(%s, %d)>" % (self._lock, len(self._waiters)) 272*cda5da8dSAndroid Build Coastguard Worker 273*cda5da8dSAndroid Build Coastguard Worker def _release_save(self): 274*cda5da8dSAndroid Build Coastguard Worker self._lock.release() # No state to save 275*cda5da8dSAndroid Build Coastguard Worker 276*cda5da8dSAndroid Build Coastguard Worker def _acquire_restore(self, x): 277*cda5da8dSAndroid Build Coastguard Worker self._lock.acquire() # Ignore saved state 278*cda5da8dSAndroid Build Coastguard Worker 279*cda5da8dSAndroid Build Coastguard Worker def _is_owned(self): 280*cda5da8dSAndroid Build Coastguard Worker # Return True if lock is owned by current_thread. 281*cda5da8dSAndroid Build Coastguard Worker # This method is called only if _lock doesn't have _is_owned(). 282*cda5da8dSAndroid Build Coastguard Worker if self._lock.acquire(False): 283*cda5da8dSAndroid Build Coastguard Worker self._lock.release() 284*cda5da8dSAndroid Build Coastguard Worker return False 285*cda5da8dSAndroid Build Coastguard Worker else: 286*cda5da8dSAndroid Build Coastguard Worker return True 287*cda5da8dSAndroid Build Coastguard Worker 288*cda5da8dSAndroid Build Coastguard Worker def wait(self, timeout=None): 289*cda5da8dSAndroid Build Coastguard Worker """Wait until notified or until a timeout occurs. 290*cda5da8dSAndroid Build Coastguard Worker 291*cda5da8dSAndroid Build Coastguard Worker If the calling thread has not acquired the lock when this method is 292*cda5da8dSAndroid Build Coastguard Worker called, a RuntimeError is raised. 293*cda5da8dSAndroid Build Coastguard Worker 294*cda5da8dSAndroid Build Coastguard Worker This method releases the underlying lock, and then blocks until it is 295*cda5da8dSAndroid Build Coastguard Worker awakened by a notify() or notify_all() call for the same condition 296*cda5da8dSAndroid Build Coastguard Worker variable in another thread, or until the optional timeout occurs. Once 297*cda5da8dSAndroid Build Coastguard Worker awakened or timed out, it re-acquires the lock and returns. 298*cda5da8dSAndroid Build Coastguard Worker 299*cda5da8dSAndroid Build Coastguard Worker When the timeout argument is present and not None, it should be a 300*cda5da8dSAndroid Build Coastguard Worker floating point number specifying a timeout for the operation in seconds 301*cda5da8dSAndroid Build Coastguard Worker (or fractions thereof). 302*cda5da8dSAndroid Build Coastguard Worker 303*cda5da8dSAndroid Build Coastguard Worker When the underlying lock is an RLock, it is not released using its 304*cda5da8dSAndroid Build Coastguard Worker release() method, since this may not actually unlock the lock when it 305*cda5da8dSAndroid Build Coastguard Worker was acquired multiple times recursively. Instead, an internal interface 306*cda5da8dSAndroid Build Coastguard Worker of the RLock class is used, which really unlocks it even when it has 307*cda5da8dSAndroid Build Coastguard Worker been recursively acquired several times. Another internal interface is 308*cda5da8dSAndroid Build Coastguard Worker then used to restore the recursion level when the lock is reacquired. 309*cda5da8dSAndroid Build Coastguard Worker 310*cda5da8dSAndroid Build Coastguard Worker """ 311*cda5da8dSAndroid Build Coastguard Worker if not self._is_owned(): 312*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError("cannot wait on un-acquired lock") 313*cda5da8dSAndroid Build Coastguard Worker waiter = _allocate_lock() 314*cda5da8dSAndroid Build Coastguard Worker waiter.acquire() 315*cda5da8dSAndroid Build Coastguard Worker self._waiters.append(waiter) 316*cda5da8dSAndroid Build Coastguard Worker saved_state = self._release_save() 317*cda5da8dSAndroid Build Coastguard Worker gotit = False 318*cda5da8dSAndroid Build Coastguard Worker try: # restore state no matter what (e.g., KeyboardInterrupt) 319*cda5da8dSAndroid Build Coastguard Worker if timeout is None: 320*cda5da8dSAndroid Build Coastguard Worker waiter.acquire() 321*cda5da8dSAndroid Build Coastguard Worker gotit = True 322*cda5da8dSAndroid Build Coastguard Worker else: 323*cda5da8dSAndroid Build Coastguard Worker if timeout > 0: 324*cda5da8dSAndroid Build Coastguard Worker gotit = waiter.acquire(True, timeout) 325*cda5da8dSAndroid Build Coastguard Worker else: 326*cda5da8dSAndroid Build Coastguard Worker gotit = waiter.acquire(False) 327*cda5da8dSAndroid Build Coastguard Worker return gotit 328*cda5da8dSAndroid Build Coastguard Worker finally: 329*cda5da8dSAndroid Build Coastguard Worker self._acquire_restore(saved_state) 330*cda5da8dSAndroid Build Coastguard Worker if not gotit: 331*cda5da8dSAndroid Build Coastguard Worker try: 332*cda5da8dSAndroid Build Coastguard Worker self._waiters.remove(waiter) 333*cda5da8dSAndroid Build Coastguard Worker except ValueError: 334*cda5da8dSAndroid Build Coastguard Worker pass 335*cda5da8dSAndroid Build Coastguard Worker 336*cda5da8dSAndroid Build Coastguard Worker def wait_for(self, predicate, timeout=None): 337*cda5da8dSAndroid Build Coastguard Worker """Wait until a condition evaluates to True. 338*cda5da8dSAndroid Build Coastguard Worker 339*cda5da8dSAndroid Build Coastguard Worker predicate should be a callable which result will be interpreted as a 340*cda5da8dSAndroid Build Coastguard Worker boolean value. A timeout may be provided giving the maximum time to 341*cda5da8dSAndroid Build Coastguard Worker wait. 342*cda5da8dSAndroid Build Coastguard Worker 343*cda5da8dSAndroid Build Coastguard Worker """ 344*cda5da8dSAndroid Build Coastguard Worker endtime = None 345*cda5da8dSAndroid Build Coastguard Worker waittime = timeout 346*cda5da8dSAndroid Build Coastguard Worker result = predicate() 347*cda5da8dSAndroid Build Coastguard Worker while not result: 348*cda5da8dSAndroid Build Coastguard Worker if waittime is not None: 349*cda5da8dSAndroid Build Coastguard Worker if endtime is None: 350*cda5da8dSAndroid Build Coastguard Worker endtime = _time() + waittime 351*cda5da8dSAndroid Build Coastguard Worker else: 352*cda5da8dSAndroid Build Coastguard Worker waittime = endtime - _time() 353*cda5da8dSAndroid Build Coastguard Worker if waittime <= 0: 354*cda5da8dSAndroid Build Coastguard Worker break 355*cda5da8dSAndroid Build Coastguard Worker self.wait(waittime) 356*cda5da8dSAndroid Build Coastguard Worker result = predicate() 357*cda5da8dSAndroid Build Coastguard Worker return result 358*cda5da8dSAndroid Build Coastguard Worker 359*cda5da8dSAndroid Build Coastguard Worker def notify(self, n=1): 360*cda5da8dSAndroid Build Coastguard Worker """Wake up one or more threads waiting on this condition, if any. 361*cda5da8dSAndroid Build Coastguard Worker 362*cda5da8dSAndroid Build Coastguard Worker If the calling thread has not acquired the lock when this method is 363*cda5da8dSAndroid Build Coastguard Worker called, a RuntimeError is raised. 364*cda5da8dSAndroid Build Coastguard Worker 365*cda5da8dSAndroid Build Coastguard Worker This method wakes up at most n of the threads waiting for the condition 366*cda5da8dSAndroid Build Coastguard Worker variable; it is a no-op if no threads are waiting. 367*cda5da8dSAndroid Build Coastguard Worker 368*cda5da8dSAndroid Build Coastguard Worker """ 369*cda5da8dSAndroid Build Coastguard Worker if not self._is_owned(): 370*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError("cannot notify on un-acquired lock") 371*cda5da8dSAndroid Build Coastguard Worker waiters = self._waiters 372*cda5da8dSAndroid Build Coastguard Worker while waiters and n > 0: 373*cda5da8dSAndroid Build Coastguard Worker waiter = waiters[0] 374*cda5da8dSAndroid Build Coastguard Worker try: 375*cda5da8dSAndroid Build Coastguard Worker waiter.release() 376*cda5da8dSAndroid Build Coastguard Worker except RuntimeError: 377*cda5da8dSAndroid Build Coastguard Worker # gh-92530: The previous call of notify() released the lock, 378*cda5da8dSAndroid Build Coastguard Worker # but was interrupted before removing it from the queue. 379*cda5da8dSAndroid Build Coastguard Worker # It can happen if a signal handler raises an exception, 380*cda5da8dSAndroid Build Coastguard Worker # like CTRL+C which raises KeyboardInterrupt. 381*cda5da8dSAndroid Build Coastguard Worker pass 382*cda5da8dSAndroid Build Coastguard Worker else: 383*cda5da8dSAndroid Build Coastguard Worker n -= 1 384*cda5da8dSAndroid Build Coastguard Worker try: 385*cda5da8dSAndroid Build Coastguard Worker waiters.remove(waiter) 386*cda5da8dSAndroid Build Coastguard Worker except ValueError: 387*cda5da8dSAndroid Build Coastguard Worker pass 388*cda5da8dSAndroid Build Coastguard Worker 389*cda5da8dSAndroid Build Coastguard Worker def notify_all(self): 390*cda5da8dSAndroid Build Coastguard Worker """Wake up all threads waiting on this condition. 391*cda5da8dSAndroid Build Coastguard Worker 392*cda5da8dSAndroid Build Coastguard Worker If the calling thread has not acquired the lock when this method 393*cda5da8dSAndroid Build Coastguard Worker is called, a RuntimeError is raised. 394*cda5da8dSAndroid Build Coastguard Worker 395*cda5da8dSAndroid Build Coastguard Worker """ 396*cda5da8dSAndroid Build Coastguard Worker self.notify(len(self._waiters)) 397*cda5da8dSAndroid Build Coastguard Worker 398*cda5da8dSAndroid Build Coastguard Worker def notifyAll(self): 399*cda5da8dSAndroid Build Coastguard Worker """Wake up all threads waiting on this condition. 400*cda5da8dSAndroid Build Coastguard Worker 401*cda5da8dSAndroid Build Coastguard Worker This method is deprecated, use notify_all() instead. 402*cda5da8dSAndroid Build Coastguard Worker 403*cda5da8dSAndroid Build Coastguard Worker """ 404*cda5da8dSAndroid Build Coastguard Worker import warnings 405*cda5da8dSAndroid Build Coastguard Worker warnings.warn('notifyAll() is deprecated, use notify_all() instead', 406*cda5da8dSAndroid Build Coastguard Worker DeprecationWarning, stacklevel=2) 407*cda5da8dSAndroid Build Coastguard Worker self.notify_all() 408*cda5da8dSAndroid Build Coastguard Worker 409*cda5da8dSAndroid Build Coastguard Worker 410*cda5da8dSAndroid Build Coastguard Workerclass Semaphore: 411*cda5da8dSAndroid Build Coastguard Worker """This class implements semaphore objects. 412*cda5da8dSAndroid Build Coastguard Worker 413*cda5da8dSAndroid Build Coastguard Worker Semaphores manage a counter representing the number of release() calls minus 414*cda5da8dSAndroid Build Coastguard Worker the number of acquire() calls, plus an initial value. The acquire() method 415*cda5da8dSAndroid Build Coastguard Worker blocks if necessary until it can return without making the counter 416*cda5da8dSAndroid Build Coastguard Worker negative. If not given, value defaults to 1. 417*cda5da8dSAndroid Build Coastguard Worker 418*cda5da8dSAndroid Build Coastguard Worker """ 419*cda5da8dSAndroid Build Coastguard Worker 420*cda5da8dSAndroid Build Coastguard Worker # After Tim Peters' semaphore class, but not quite the same (no maximum) 421*cda5da8dSAndroid Build Coastguard Worker 422*cda5da8dSAndroid Build Coastguard Worker def __init__(self, value=1): 423*cda5da8dSAndroid Build Coastguard Worker if value < 0: 424*cda5da8dSAndroid Build Coastguard Worker raise ValueError("semaphore initial value must be >= 0") 425*cda5da8dSAndroid Build Coastguard Worker self._cond = Condition(Lock()) 426*cda5da8dSAndroid Build Coastguard Worker self._value = value 427*cda5da8dSAndroid Build Coastguard Worker 428*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 429*cda5da8dSAndroid Build Coastguard Worker cls = self.__class__ 430*cda5da8dSAndroid Build Coastguard Worker return (f"<{cls.__module__}.{cls.__qualname__} at {id(self):#x}:" 431*cda5da8dSAndroid Build Coastguard Worker f" value={self._value}>") 432*cda5da8dSAndroid Build Coastguard Worker 433*cda5da8dSAndroid Build Coastguard Worker def acquire(self, blocking=True, timeout=None): 434*cda5da8dSAndroid Build Coastguard Worker """Acquire a semaphore, decrementing the internal counter by one. 435*cda5da8dSAndroid Build Coastguard Worker 436*cda5da8dSAndroid Build Coastguard Worker When invoked without arguments: if the internal counter is larger than 437*cda5da8dSAndroid Build Coastguard Worker zero on entry, decrement it by one and return immediately. If it is zero 438*cda5da8dSAndroid Build Coastguard Worker on entry, block, waiting until some other thread has called release() to 439*cda5da8dSAndroid Build Coastguard Worker make it larger than zero. This is done with proper interlocking so that 440*cda5da8dSAndroid Build Coastguard Worker if multiple acquire() calls are blocked, release() will wake exactly one 441*cda5da8dSAndroid Build Coastguard Worker of them up. The implementation may pick one at random, so the order in 442*cda5da8dSAndroid Build Coastguard Worker which blocked threads are awakened should not be relied on. There is no 443*cda5da8dSAndroid Build Coastguard Worker return value in this case. 444*cda5da8dSAndroid Build Coastguard Worker 445*cda5da8dSAndroid Build Coastguard Worker When invoked with blocking set to true, do the same thing as when called 446*cda5da8dSAndroid Build Coastguard Worker without arguments, and return true. 447*cda5da8dSAndroid Build Coastguard Worker 448*cda5da8dSAndroid Build Coastguard Worker When invoked with blocking set to false, do not block. If a call without 449*cda5da8dSAndroid Build Coastguard Worker an argument would block, return false immediately; otherwise, do the 450*cda5da8dSAndroid Build Coastguard Worker same thing as when called without arguments, and return true. 451*cda5da8dSAndroid Build Coastguard Worker 452*cda5da8dSAndroid Build Coastguard Worker When invoked with a timeout other than None, it will block for at 453*cda5da8dSAndroid Build Coastguard Worker most timeout seconds. If acquire does not complete successfully in 454*cda5da8dSAndroid Build Coastguard Worker that interval, return false. Return true otherwise. 455*cda5da8dSAndroid Build Coastguard Worker 456*cda5da8dSAndroid Build Coastguard Worker """ 457*cda5da8dSAndroid Build Coastguard Worker if not blocking and timeout is not None: 458*cda5da8dSAndroid Build Coastguard Worker raise ValueError("can't specify timeout for non-blocking acquire") 459*cda5da8dSAndroid Build Coastguard Worker rc = False 460*cda5da8dSAndroid Build Coastguard Worker endtime = None 461*cda5da8dSAndroid Build Coastguard Worker with self._cond: 462*cda5da8dSAndroid Build Coastguard Worker while self._value == 0: 463*cda5da8dSAndroid Build Coastguard Worker if not blocking: 464*cda5da8dSAndroid Build Coastguard Worker break 465*cda5da8dSAndroid Build Coastguard Worker if timeout is not None: 466*cda5da8dSAndroid Build Coastguard Worker if endtime is None: 467*cda5da8dSAndroid Build Coastguard Worker endtime = _time() + timeout 468*cda5da8dSAndroid Build Coastguard Worker else: 469*cda5da8dSAndroid Build Coastguard Worker timeout = endtime - _time() 470*cda5da8dSAndroid Build Coastguard Worker if timeout <= 0: 471*cda5da8dSAndroid Build Coastguard Worker break 472*cda5da8dSAndroid Build Coastguard Worker self._cond.wait(timeout) 473*cda5da8dSAndroid Build Coastguard Worker else: 474*cda5da8dSAndroid Build Coastguard Worker self._value -= 1 475*cda5da8dSAndroid Build Coastguard Worker rc = True 476*cda5da8dSAndroid Build Coastguard Worker return rc 477*cda5da8dSAndroid Build Coastguard Worker 478*cda5da8dSAndroid Build Coastguard Worker __enter__ = acquire 479*cda5da8dSAndroid Build Coastguard Worker 480*cda5da8dSAndroid Build Coastguard Worker def release(self, n=1): 481*cda5da8dSAndroid Build Coastguard Worker """Release a semaphore, incrementing the internal counter by one or more. 482*cda5da8dSAndroid Build Coastguard Worker 483*cda5da8dSAndroid Build Coastguard Worker When the counter is zero on entry and another thread is waiting for it 484*cda5da8dSAndroid Build Coastguard Worker to become larger than zero again, wake up that thread. 485*cda5da8dSAndroid Build Coastguard Worker 486*cda5da8dSAndroid Build Coastguard Worker """ 487*cda5da8dSAndroid Build Coastguard Worker if n < 1: 488*cda5da8dSAndroid Build Coastguard Worker raise ValueError('n must be one or more') 489*cda5da8dSAndroid Build Coastguard Worker with self._cond: 490*cda5da8dSAndroid Build Coastguard Worker self._value += n 491*cda5da8dSAndroid Build Coastguard Worker for i in range(n): 492*cda5da8dSAndroid Build Coastguard Worker self._cond.notify() 493*cda5da8dSAndroid Build Coastguard Worker 494*cda5da8dSAndroid Build Coastguard Worker def __exit__(self, t, v, tb): 495*cda5da8dSAndroid Build Coastguard Worker self.release() 496*cda5da8dSAndroid Build Coastguard Worker 497*cda5da8dSAndroid Build Coastguard Worker 498*cda5da8dSAndroid Build Coastguard Workerclass BoundedSemaphore(Semaphore): 499*cda5da8dSAndroid Build Coastguard Worker """Implements a bounded semaphore. 500*cda5da8dSAndroid Build Coastguard Worker 501*cda5da8dSAndroid Build Coastguard Worker A bounded semaphore checks to make sure its current value doesn't exceed its 502*cda5da8dSAndroid Build Coastguard Worker initial value. If it does, ValueError is raised. In most situations 503*cda5da8dSAndroid Build Coastguard Worker semaphores are used to guard resources with limited capacity. 504*cda5da8dSAndroid Build Coastguard Worker 505*cda5da8dSAndroid Build Coastguard Worker If the semaphore is released too many times it's a sign of a bug. If not 506*cda5da8dSAndroid Build Coastguard Worker given, value defaults to 1. 507*cda5da8dSAndroid Build Coastguard Worker 508*cda5da8dSAndroid Build Coastguard Worker Like regular semaphores, bounded semaphores manage a counter representing 509*cda5da8dSAndroid Build Coastguard Worker the number of release() calls minus the number of acquire() calls, plus an 510*cda5da8dSAndroid Build Coastguard Worker initial value. The acquire() method blocks if necessary until it can return 511*cda5da8dSAndroid Build Coastguard Worker without making the counter negative. If not given, value defaults to 1. 512*cda5da8dSAndroid Build Coastguard Worker 513*cda5da8dSAndroid Build Coastguard Worker """ 514*cda5da8dSAndroid Build Coastguard Worker 515*cda5da8dSAndroid Build Coastguard Worker def __init__(self, value=1): 516*cda5da8dSAndroid Build Coastguard Worker Semaphore.__init__(self, value) 517*cda5da8dSAndroid Build Coastguard Worker self._initial_value = value 518*cda5da8dSAndroid Build Coastguard Worker 519*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 520*cda5da8dSAndroid Build Coastguard Worker cls = self.__class__ 521*cda5da8dSAndroid Build Coastguard Worker return (f"<{cls.__module__}.{cls.__qualname__} at {id(self):#x}:" 522*cda5da8dSAndroid Build Coastguard Worker f" value={self._value}/{self._initial_value}>") 523*cda5da8dSAndroid Build Coastguard Worker 524*cda5da8dSAndroid Build Coastguard Worker def release(self, n=1): 525*cda5da8dSAndroid Build Coastguard Worker """Release a semaphore, incrementing the internal counter by one or more. 526*cda5da8dSAndroid Build Coastguard Worker 527*cda5da8dSAndroid Build Coastguard Worker When the counter is zero on entry and another thread is waiting for it 528*cda5da8dSAndroid Build Coastguard Worker to become larger than zero again, wake up that thread. 529*cda5da8dSAndroid Build Coastguard Worker 530*cda5da8dSAndroid Build Coastguard Worker If the number of releases exceeds the number of acquires, 531*cda5da8dSAndroid Build Coastguard Worker raise a ValueError. 532*cda5da8dSAndroid Build Coastguard Worker 533*cda5da8dSAndroid Build Coastguard Worker """ 534*cda5da8dSAndroid Build Coastguard Worker if n < 1: 535*cda5da8dSAndroid Build Coastguard Worker raise ValueError('n must be one or more') 536*cda5da8dSAndroid Build Coastguard Worker with self._cond: 537*cda5da8dSAndroid Build Coastguard Worker if self._value + n > self._initial_value: 538*cda5da8dSAndroid Build Coastguard Worker raise ValueError("Semaphore released too many times") 539*cda5da8dSAndroid Build Coastguard Worker self._value += n 540*cda5da8dSAndroid Build Coastguard Worker for i in range(n): 541*cda5da8dSAndroid Build Coastguard Worker self._cond.notify() 542*cda5da8dSAndroid Build Coastguard Worker 543*cda5da8dSAndroid Build Coastguard Worker 544*cda5da8dSAndroid Build Coastguard Workerclass Event: 545*cda5da8dSAndroid Build Coastguard Worker """Class implementing event objects. 546*cda5da8dSAndroid Build Coastguard Worker 547*cda5da8dSAndroid Build Coastguard Worker Events manage a flag that can be set to true with the set() method and reset 548*cda5da8dSAndroid Build Coastguard Worker to false with the clear() method. The wait() method blocks until the flag is 549*cda5da8dSAndroid Build Coastguard Worker true. The flag is initially false. 550*cda5da8dSAndroid Build Coastguard Worker 551*cda5da8dSAndroid Build Coastguard Worker """ 552*cda5da8dSAndroid Build Coastguard Worker 553*cda5da8dSAndroid Build Coastguard Worker # After Tim Peters' event class (without is_posted()) 554*cda5da8dSAndroid Build Coastguard Worker 555*cda5da8dSAndroid Build Coastguard Worker def __init__(self): 556*cda5da8dSAndroid Build Coastguard Worker self._cond = Condition(Lock()) 557*cda5da8dSAndroid Build Coastguard Worker self._flag = False 558*cda5da8dSAndroid Build Coastguard Worker 559*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 560*cda5da8dSAndroid Build Coastguard Worker cls = self.__class__ 561*cda5da8dSAndroid Build Coastguard Worker status = 'set' if self._flag else 'unset' 562*cda5da8dSAndroid Build Coastguard Worker return f"<{cls.__module__}.{cls.__qualname__} at {id(self):#x}: {status}>" 563*cda5da8dSAndroid Build Coastguard Worker 564*cda5da8dSAndroid Build Coastguard Worker def _at_fork_reinit(self): 565*cda5da8dSAndroid Build Coastguard Worker # Private method called by Thread._reset_internal_locks() 566*cda5da8dSAndroid Build Coastguard Worker self._cond._at_fork_reinit() 567*cda5da8dSAndroid Build Coastguard Worker 568*cda5da8dSAndroid Build Coastguard Worker def is_set(self): 569*cda5da8dSAndroid Build Coastguard Worker """Return true if and only if the internal flag is true.""" 570*cda5da8dSAndroid Build Coastguard Worker return self._flag 571*cda5da8dSAndroid Build Coastguard Worker 572*cda5da8dSAndroid Build Coastguard Worker def isSet(self): 573*cda5da8dSAndroid Build Coastguard Worker """Return true if and only if the internal flag is true. 574*cda5da8dSAndroid Build Coastguard Worker 575*cda5da8dSAndroid Build Coastguard Worker This method is deprecated, use is_set() instead. 576*cda5da8dSAndroid Build Coastguard Worker 577*cda5da8dSAndroid Build Coastguard Worker """ 578*cda5da8dSAndroid Build Coastguard Worker import warnings 579*cda5da8dSAndroid Build Coastguard Worker warnings.warn('isSet() is deprecated, use is_set() instead', 580*cda5da8dSAndroid Build Coastguard Worker DeprecationWarning, stacklevel=2) 581*cda5da8dSAndroid Build Coastguard Worker return self.is_set() 582*cda5da8dSAndroid Build Coastguard Worker 583*cda5da8dSAndroid Build Coastguard Worker def set(self): 584*cda5da8dSAndroid Build Coastguard Worker """Set the internal flag to true. 585*cda5da8dSAndroid Build Coastguard Worker 586*cda5da8dSAndroid Build Coastguard Worker All threads waiting for it to become true are awakened. Threads 587*cda5da8dSAndroid Build Coastguard Worker that call wait() once the flag is true will not block at all. 588*cda5da8dSAndroid Build Coastguard Worker 589*cda5da8dSAndroid Build Coastguard Worker """ 590*cda5da8dSAndroid Build Coastguard Worker with self._cond: 591*cda5da8dSAndroid Build Coastguard Worker self._flag = True 592*cda5da8dSAndroid Build Coastguard Worker self._cond.notify_all() 593*cda5da8dSAndroid Build Coastguard Worker 594*cda5da8dSAndroid Build Coastguard Worker def clear(self): 595*cda5da8dSAndroid Build Coastguard Worker """Reset the internal flag to false. 596*cda5da8dSAndroid Build Coastguard Worker 597*cda5da8dSAndroid Build Coastguard Worker Subsequently, threads calling wait() will block until set() is called to 598*cda5da8dSAndroid Build Coastguard Worker set the internal flag to true again. 599*cda5da8dSAndroid Build Coastguard Worker 600*cda5da8dSAndroid Build Coastguard Worker """ 601*cda5da8dSAndroid Build Coastguard Worker with self._cond: 602*cda5da8dSAndroid Build Coastguard Worker self._flag = False 603*cda5da8dSAndroid Build Coastguard Worker 604*cda5da8dSAndroid Build Coastguard Worker def wait(self, timeout=None): 605*cda5da8dSAndroid Build Coastguard Worker """Block until the internal flag is true. 606*cda5da8dSAndroid Build Coastguard Worker 607*cda5da8dSAndroid Build Coastguard Worker If the internal flag is true on entry, return immediately. Otherwise, 608*cda5da8dSAndroid Build Coastguard Worker block until another thread calls set() to set the flag to true, or until 609*cda5da8dSAndroid Build Coastguard Worker the optional timeout occurs. 610*cda5da8dSAndroid Build Coastguard Worker 611*cda5da8dSAndroid Build Coastguard Worker When the timeout argument is present and not None, it should be a 612*cda5da8dSAndroid Build Coastguard Worker floating point number specifying a timeout for the operation in seconds 613*cda5da8dSAndroid Build Coastguard Worker (or fractions thereof). 614*cda5da8dSAndroid Build Coastguard Worker 615*cda5da8dSAndroid Build Coastguard Worker This method returns the internal flag on exit, so it will always return 616*cda5da8dSAndroid Build Coastguard Worker True except if a timeout is given and the operation times out. 617*cda5da8dSAndroid Build Coastguard Worker 618*cda5da8dSAndroid Build Coastguard Worker """ 619*cda5da8dSAndroid Build Coastguard Worker with self._cond: 620*cda5da8dSAndroid Build Coastguard Worker signaled = self._flag 621*cda5da8dSAndroid Build Coastguard Worker if not signaled: 622*cda5da8dSAndroid Build Coastguard Worker signaled = self._cond.wait(timeout) 623*cda5da8dSAndroid Build Coastguard Worker return signaled 624*cda5da8dSAndroid Build Coastguard Worker 625*cda5da8dSAndroid Build Coastguard Worker 626*cda5da8dSAndroid Build Coastguard Worker# A barrier class. Inspired in part by the pthread_barrier_* api and 627*cda5da8dSAndroid Build Coastguard Worker# the CyclicBarrier class from Java. See 628*cda5da8dSAndroid Build Coastguard Worker# http://sourceware.org/pthreads-win32/manual/pthread_barrier_init.html and 629*cda5da8dSAndroid Build Coastguard Worker# http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ 630*cda5da8dSAndroid Build Coastguard Worker# CyclicBarrier.html 631*cda5da8dSAndroid Build Coastguard Worker# for information. 632*cda5da8dSAndroid Build Coastguard Worker# We maintain two main states, 'filling' and 'draining' enabling the barrier 633*cda5da8dSAndroid Build Coastguard Worker# to be cyclic. Threads are not allowed into it until it has fully drained 634*cda5da8dSAndroid Build Coastguard Worker# since the previous cycle. In addition, a 'resetting' state exists which is 635*cda5da8dSAndroid Build Coastguard Worker# similar to 'draining' except that threads leave with a BrokenBarrierError, 636*cda5da8dSAndroid Build Coastguard Worker# and a 'broken' state in which all threads get the exception. 637*cda5da8dSAndroid Build Coastguard Workerclass Barrier: 638*cda5da8dSAndroid Build Coastguard Worker """Implements a Barrier. 639*cda5da8dSAndroid Build Coastguard Worker 640*cda5da8dSAndroid Build Coastguard Worker Useful for synchronizing a fixed number of threads at known synchronization 641*cda5da8dSAndroid Build Coastguard Worker points. Threads block on 'wait()' and are simultaneously awoken once they 642*cda5da8dSAndroid Build Coastguard Worker have all made that call. 643*cda5da8dSAndroid Build Coastguard Worker 644*cda5da8dSAndroid Build Coastguard Worker """ 645*cda5da8dSAndroid Build Coastguard Worker 646*cda5da8dSAndroid Build Coastguard Worker def __init__(self, parties, action=None, timeout=None): 647*cda5da8dSAndroid Build Coastguard Worker """Create a barrier, initialised to 'parties' threads. 648*cda5da8dSAndroid Build Coastguard Worker 649*cda5da8dSAndroid Build Coastguard Worker 'action' is a callable which, when supplied, will be called by one of 650*cda5da8dSAndroid Build Coastguard Worker the threads after they have all entered the barrier and just prior to 651*cda5da8dSAndroid Build Coastguard Worker releasing them all. If a 'timeout' is provided, it is used as the 652*cda5da8dSAndroid Build Coastguard Worker default for all subsequent 'wait()' calls. 653*cda5da8dSAndroid Build Coastguard Worker 654*cda5da8dSAndroid Build Coastguard Worker """ 655*cda5da8dSAndroid Build Coastguard Worker self._cond = Condition(Lock()) 656*cda5da8dSAndroid Build Coastguard Worker self._action = action 657*cda5da8dSAndroid Build Coastguard Worker self._timeout = timeout 658*cda5da8dSAndroid Build Coastguard Worker self._parties = parties 659*cda5da8dSAndroid Build Coastguard Worker self._state = 0 # 0 filling, 1 draining, -1 resetting, -2 broken 660*cda5da8dSAndroid Build Coastguard Worker self._count = 0 661*cda5da8dSAndroid Build Coastguard Worker 662*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 663*cda5da8dSAndroid Build Coastguard Worker cls = self.__class__ 664*cda5da8dSAndroid Build Coastguard Worker if self.broken: 665*cda5da8dSAndroid Build Coastguard Worker return f"<{cls.__module__}.{cls.__qualname__} at {id(self):#x}: broken>" 666*cda5da8dSAndroid Build Coastguard Worker return (f"<{cls.__module__}.{cls.__qualname__} at {id(self):#x}:" 667*cda5da8dSAndroid Build Coastguard Worker f" waiters={self.n_waiting}/{self.parties}>") 668*cda5da8dSAndroid Build Coastguard Worker 669*cda5da8dSAndroid Build Coastguard Worker def wait(self, timeout=None): 670*cda5da8dSAndroid Build Coastguard Worker """Wait for the barrier. 671*cda5da8dSAndroid Build Coastguard Worker 672*cda5da8dSAndroid Build Coastguard Worker When the specified number of threads have started waiting, they are all 673*cda5da8dSAndroid Build Coastguard Worker simultaneously awoken. If an 'action' was provided for the barrier, one 674*cda5da8dSAndroid Build Coastguard Worker of the threads will have executed that callback prior to returning. 675*cda5da8dSAndroid Build Coastguard Worker Returns an individual index number from 0 to 'parties-1'. 676*cda5da8dSAndroid Build Coastguard Worker 677*cda5da8dSAndroid Build Coastguard Worker """ 678*cda5da8dSAndroid Build Coastguard Worker if timeout is None: 679*cda5da8dSAndroid Build Coastguard Worker timeout = self._timeout 680*cda5da8dSAndroid Build Coastguard Worker with self._cond: 681*cda5da8dSAndroid Build Coastguard Worker self._enter() # Block while the barrier drains. 682*cda5da8dSAndroid Build Coastguard Worker index = self._count 683*cda5da8dSAndroid Build Coastguard Worker self._count += 1 684*cda5da8dSAndroid Build Coastguard Worker try: 685*cda5da8dSAndroid Build Coastguard Worker if index + 1 == self._parties: 686*cda5da8dSAndroid Build Coastguard Worker # We release the barrier 687*cda5da8dSAndroid Build Coastguard Worker self._release() 688*cda5da8dSAndroid Build Coastguard Worker else: 689*cda5da8dSAndroid Build Coastguard Worker # We wait until someone releases us 690*cda5da8dSAndroid Build Coastguard Worker self._wait(timeout) 691*cda5da8dSAndroid Build Coastguard Worker return index 692*cda5da8dSAndroid Build Coastguard Worker finally: 693*cda5da8dSAndroid Build Coastguard Worker self._count -= 1 694*cda5da8dSAndroid Build Coastguard Worker # Wake up any threads waiting for barrier to drain. 695*cda5da8dSAndroid Build Coastguard Worker self._exit() 696*cda5da8dSAndroid Build Coastguard Worker 697*cda5da8dSAndroid Build Coastguard Worker # Block until the barrier is ready for us, or raise an exception 698*cda5da8dSAndroid Build Coastguard Worker # if it is broken. 699*cda5da8dSAndroid Build Coastguard Worker def _enter(self): 700*cda5da8dSAndroid Build Coastguard Worker while self._state in (-1, 1): 701*cda5da8dSAndroid Build Coastguard Worker # It is draining or resetting, wait until done 702*cda5da8dSAndroid Build Coastguard Worker self._cond.wait() 703*cda5da8dSAndroid Build Coastguard Worker #see if the barrier is in a broken state 704*cda5da8dSAndroid Build Coastguard Worker if self._state < 0: 705*cda5da8dSAndroid Build Coastguard Worker raise BrokenBarrierError 706*cda5da8dSAndroid Build Coastguard Worker assert self._state == 0 707*cda5da8dSAndroid Build Coastguard Worker 708*cda5da8dSAndroid Build Coastguard Worker # Optionally run the 'action' and release the threads waiting 709*cda5da8dSAndroid Build Coastguard Worker # in the barrier. 710*cda5da8dSAndroid Build Coastguard Worker def _release(self): 711*cda5da8dSAndroid Build Coastguard Worker try: 712*cda5da8dSAndroid Build Coastguard Worker if self._action: 713*cda5da8dSAndroid Build Coastguard Worker self._action() 714*cda5da8dSAndroid Build Coastguard Worker # enter draining state 715*cda5da8dSAndroid Build Coastguard Worker self._state = 1 716*cda5da8dSAndroid Build Coastguard Worker self._cond.notify_all() 717*cda5da8dSAndroid Build Coastguard Worker except: 718*cda5da8dSAndroid Build Coastguard Worker #an exception during the _action handler. Break and reraise 719*cda5da8dSAndroid Build Coastguard Worker self._break() 720*cda5da8dSAndroid Build Coastguard Worker raise 721*cda5da8dSAndroid Build Coastguard Worker 722*cda5da8dSAndroid Build Coastguard Worker # Wait in the barrier until we are released. Raise an exception 723*cda5da8dSAndroid Build Coastguard Worker # if the barrier is reset or broken. 724*cda5da8dSAndroid Build Coastguard Worker def _wait(self, timeout): 725*cda5da8dSAndroid Build Coastguard Worker if not self._cond.wait_for(lambda : self._state != 0, timeout): 726*cda5da8dSAndroid Build Coastguard Worker #timed out. Break the barrier 727*cda5da8dSAndroid Build Coastguard Worker self._break() 728*cda5da8dSAndroid Build Coastguard Worker raise BrokenBarrierError 729*cda5da8dSAndroid Build Coastguard Worker if self._state < 0: 730*cda5da8dSAndroid Build Coastguard Worker raise BrokenBarrierError 731*cda5da8dSAndroid Build Coastguard Worker assert self._state == 1 732*cda5da8dSAndroid Build Coastguard Worker 733*cda5da8dSAndroid Build Coastguard Worker # If we are the last thread to exit the barrier, signal any threads 734*cda5da8dSAndroid Build Coastguard Worker # waiting for the barrier to drain. 735*cda5da8dSAndroid Build Coastguard Worker def _exit(self): 736*cda5da8dSAndroid Build Coastguard Worker if self._count == 0: 737*cda5da8dSAndroid Build Coastguard Worker if self._state in (-1, 1): 738*cda5da8dSAndroid Build Coastguard Worker #resetting or draining 739*cda5da8dSAndroid Build Coastguard Worker self._state = 0 740*cda5da8dSAndroid Build Coastguard Worker self._cond.notify_all() 741*cda5da8dSAndroid Build Coastguard Worker 742*cda5da8dSAndroid Build Coastguard Worker def reset(self): 743*cda5da8dSAndroid Build Coastguard Worker """Reset the barrier to the initial state. 744*cda5da8dSAndroid Build Coastguard Worker 745*cda5da8dSAndroid Build Coastguard Worker Any threads currently waiting will get the BrokenBarrier exception 746*cda5da8dSAndroid Build Coastguard Worker raised. 747*cda5da8dSAndroid Build Coastguard Worker 748*cda5da8dSAndroid Build Coastguard Worker """ 749*cda5da8dSAndroid Build Coastguard Worker with self._cond: 750*cda5da8dSAndroid Build Coastguard Worker if self._count > 0: 751*cda5da8dSAndroid Build Coastguard Worker if self._state == 0: 752*cda5da8dSAndroid Build Coastguard Worker #reset the barrier, waking up threads 753*cda5da8dSAndroid Build Coastguard Worker self._state = -1 754*cda5da8dSAndroid Build Coastguard Worker elif self._state == -2: 755*cda5da8dSAndroid Build Coastguard Worker #was broken, set it to reset state 756*cda5da8dSAndroid Build Coastguard Worker #which clears when the last thread exits 757*cda5da8dSAndroid Build Coastguard Worker self._state = -1 758*cda5da8dSAndroid Build Coastguard Worker else: 759*cda5da8dSAndroid Build Coastguard Worker self._state = 0 760*cda5da8dSAndroid Build Coastguard Worker self._cond.notify_all() 761*cda5da8dSAndroid Build Coastguard Worker 762*cda5da8dSAndroid Build Coastguard Worker def abort(self): 763*cda5da8dSAndroid Build Coastguard Worker """Place the barrier into a 'broken' state. 764*cda5da8dSAndroid Build Coastguard Worker 765*cda5da8dSAndroid Build Coastguard Worker Useful in case of error. Any currently waiting threads and threads 766*cda5da8dSAndroid Build Coastguard Worker attempting to 'wait()' will have BrokenBarrierError raised. 767*cda5da8dSAndroid Build Coastguard Worker 768*cda5da8dSAndroid Build Coastguard Worker """ 769*cda5da8dSAndroid Build Coastguard Worker with self._cond: 770*cda5da8dSAndroid Build Coastguard Worker self._break() 771*cda5da8dSAndroid Build Coastguard Worker 772*cda5da8dSAndroid Build Coastguard Worker def _break(self): 773*cda5da8dSAndroid Build Coastguard Worker # An internal error was detected. The barrier is set to 774*cda5da8dSAndroid Build Coastguard Worker # a broken state all parties awakened. 775*cda5da8dSAndroid Build Coastguard Worker self._state = -2 776*cda5da8dSAndroid Build Coastguard Worker self._cond.notify_all() 777*cda5da8dSAndroid Build Coastguard Worker 778*cda5da8dSAndroid Build Coastguard Worker @property 779*cda5da8dSAndroid Build Coastguard Worker def parties(self): 780*cda5da8dSAndroid Build Coastguard Worker """Return the number of threads required to trip the barrier.""" 781*cda5da8dSAndroid Build Coastguard Worker return self._parties 782*cda5da8dSAndroid Build Coastguard Worker 783*cda5da8dSAndroid Build Coastguard Worker @property 784*cda5da8dSAndroid Build Coastguard Worker def n_waiting(self): 785*cda5da8dSAndroid Build Coastguard Worker """Return the number of threads currently waiting at the barrier.""" 786*cda5da8dSAndroid Build Coastguard Worker # We don't need synchronization here since this is an ephemeral result 787*cda5da8dSAndroid Build Coastguard Worker # anyway. It returns the correct value in the steady state. 788*cda5da8dSAndroid Build Coastguard Worker if self._state == 0: 789*cda5da8dSAndroid Build Coastguard Worker return self._count 790*cda5da8dSAndroid Build Coastguard Worker return 0 791*cda5da8dSAndroid Build Coastguard Worker 792*cda5da8dSAndroid Build Coastguard Worker @property 793*cda5da8dSAndroid Build Coastguard Worker def broken(self): 794*cda5da8dSAndroid Build Coastguard Worker """Return True if the barrier is in a broken state.""" 795*cda5da8dSAndroid Build Coastguard Worker return self._state == -2 796*cda5da8dSAndroid Build Coastguard Worker 797*cda5da8dSAndroid Build Coastguard Worker# exception raised by the Barrier class 798*cda5da8dSAndroid Build Coastguard Workerclass BrokenBarrierError(RuntimeError): 799*cda5da8dSAndroid Build Coastguard Worker pass 800*cda5da8dSAndroid Build Coastguard Worker 801*cda5da8dSAndroid Build Coastguard Worker 802*cda5da8dSAndroid Build Coastguard Worker# Helper to generate new thread names 803*cda5da8dSAndroid Build Coastguard Worker_counter = _count(1).__next__ 804*cda5da8dSAndroid Build Coastguard Workerdef _newname(name_template): 805*cda5da8dSAndroid Build Coastguard Worker return name_template % _counter() 806*cda5da8dSAndroid Build Coastguard Worker 807*cda5da8dSAndroid Build Coastguard Worker# Active thread administration. 808*cda5da8dSAndroid Build Coastguard Worker# 809*cda5da8dSAndroid Build Coastguard Worker# bpo-44422: Use a reentrant lock to allow reentrant calls to functions like 810*cda5da8dSAndroid Build Coastguard Worker# threading.enumerate(). 811*cda5da8dSAndroid Build Coastguard Worker_active_limbo_lock = RLock() 812*cda5da8dSAndroid Build Coastguard Worker_active = {} # maps thread id to Thread object 813*cda5da8dSAndroid Build Coastguard Worker_limbo = {} 814*cda5da8dSAndroid Build Coastguard Worker_dangling = WeakSet() 815*cda5da8dSAndroid Build Coastguard Worker 816*cda5da8dSAndroid Build Coastguard Worker# Set of Thread._tstate_lock locks of non-daemon threads used by _shutdown() 817*cda5da8dSAndroid Build Coastguard Worker# to wait until all Python thread states get deleted: 818*cda5da8dSAndroid Build Coastguard Worker# see Thread._set_tstate_lock(). 819*cda5da8dSAndroid Build Coastguard Worker_shutdown_locks_lock = _allocate_lock() 820*cda5da8dSAndroid Build Coastguard Worker_shutdown_locks = set() 821*cda5da8dSAndroid Build Coastguard Worker 822*cda5da8dSAndroid Build Coastguard Workerdef _maintain_shutdown_locks(): 823*cda5da8dSAndroid Build Coastguard Worker """ 824*cda5da8dSAndroid Build Coastguard Worker Drop any shutdown locks that don't correspond to running threads anymore. 825*cda5da8dSAndroid Build Coastguard Worker 826*cda5da8dSAndroid Build Coastguard Worker Calling this from time to time avoids an ever-growing _shutdown_locks 827*cda5da8dSAndroid Build Coastguard Worker set when Thread objects are not joined explicitly. See bpo-37788. 828*cda5da8dSAndroid Build Coastguard Worker 829*cda5da8dSAndroid Build Coastguard Worker This must be called with _shutdown_locks_lock acquired. 830*cda5da8dSAndroid Build Coastguard Worker """ 831*cda5da8dSAndroid Build Coastguard Worker # If a lock was released, the corresponding thread has exited 832*cda5da8dSAndroid Build Coastguard Worker to_remove = [lock for lock in _shutdown_locks if not lock.locked()] 833*cda5da8dSAndroid Build Coastguard Worker _shutdown_locks.difference_update(to_remove) 834*cda5da8dSAndroid Build Coastguard Worker 835*cda5da8dSAndroid Build Coastguard Worker 836*cda5da8dSAndroid Build Coastguard Worker# Main class for threads 837*cda5da8dSAndroid Build Coastguard Worker 838*cda5da8dSAndroid Build Coastguard Workerclass Thread: 839*cda5da8dSAndroid Build Coastguard Worker """A class that represents a thread of control. 840*cda5da8dSAndroid Build Coastguard Worker 841*cda5da8dSAndroid Build Coastguard Worker This class can be safely subclassed in a limited fashion. There are two ways 842*cda5da8dSAndroid Build Coastguard Worker to specify the activity: by passing a callable object to the constructor, or 843*cda5da8dSAndroid Build Coastguard Worker by overriding the run() method in a subclass. 844*cda5da8dSAndroid Build Coastguard Worker 845*cda5da8dSAndroid Build Coastguard Worker """ 846*cda5da8dSAndroid Build Coastguard Worker 847*cda5da8dSAndroid Build Coastguard Worker _initialized = False 848*cda5da8dSAndroid Build Coastguard Worker 849*cda5da8dSAndroid Build Coastguard Worker def __init__(self, group=None, target=None, name=None, 850*cda5da8dSAndroid Build Coastguard Worker args=(), kwargs=None, *, daemon=None): 851*cda5da8dSAndroid Build Coastguard Worker """This constructor should always be called with keyword arguments. Arguments are: 852*cda5da8dSAndroid Build Coastguard Worker 853*cda5da8dSAndroid Build Coastguard Worker *group* should be None; reserved for future extension when a ThreadGroup 854*cda5da8dSAndroid Build Coastguard Worker class is implemented. 855*cda5da8dSAndroid Build Coastguard Worker 856*cda5da8dSAndroid Build Coastguard Worker *target* is the callable object to be invoked by the run() 857*cda5da8dSAndroid Build Coastguard Worker method. Defaults to None, meaning nothing is called. 858*cda5da8dSAndroid Build Coastguard Worker 859*cda5da8dSAndroid Build Coastguard Worker *name* is the thread name. By default, a unique name is constructed of 860*cda5da8dSAndroid Build Coastguard Worker the form "Thread-N" where N is a small decimal number. 861*cda5da8dSAndroid Build Coastguard Worker 862*cda5da8dSAndroid Build Coastguard Worker *args* is a list or tuple of arguments for the target invocation. Defaults to (). 863*cda5da8dSAndroid Build Coastguard Worker 864*cda5da8dSAndroid Build Coastguard Worker *kwargs* is a dictionary of keyword arguments for the target 865*cda5da8dSAndroid Build Coastguard Worker invocation. Defaults to {}. 866*cda5da8dSAndroid Build Coastguard Worker 867*cda5da8dSAndroid Build Coastguard Worker If a subclass overrides the constructor, it must make sure to invoke 868*cda5da8dSAndroid Build Coastguard Worker the base class constructor (Thread.__init__()) before doing anything 869*cda5da8dSAndroid Build Coastguard Worker else to the thread. 870*cda5da8dSAndroid Build Coastguard Worker 871*cda5da8dSAndroid Build Coastguard Worker """ 872*cda5da8dSAndroid Build Coastguard Worker assert group is None, "group argument must be None for now" 873*cda5da8dSAndroid Build Coastguard Worker if kwargs is None: 874*cda5da8dSAndroid Build Coastguard Worker kwargs = {} 875*cda5da8dSAndroid Build Coastguard Worker if name: 876*cda5da8dSAndroid Build Coastguard Worker name = str(name) 877*cda5da8dSAndroid Build Coastguard Worker else: 878*cda5da8dSAndroid Build Coastguard Worker name = _newname("Thread-%d") 879*cda5da8dSAndroid Build Coastguard Worker if target is not None: 880*cda5da8dSAndroid Build Coastguard Worker try: 881*cda5da8dSAndroid Build Coastguard Worker target_name = target.__name__ 882*cda5da8dSAndroid Build Coastguard Worker name += f" ({target_name})" 883*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 884*cda5da8dSAndroid Build Coastguard Worker pass 885*cda5da8dSAndroid Build Coastguard Worker 886*cda5da8dSAndroid Build Coastguard Worker self._target = target 887*cda5da8dSAndroid Build Coastguard Worker self._name = name 888*cda5da8dSAndroid Build Coastguard Worker self._args = args 889*cda5da8dSAndroid Build Coastguard Worker self._kwargs = kwargs 890*cda5da8dSAndroid Build Coastguard Worker if daemon is not None: 891*cda5da8dSAndroid Build Coastguard Worker self._daemonic = daemon 892*cda5da8dSAndroid Build Coastguard Worker else: 893*cda5da8dSAndroid Build Coastguard Worker self._daemonic = current_thread().daemon 894*cda5da8dSAndroid Build Coastguard Worker self._ident = None 895*cda5da8dSAndroid Build Coastguard Worker if _HAVE_THREAD_NATIVE_ID: 896*cda5da8dSAndroid Build Coastguard Worker self._native_id = None 897*cda5da8dSAndroid Build Coastguard Worker self._tstate_lock = None 898*cda5da8dSAndroid Build Coastguard Worker self._started = Event() 899*cda5da8dSAndroid Build Coastguard Worker self._is_stopped = False 900*cda5da8dSAndroid Build Coastguard Worker self._initialized = True 901*cda5da8dSAndroid Build Coastguard Worker # Copy of sys.stderr used by self._invoke_excepthook() 902*cda5da8dSAndroid Build Coastguard Worker self._stderr = _sys.stderr 903*cda5da8dSAndroid Build Coastguard Worker self._invoke_excepthook = _make_invoke_excepthook() 904*cda5da8dSAndroid Build Coastguard Worker # For debugging and _after_fork() 905*cda5da8dSAndroid Build Coastguard Worker _dangling.add(self) 906*cda5da8dSAndroid Build Coastguard Worker 907*cda5da8dSAndroid Build Coastguard Worker def _reset_internal_locks(self, is_alive): 908*cda5da8dSAndroid Build Coastguard Worker # private! Called by _after_fork() to reset our internal locks as 909*cda5da8dSAndroid Build Coastguard Worker # they may be in an invalid state leading to a deadlock or crash. 910*cda5da8dSAndroid Build Coastguard Worker self._started._at_fork_reinit() 911*cda5da8dSAndroid Build Coastguard Worker if is_alive: 912*cda5da8dSAndroid Build Coastguard Worker # bpo-42350: If the fork happens when the thread is already stopped 913*cda5da8dSAndroid Build Coastguard Worker # (ex: after threading._shutdown() has been called), _tstate_lock 914*cda5da8dSAndroid Build Coastguard Worker # is None. Do nothing in this case. 915*cda5da8dSAndroid Build Coastguard Worker if self._tstate_lock is not None: 916*cda5da8dSAndroid Build Coastguard Worker self._tstate_lock._at_fork_reinit() 917*cda5da8dSAndroid Build Coastguard Worker self._tstate_lock.acquire() 918*cda5da8dSAndroid Build Coastguard Worker else: 919*cda5da8dSAndroid Build Coastguard Worker # The thread isn't alive after fork: it doesn't have a tstate 920*cda5da8dSAndroid Build Coastguard Worker # anymore. 921*cda5da8dSAndroid Build Coastguard Worker self._is_stopped = True 922*cda5da8dSAndroid Build Coastguard Worker self._tstate_lock = None 923*cda5da8dSAndroid Build Coastguard Worker 924*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 925*cda5da8dSAndroid Build Coastguard Worker assert self._initialized, "Thread.__init__() was not called" 926*cda5da8dSAndroid Build Coastguard Worker status = "initial" 927*cda5da8dSAndroid Build Coastguard Worker if self._started.is_set(): 928*cda5da8dSAndroid Build Coastguard Worker status = "started" 929*cda5da8dSAndroid Build Coastguard Worker self.is_alive() # easy way to get ._is_stopped set when appropriate 930*cda5da8dSAndroid Build Coastguard Worker if self._is_stopped: 931*cda5da8dSAndroid Build Coastguard Worker status = "stopped" 932*cda5da8dSAndroid Build Coastguard Worker if self._daemonic: 933*cda5da8dSAndroid Build Coastguard Worker status += " daemon" 934*cda5da8dSAndroid Build Coastguard Worker if self._ident is not None: 935*cda5da8dSAndroid Build Coastguard Worker status += " %s" % self._ident 936*cda5da8dSAndroid Build Coastguard Worker return "<%s(%s, %s)>" % (self.__class__.__name__, self._name, status) 937*cda5da8dSAndroid Build Coastguard Worker 938*cda5da8dSAndroid Build Coastguard Worker def start(self): 939*cda5da8dSAndroid Build Coastguard Worker """Start the thread's activity. 940*cda5da8dSAndroid Build Coastguard Worker 941*cda5da8dSAndroid Build Coastguard Worker It must be called at most once per thread object. It arranges for the 942*cda5da8dSAndroid Build Coastguard Worker object's run() method to be invoked in a separate thread of control. 943*cda5da8dSAndroid Build Coastguard Worker 944*cda5da8dSAndroid Build Coastguard Worker This method will raise a RuntimeError if called more than once on the 945*cda5da8dSAndroid Build Coastguard Worker same thread object. 946*cda5da8dSAndroid Build Coastguard Worker 947*cda5da8dSAndroid Build Coastguard Worker """ 948*cda5da8dSAndroid Build Coastguard Worker if not self._initialized: 949*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError("thread.__init__() not called") 950*cda5da8dSAndroid Build Coastguard Worker 951*cda5da8dSAndroid Build Coastguard Worker if self._started.is_set(): 952*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError("threads can only be started once") 953*cda5da8dSAndroid Build Coastguard Worker 954*cda5da8dSAndroid Build Coastguard Worker with _active_limbo_lock: 955*cda5da8dSAndroid Build Coastguard Worker _limbo[self] = self 956*cda5da8dSAndroid Build Coastguard Worker try: 957*cda5da8dSAndroid Build Coastguard Worker _start_new_thread(self._bootstrap, ()) 958*cda5da8dSAndroid Build Coastguard Worker except Exception: 959*cda5da8dSAndroid Build Coastguard Worker with _active_limbo_lock: 960*cda5da8dSAndroid Build Coastguard Worker del _limbo[self] 961*cda5da8dSAndroid Build Coastguard Worker raise 962*cda5da8dSAndroid Build Coastguard Worker self._started.wait() 963*cda5da8dSAndroid Build Coastguard Worker 964*cda5da8dSAndroid Build Coastguard Worker def run(self): 965*cda5da8dSAndroid Build Coastguard Worker """Method representing the thread's activity. 966*cda5da8dSAndroid Build Coastguard Worker 967*cda5da8dSAndroid Build Coastguard Worker You may override this method in a subclass. The standard run() method 968*cda5da8dSAndroid Build Coastguard Worker invokes the callable object passed to the object's constructor as the 969*cda5da8dSAndroid Build Coastguard Worker target argument, if any, with sequential and keyword arguments taken 970*cda5da8dSAndroid Build Coastguard Worker from the args and kwargs arguments, respectively. 971*cda5da8dSAndroid Build Coastguard Worker 972*cda5da8dSAndroid Build Coastguard Worker """ 973*cda5da8dSAndroid Build Coastguard Worker try: 974*cda5da8dSAndroid Build Coastguard Worker if self._target is not None: 975*cda5da8dSAndroid Build Coastguard Worker self._target(*self._args, **self._kwargs) 976*cda5da8dSAndroid Build Coastguard Worker finally: 977*cda5da8dSAndroid Build Coastguard Worker # Avoid a refcycle if the thread is running a function with 978*cda5da8dSAndroid Build Coastguard Worker # an argument that has a member that points to the thread. 979*cda5da8dSAndroid Build Coastguard Worker del self._target, self._args, self._kwargs 980*cda5da8dSAndroid Build Coastguard Worker 981*cda5da8dSAndroid Build Coastguard Worker def _bootstrap(self): 982*cda5da8dSAndroid Build Coastguard Worker # Wrapper around the real bootstrap code that ignores 983*cda5da8dSAndroid Build Coastguard Worker # exceptions during interpreter cleanup. Those typically 984*cda5da8dSAndroid Build Coastguard Worker # happen when a daemon thread wakes up at an unfortunate 985*cda5da8dSAndroid Build Coastguard Worker # moment, finds the world around it destroyed, and raises some 986*cda5da8dSAndroid Build Coastguard Worker # random exception *** while trying to report the exception in 987*cda5da8dSAndroid Build Coastguard Worker # _bootstrap_inner() below ***. Those random exceptions 988*cda5da8dSAndroid Build Coastguard Worker # don't help anybody, and they confuse users, so we suppress 989*cda5da8dSAndroid Build Coastguard Worker # them. We suppress them only when it appears that the world 990*cda5da8dSAndroid Build Coastguard Worker # indeed has already been destroyed, so that exceptions in 991*cda5da8dSAndroid Build Coastguard Worker # _bootstrap_inner() during normal business hours are properly 992*cda5da8dSAndroid Build Coastguard Worker # reported. Also, we only suppress them for daemonic threads; 993*cda5da8dSAndroid Build Coastguard Worker # if a non-daemonic encounters this, something else is wrong. 994*cda5da8dSAndroid Build Coastguard Worker try: 995*cda5da8dSAndroid Build Coastguard Worker self._bootstrap_inner() 996*cda5da8dSAndroid Build Coastguard Worker except: 997*cda5da8dSAndroid Build Coastguard Worker if self._daemonic and _sys is None: 998*cda5da8dSAndroid Build Coastguard Worker return 999*cda5da8dSAndroid Build Coastguard Worker raise 1000*cda5da8dSAndroid Build Coastguard Worker 1001*cda5da8dSAndroid Build Coastguard Worker def _set_ident(self): 1002*cda5da8dSAndroid Build Coastguard Worker self._ident = get_ident() 1003*cda5da8dSAndroid Build Coastguard Worker 1004*cda5da8dSAndroid Build Coastguard Worker if _HAVE_THREAD_NATIVE_ID: 1005*cda5da8dSAndroid Build Coastguard Worker def _set_native_id(self): 1006*cda5da8dSAndroid Build Coastguard Worker self._native_id = get_native_id() 1007*cda5da8dSAndroid Build Coastguard Worker 1008*cda5da8dSAndroid Build Coastguard Worker def _set_tstate_lock(self): 1009*cda5da8dSAndroid Build Coastguard Worker """ 1010*cda5da8dSAndroid Build Coastguard Worker Set a lock object which will be released by the interpreter when 1011*cda5da8dSAndroid Build Coastguard Worker the underlying thread state (see pystate.h) gets deleted. 1012*cda5da8dSAndroid Build Coastguard Worker """ 1013*cda5da8dSAndroid Build Coastguard Worker self._tstate_lock = _set_sentinel() 1014*cda5da8dSAndroid Build Coastguard Worker self._tstate_lock.acquire() 1015*cda5da8dSAndroid Build Coastguard Worker 1016*cda5da8dSAndroid Build Coastguard Worker if not self.daemon: 1017*cda5da8dSAndroid Build Coastguard Worker with _shutdown_locks_lock: 1018*cda5da8dSAndroid Build Coastguard Worker _maintain_shutdown_locks() 1019*cda5da8dSAndroid Build Coastguard Worker _shutdown_locks.add(self._tstate_lock) 1020*cda5da8dSAndroid Build Coastguard Worker 1021*cda5da8dSAndroid Build Coastguard Worker def _bootstrap_inner(self): 1022*cda5da8dSAndroid Build Coastguard Worker try: 1023*cda5da8dSAndroid Build Coastguard Worker self._set_ident() 1024*cda5da8dSAndroid Build Coastguard Worker self._set_tstate_lock() 1025*cda5da8dSAndroid Build Coastguard Worker if _HAVE_THREAD_NATIVE_ID: 1026*cda5da8dSAndroid Build Coastguard Worker self._set_native_id() 1027*cda5da8dSAndroid Build Coastguard Worker self._started.set() 1028*cda5da8dSAndroid Build Coastguard Worker with _active_limbo_lock: 1029*cda5da8dSAndroid Build Coastguard Worker _active[self._ident] = self 1030*cda5da8dSAndroid Build Coastguard Worker del _limbo[self] 1031*cda5da8dSAndroid Build Coastguard Worker 1032*cda5da8dSAndroid Build Coastguard Worker if _trace_hook: 1033*cda5da8dSAndroid Build Coastguard Worker _sys.settrace(_trace_hook) 1034*cda5da8dSAndroid Build Coastguard Worker if _profile_hook: 1035*cda5da8dSAndroid Build Coastguard Worker _sys.setprofile(_profile_hook) 1036*cda5da8dSAndroid Build Coastguard Worker 1037*cda5da8dSAndroid Build Coastguard Worker try: 1038*cda5da8dSAndroid Build Coastguard Worker self.run() 1039*cda5da8dSAndroid Build Coastguard Worker except: 1040*cda5da8dSAndroid Build Coastguard Worker self._invoke_excepthook(self) 1041*cda5da8dSAndroid Build Coastguard Worker finally: 1042*cda5da8dSAndroid Build Coastguard Worker self._delete() 1043*cda5da8dSAndroid Build Coastguard Worker 1044*cda5da8dSAndroid Build Coastguard Worker def _stop(self): 1045*cda5da8dSAndroid Build Coastguard Worker # After calling ._stop(), .is_alive() returns False and .join() returns 1046*cda5da8dSAndroid Build Coastguard Worker # immediately. ._tstate_lock must be released before calling ._stop(). 1047*cda5da8dSAndroid Build Coastguard Worker # 1048*cda5da8dSAndroid Build Coastguard Worker # Normal case: C code at the end of the thread's life 1049*cda5da8dSAndroid Build Coastguard Worker # (release_sentinel in _threadmodule.c) releases ._tstate_lock, and 1050*cda5da8dSAndroid Build Coastguard Worker # that's detected by our ._wait_for_tstate_lock(), called by .join() 1051*cda5da8dSAndroid Build Coastguard Worker # and .is_alive(). Any number of threads _may_ call ._stop() 1052*cda5da8dSAndroid Build Coastguard Worker # simultaneously (for example, if multiple threads are blocked in 1053*cda5da8dSAndroid Build Coastguard Worker # .join() calls), and they're not serialized. That's harmless - 1054*cda5da8dSAndroid Build Coastguard Worker # they'll just make redundant rebindings of ._is_stopped and 1055*cda5da8dSAndroid Build Coastguard Worker # ._tstate_lock. Obscure: we rebind ._tstate_lock last so that the 1056*cda5da8dSAndroid Build Coastguard Worker # "assert self._is_stopped" in ._wait_for_tstate_lock() always works 1057*cda5da8dSAndroid Build Coastguard Worker # (the assert is executed only if ._tstate_lock is None). 1058*cda5da8dSAndroid Build Coastguard Worker # 1059*cda5da8dSAndroid Build Coastguard Worker # Special case: _main_thread releases ._tstate_lock via this 1060*cda5da8dSAndroid Build Coastguard Worker # module's _shutdown() function. 1061*cda5da8dSAndroid Build Coastguard Worker lock = self._tstate_lock 1062*cda5da8dSAndroid Build Coastguard Worker if lock is not None: 1063*cda5da8dSAndroid Build Coastguard Worker assert not lock.locked() 1064*cda5da8dSAndroid Build Coastguard Worker self._is_stopped = True 1065*cda5da8dSAndroid Build Coastguard Worker self._tstate_lock = None 1066*cda5da8dSAndroid Build Coastguard Worker if not self.daemon: 1067*cda5da8dSAndroid Build Coastguard Worker with _shutdown_locks_lock: 1068*cda5da8dSAndroid Build Coastguard Worker # Remove our lock and other released locks from _shutdown_locks 1069*cda5da8dSAndroid Build Coastguard Worker _maintain_shutdown_locks() 1070*cda5da8dSAndroid Build Coastguard Worker 1071*cda5da8dSAndroid Build Coastguard Worker def _delete(self): 1072*cda5da8dSAndroid Build Coastguard Worker "Remove current thread from the dict of currently running threads." 1073*cda5da8dSAndroid Build Coastguard Worker with _active_limbo_lock: 1074*cda5da8dSAndroid Build Coastguard Worker del _active[get_ident()] 1075*cda5da8dSAndroid Build Coastguard Worker # There must not be any python code between the previous line 1076*cda5da8dSAndroid Build Coastguard Worker # and after the lock is released. Otherwise a tracing function 1077*cda5da8dSAndroid Build Coastguard Worker # could try to acquire the lock again in the same thread, (in 1078*cda5da8dSAndroid Build Coastguard Worker # current_thread()), and would block. 1079*cda5da8dSAndroid Build Coastguard Worker 1080*cda5da8dSAndroid Build Coastguard Worker def join(self, timeout=None): 1081*cda5da8dSAndroid Build Coastguard Worker """Wait until the thread terminates. 1082*cda5da8dSAndroid Build Coastguard Worker 1083*cda5da8dSAndroid Build Coastguard Worker This blocks the calling thread until the thread whose join() method is 1084*cda5da8dSAndroid Build Coastguard Worker called terminates -- either normally or through an unhandled exception 1085*cda5da8dSAndroid Build Coastguard Worker or until the optional timeout occurs. 1086*cda5da8dSAndroid Build Coastguard Worker 1087*cda5da8dSAndroid Build Coastguard Worker When the timeout argument is present and not None, it should be a 1088*cda5da8dSAndroid Build Coastguard Worker floating point number specifying a timeout for the operation in seconds 1089*cda5da8dSAndroid Build Coastguard Worker (or fractions thereof). As join() always returns None, you must call 1090*cda5da8dSAndroid Build Coastguard Worker is_alive() after join() to decide whether a timeout happened -- if the 1091*cda5da8dSAndroid Build Coastguard Worker thread is still alive, the join() call timed out. 1092*cda5da8dSAndroid Build Coastguard Worker 1093*cda5da8dSAndroid Build Coastguard Worker When the timeout argument is not present or None, the operation will 1094*cda5da8dSAndroid Build Coastguard Worker block until the thread terminates. 1095*cda5da8dSAndroid Build Coastguard Worker 1096*cda5da8dSAndroid Build Coastguard Worker A thread can be join()ed many times. 1097*cda5da8dSAndroid Build Coastguard Worker 1098*cda5da8dSAndroid Build Coastguard Worker join() raises a RuntimeError if an attempt is made to join the current 1099*cda5da8dSAndroid Build Coastguard Worker thread as that would cause a deadlock. It is also an error to join() a 1100*cda5da8dSAndroid Build Coastguard Worker thread before it has been started and attempts to do so raises the same 1101*cda5da8dSAndroid Build Coastguard Worker exception. 1102*cda5da8dSAndroid Build Coastguard Worker 1103*cda5da8dSAndroid Build Coastguard Worker """ 1104*cda5da8dSAndroid Build Coastguard Worker if not self._initialized: 1105*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError("Thread.__init__() not called") 1106*cda5da8dSAndroid Build Coastguard Worker if not self._started.is_set(): 1107*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError("cannot join thread before it is started") 1108*cda5da8dSAndroid Build Coastguard Worker if self is current_thread(): 1109*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError("cannot join current thread") 1110*cda5da8dSAndroid Build Coastguard Worker 1111*cda5da8dSAndroid Build Coastguard Worker if timeout is None: 1112*cda5da8dSAndroid Build Coastguard Worker self._wait_for_tstate_lock() 1113*cda5da8dSAndroid Build Coastguard Worker else: 1114*cda5da8dSAndroid Build Coastguard Worker # the behavior of a negative timeout isn't documented, but 1115*cda5da8dSAndroid Build Coastguard Worker # historically .join(timeout=x) for x<0 has acted as if timeout=0 1116*cda5da8dSAndroid Build Coastguard Worker self._wait_for_tstate_lock(timeout=max(timeout, 0)) 1117*cda5da8dSAndroid Build Coastguard Worker 1118*cda5da8dSAndroid Build Coastguard Worker def _wait_for_tstate_lock(self, block=True, timeout=-1): 1119*cda5da8dSAndroid Build Coastguard Worker # Issue #18808: wait for the thread state to be gone. 1120*cda5da8dSAndroid Build Coastguard Worker # At the end of the thread's life, after all knowledge of the thread 1121*cda5da8dSAndroid Build Coastguard Worker # is removed from C data structures, C code releases our _tstate_lock. 1122*cda5da8dSAndroid Build Coastguard Worker # This method passes its arguments to _tstate_lock.acquire(). 1123*cda5da8dSAndroid Build Coastguard Worker # If the lock is acquired, the C code is done, and self._stop() is 1124*cda5da8dSAndroid Build Coastguard Worker # called. That sets ._is_stopped to True, and ._tstate_lock to None. 1125*cda5da8dSAndroid Build Coastguard Worker lock = self._tstate_lock 1126*cda5da8dSAndroid Build Coastguard Worker if lock is None: 1127*cda5da8dSAndroid Build Coastguard Worker # already determined that the C code is done 1128*cda5da8dSAndroid Build Coastguard Worker assert self._is_stopped 1129*cda5da8dSAndroid Build Coastguard Worker return 1130*cda5da8dSAndroid Build Coastguard Worker 1131*cda5da8dSAndroid Build Coastguard Worker try: 1132*cda5da8dSAndroid Build Coastguard Worker if lock.acquire(block, timeout): 1133*cda5da8dSAndroid Build Coastguard Worker lock.release() 1134*cda5da8dSAndroid Build Coastguard Worker self._stop() 1135*cda5da8dSAndroid Build Coastguard Worker except: 1136*cda5da8dSAndroid Build Coastguard Worker if lock.locked(): 1137*cda5da8dSAndroid Build Coastguard Worker # bpo-45274: lock.acquire() acquired the lock, but the function 1138*cda5da8dSAndroid Build Coastguard Worker # was interrupted with an exception before reaching the 1139*cda5da8dSAndroid Build Coastguard Worker # lock.release(). It can happen if a signal handler raises an 1140*cda5da8dSAndroid Build Coastguard Worker # exception, like CTRL+C which raises KeyboardInterrupt. 1141*cda5da8dSAndroid Build Coastguard Worker lock.release() 1142*cda5da8dSAndroid Build Coastguard Worker self._stop() 1143*cda5da8dSAndroid Build Coastguard Worker raise 1144*cda5da8dSAndroid Build Coastguard Worker 1145*cda5da8dSAndroid Build Coastguard Worker @property 1146*cda5da8dSAndroid Build Coastguard Worker def name(self): 1147*cda5da8dSAndroid Build Coastguard Worker """A string used for identification purposes only. 1148*cda5da8dSAndroid Build Coastguard Worker 1149*cda5da8dSAndroid Build Coastguard Worker It has no semantics. Multiple threads may be given the same name. The 1150*cda5da8dSAndroid Build Coastguard Worker initial name is set by the constructor. 1151*cda5da8dSAndroid Build Coastguard Worker 1152*cda5da8dSAndroid Build Coastguard Worker """ 1153*cda5da8dSAndroid Build Coastguard Worker assert self._initialized, "Thread.__init__() not called" 1154*cda5da8dSAndroid Build Coastguard Worker return self._name 1155*cda5da8dSAndroid Build Coastguard Worker 1156*cda5da8dSAndroid Build Coastguard Worker @name.setter 1157*cda5da8dSAndroid Build Coastguard Worker def name(self, name): 1158*cda5da8dSAndroid Build Coastguard Worker assert self._initialized, "Thread.__init__() not called" 1159*cda5da8dSAndroid Build Coastguard Worker self._name = str(name) 1160*cda5da8dSAndroid Build Coastguard Worker 1161*cda5da8dSAndroid Build Coastguard Worker @property 1162*cda5da8dSAndroid Build Coastguard Worker def ident(self): 1163*cda5da8dSAndroid Build Coastguard Worker """Thread identifier of this thread or None if it has not been started. 1164*cda5da8dSAndroid Build Coastguard Worker 1165*cda5da8dSAndroid Build Coastguard Worker This is a nonzero integer. See the get_ident() function. Thread 1166*cda5da8dSAndroid Build Coastguard Worker identifiers may be recycled when a thread exits and another thread is 1167*cda5da8dSAndroid Build Coastguard Worker created. The identifier is available even after the thread has exited. 1168*cda5da8dSAndroid Build Coastguard Worker 1169*cda5da8dSAndroid Build Coastguard Worker """ 1170*cda5da8dSAndroid Build Coastguard Worker assert self._initialized, "Thread.__init__() not called" 1171*cda5da8dSAndroid Build Coastguard Worker return self._ident 1172*cda5da8dSAndroid Build Coastguard Worker 1173*cda5da8dSAndroid Build Coastguard Worker if _HAVE_THREAD_NATIVE_ID: 1174*cda5da8dSAndroid Build Coastguard Worker @property 1175*cda5da8dSAndroid Build Coastguard Worker def native_id(self): 1176*cda5da8dSAndroid Build Coastguard Worker """Native integral thread ID of this thread, or None if it has not been started. 1177*cda5da8dSAndroid Build Coastguard Worker 1178*cda5da8dSAndroid Build Coastguard Worker This is a non-negative integer. See the get_native_id() function. 1179*cda5da8dSAndroid Build Coastguard Worker This represents the Thread ID as reported by the kernel. 1180*cda5da8dSAndroid Build Coastguard Worker 1181*cda5da8dSAndroid Build Coastguard Worker """ 1182*cda5da8dSAndroid Build Coastguard Worker assert self._initialized, "Thread.__init__() not called" 1183*cda5da8dSAndroid Build Coastguard Worker return self._native_id 1184*cda5da8dSAndroid Build Coastguard Worker 1185*cda5da8dSAndroid Build Coastguard Worker def is_alive(self): 1186*cda5da8dSAndroid Build Coastguard Worker """Return whether the thread is alive. 1187*cda5da8dSAndroid Build Coastguard Worker 1188*cda5da8dSAndroid Build Coastguard Worker This method returns True just before the run() method starts until just 1189*cda5da8dSAndroid Build Coastguard Worker after the run() method terminates. See also the module function 1190*cda5da8dSAndroid Build Coastguard Worker enumerate(). 1191*cda5da8dSAndroid Build Coastguard Worker 1192*cda5da8dSAndroid Build Coastguard Worker """ 1193*cda5da8dSAndroid Build Coastguard Worker assert self._initialized, "Thread.__init__() not called" 1194*cda5da8dSAndroid Build Coastguard Worker if self._is_stopped or not self._started.is_set(): 1195*cda5da8dSAndroid Build Coastguard Worker return False 1196*cda5da8dSAndroid Build Coastguard Worker self._wait_for_tstate_lock(False) 1197*cda5da8dSAndroid Build Coastguard Worker return not self._is_stopped 1198*cda5da8dSAndroid Build Coastguard Worker 1199*cda5da8dSAndroid Build Coastguard Worker @property 1200*cda5da8dSAndroid Build Coastguard Worker def daemon(self): 1201*cda5da8dSAndroid Build Coastguard Worker """A boolean value indicating whether this thread is a daemon thread. 1202*cda5da8dSAndroid Build Coastguard Worker 1203*cda5da8dSAndroid Build Coastguard Worker This must be set before start() is called, otherwise RuntimeError is 1204*cda5da8dSAndroid Build Coastguard Worker raised. Its initial value is inherited from the creating thread; the 1205*cda5da8dSAndroid Build Coastguard Worker main thread is not a daemon thread and therefore all threads created in 1206*cda5da8dSAndroid Build Coastguard Worker the main thread default to daemon = False. 1207*cda5da8dSAndroid Build Coastguard Worker 1208*cda5da8dSAndroid Build Coastguard Worker The entire Python program exits when only daemon threads are left. 1209*cda5da8dSAndroid Build Coastguard Worker 1210*cda5da8dSAndroid Build Coastguard Worker """ 1211*cda5da8dSAndroid Build Coastguard Worker assert self._initialized, "Thread.__init__() not called" 1212*cda5da8dSAndroid Build Coastguard Worker return self._daemonic 1213*cda5da8dSAndroid Build Coastguard Worker 1214*cda5da8dSAndroid Build Coastguard Worker @daemon.setter 1215*cda5da8dSAndroid Build Coastguard Worker def daemon(self, daemonic): 1216*cda5da8dSAndroid Build Coastguard Worker if not self._initialized: 1217*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError("Thread.__init__() not called") 1218*cda5da8dSAndroid Build Coastguard Worker if self._started.is_set(): 1219*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError("cannot set daemon status of active thread") 1220*cda5da8dSAndroid Build Coastguard Worker self._daemonic = daemonic 1221*cda5da8dSAndroid Build Coastguard Worker 1222*cda5da8dSAndroid Build Coastguard Worker def isDaemon(self): 1223*cda5da8dSAndroid Build Coastguard Worker """Return whether this thread is a daemon. 1224*cda5da8dSAndroid Build Coastguard Worker 1225*cda5da8dSAndroid Build Coastguard Worker This method is deprecated, use the daemon attribute instead. 1226*cda5da8dSAndroid Build Coastguard Worker 1227*cda5da8dSAndroid Build Coastguard Worker """ 1228*cda5da8dSAndroid Build Coastguard Worker import warnings 1229*cda5da8dSAndroid Build Coastguard Worker warnings.warn('isDaemon() is deprecated, get the daemon attribute instead', 1230*cda5da8dSAndroid Build Coastguard Worker DeprecationWarning, stacklevel=2) 1231*cda5da8dSAndroid Build Coastguard Worker return self.daemon 1232*cda5da8dSAndroid Build Coastguard Worker 1233*cda5da8dSAndroid Build Coastguard Worker def setDaemon(self, daemonic): 1234*cda5da8dSAndroid Build Coastguard Worker """Set whether this thread is a daemon. 1235*cda5da8dSAndroid Build Coastguard Worker 1236*cda5da8dSAndroid Build Coastguard Worker This method is deprecated, use the .daemon property instead. 1237*cda5da8dSAndroid Build Coastguard Worker 1238*cda5da8dSAndroid Build Coastguard Worker """ 1239*cda5da8dSAndroid Build Coastguard Worker import warnings 1240*cda5da8dSAndroid Build Coastguard Worker warnings.warn('setDaemon() is deprecated, set the daemon attribute instead', 1241*cda5da8dSAndroid Build Coastguard Worker DeprecationWarning, stacklevel=2) 1242*cda5da8dSAndroid Build Coastguard Worker self.daemon = daemonic 1243*cda5da8dSAndroid Build Coastguard Worker 1244*cda5da8dSAndroid Build Coastguard Worker def getName(self): 1245*cda5da8dSAndroid Build Coastguard Worker """Return a string used for identification purposes only. 1246*cda5da8dSAndroid Build Coastguard Worker 1247*cda5da8dSAndroid Build Coastguard Worker This method is deprecated, use the name attribute instead. 1248*cda5da8dSAndroid Build Coastguard Worker 1249*cda5da8dSAndroid Build Coastguard Worker """ 1250*cda5da8dSAndroid Build Coastguard Worker import warnings 1251*cda5da8dSAndroid Build Coastguard Worker warnings.warn('getName() is deprecated, get the name attribute instead', 1252*cda5da8dSAndroid Build Coastguard Worker DeprecationWarning, stacklevel=2) 1253*cda5da8dSAndroid Build Coastguard Worker return self.name 1254*cda5da8dSAndroid Build Coastguard Worker 1255*cda5da8dSAndroid Build Coastguard Worker def setName(self, name): 1256*cda5da8dSAndroid Build Coastguard Worker """Set the name string for this thread. 1257*cda5da8dSAndroid Build Coastguard Worker 1258*cda5da8dSAndroid Build Coastguard Worker This method is deprecated, use the name attribute instead. 1259*cda5da8dSAndroid Build Coastguard Worker 1260*cda5da8dSAndroid Build Coastguard Worker """ 1261*cda5da8dSAndroid Build Coastguard Worker import warnings 1262*cda5da8dSAndroid Build Coastguard Worker warnings.warn('setName() is deprecated, set the name attribute instead', 1263*cda5da8dSAndroid Build Coastguard Worker DeprecationWarning, stacklevel=2) 1264*cda5da8dSAndroid Build Coastguard Worker self.name = name 1265*cda5da8dSAndroid Build Coastguard Worker 1266*cda5da8dSAndroid Build Coastguard Worker 1267*cda5da8dSAndroid Build Coastguard Workertry: 1268*cda5da8dSAndroid Build Coastguard Worker from _thread import (_excepthook as excepthook, 1269*cda5da8dSAndroid Build Coastguard Worker _ExceptHookArgs as ExceptHookArgs) 1270*cda5da8dSAndroid Build Coastguard Workerexcept ImportError: 1271*cda5da8dSAndroid Build Coastguard Worker # Simple Python implementation if _thread._excepthook() is not available 1272*cda5da8dSAndroid Build Coastguard Worker from traceback import print_exception as _print_exception 1273*cda5da8dSAndroid Build Coastguard Worker from collections import namedtuple 1274*cda5da8dSAndroid Build Coastguard Worker 1275*cda5da8dSAndroid Build Coastguard Worker _ExceptHookArgs = namedtuple( 1276*cda5da8dSAndroid Build Coastguard Worker 'ExceptHookArgs', 1277*cda5da8dSAndroid Build Coastguard Worker 'exc_type exc_value exc_traceback thread') 1278*cda5da8dSAndroid Build Coastguard Worker 1279*cda5da8dSAndroid Build Coastguard Worker def ExceptHookArgs(args): 1280*cda5da8dSAndroid Build Coastguard Worker return _ExceptHookArgs(*args) 1281*cda5da8dSAndroid Build Coastguard Worker 1282*cda5da8dSAndroid Build Coastguard Worker def excepthook(args, /): 1283*cda5da8dSAndroid Build Coastguard Worker """ 1284*cda5da8dSAndroid Build Coastguard Worker Handle uncaught Thread.run() exception. 1285*cda5da8dSAndroid Build Coastguard Worker """ 1286*cda5da8dSAndroid Build Coastguard Worker if args.exc_type == SystemExit: 1287*cda5da8dSAndroid Build Coastguard Worker # silently ignore SystemExit 1288*cda5da8dSAndroid Build Coastguard Worker return 1289*cda5da8dSAndroid Build Coastguard Worker 1290*cda5da8dSAndroid Build Coastguard Worker if _sys is not None and _sys.stderr is not None: 1291*cda5da8dSAndroid Build Coastguard Worker stderr = _sys.stderr 1292*cda5da8dSAndroid Build Coastguard Worker elif args.thread is not None: 1293*cda5da8dSAndroid Build Coastguard Worker stderr = args.thread._stderr 1294*cda5da8dSAndroid Build Coastguard Worker if stderr is None: 1295*cda5da8dSAndroid Build Coastguard Worker # do nothing if sys.stderr is None and sys.stderr was None 1296*cda5da8dSAndroid Build Coastguard Worker # when the thread was created 1297*cda5da8dSAndroid Build Coastguard Worker return 1298*cda5da8dSAndroid Build Coastguard Worker else: 1299*cda5da8dSAndroid Build Coastguard Worker # do nothing if sys.stderr is None and args.thread is None 1300*cda5da8dSAndroid Build Coastguard Worker return 1301*cda5da8dSAndroid Build Coastguard Worker 1302*cda5da8dSAndroid Build Coastguard Worker if args.thread is not None: 1303*cda5da8dSAndroid Build Coastguard Worker name = args.thread.name 1304*cda5da8dSAndroid Build Coastguard Worker else: 1305*cda5da8dSAndroid Build Coastguard Worker name = get_ident() 1306*cda5da8dSAndroid Build Coastguard Worker print(f"Exception in thread {name}:", 1307*cda5da8dSAndroid Build Coastguard Worker file=stderr, flush=True) 1308*cda5da8dSAndroid Build Coastguard Worker _print_exception(args.exc_type, args.exc_value, args.exc_traceback, 1309*cda5da8dSAndroid Build Coastguard Worker file=stderr) 1310*cda5da8dSAndroid Build Coastguard Worker stderr.flush() 1311*cda5da8dSAndroid Build Coastguard Worker 1312*cda5da8dSAndroid Build Coastguard Worker 1313*cda5da8dSAndroid Build Coastguard Worker# Original value of threading.excepthook 1314*cda5da8dSAndroid Build Coastguard Worker__excepthook__ = excepthook 1315*cda5da8dSAndroid Build Coastguard Worker 1316*cda5da8dSAndroid Build Coastguard Worker 1317*cda5da8dSAndroid Build Coastguard Workerdef _make_invoke_excepthook(): 1318*cda5da8dSAndroid Build Coastguard Worker # Create a local namespace to ensure that variables remain alive 1319*cda5da8dSAndroid Build Coastguard Worker # when _invoke_excepthook() is called, even if it is called late during 1320*cda5da8dSAndroid Build Coastguard Worker # Python shutdown. It is mostly needed for daemon threads. 1321*cda5da8dSAndroid Build Coastguard Worker 1322*cda5da8dSAndroid Build Coastguard Worker old_excepthook = excepthook 1323*cda5da8dSAndroid Build Coastguard Worker old_sys_excepthook = _sys.excepthook 1324*cda5da8dSAndroid Build Coastguard Worker if old_excepthook is None: 1325*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError("threading.excepthook is None") 1326*cda5da8dSAndroid Build Coastguard Worker if old_sys_excepthook is None: 1327*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError("sys.excepthook is None") 1328*cda5da8dSAndroid Build Coastguard Worker 1329*cda5da8dSAndroid Build Coastguard Worker sys_exc_info = _sys.exc_info 1330*cda5da8dSAndroid Build Coastguard Worker local_print = print 1331*cda5da8dSAndroid Build Coastguard Worker local_sys = _sys 1332*cda5da8dSAndroid Build Coastguard Worker 1333*cda5da8dSAndroid Build Coastguard Worker def invoke_excepthook(thread): 1334*cda5da8dSAndroid Build Coastguard Worker global excepthook 1335*cda5da8dSAndroid Build Coastguard Worker try: 1336*cda5da8dSAndroid Build Coastguard Worker hook = excepthook 1337*cda5da8dSAndroid Build Coastguard Worker if hook is None: 1338*cda5da8dSAndroid Build Coastguard Worker hook = old_excepthook 1339*cda5da8dSAndroid Build Coastguard Worker 1340*cda5da8dSAndroid Build Coastguard Worker args = ExceptHookArgs([*sys_exc_info(), thread]) 1341*cda5da8dSAndroid Build Coastguard Worker 1342*cda5da8dSAndroid Build Coastguard Worker hook(args) 1343*cda5da8dSAndroid Build Coastguard Worker except Exception as exc: 1344*cda5da8dSAndroid Build Coastguard Worker exc.__suppress_context__ = True 1345*cda5da8dSAndroid Build Coastguard Worker del exc 1346*cda5da8dSAndroid Build Coastguard Worker 1347*cda5da8dSAndroid Build Coastguard Worker if local_sys is not None and local_sys.stderr is not None: 1348*cda5da8dSAndroid Build Coastguard Worker stderr = local_sys.stderr 1349*cda5da8dSAndroid Build Coastguard Worker else: 1350*cda5da8dSAndroid Build Coastguard Worker stderr = thread._stderr 1351*cda5da8dSAndroid Build Coastguard Worker 1352*cda5da8dSAndroid Build Coastguard Worker local_print("Exception in threading.excepthook:", 1353*cda5da8dSAndroid Build Coastguard Worker file=stderr, flush=True) 1354*cda5da8dSAndroid Build Coastguard Worker 1355*cda5da8dSAndroid Build Coastguard Worker if local_sys is not None and local_sys.excepthook is not None: 1356*cda5da8dSAndroid Build Coastguard Worker sys_excepthook = local_sys.excepthook 1357*cda5da8dSAndroid Build Coastguard Worker else: 1358*cda5da8dSAndroid Build Coastguard Worker sys_excepthook = old_sys_excepthook 1359*cda5da8dSAndroid Build Coastguard Worker 1360*cda5da8dSAndroid Build Coastguard Worker sys_excepthook(*sys_exc_info()) 1361*cda5da8dSAndroid Build Coastguard Worker finally: 1362*cda5da8dSAndroid Build Coastguard Worker # Break reference cycle (exception stored in a variable) 1363*cda5da8dSAndroid Build Coastguard Worker args = None 1364*cda5da8dSAndroid Build Coastguard Worker 1365*cda5da8dSAndroid Build Coastguard Worker return invoke_excepthook 1366*cda5da8dSAndroid Build Coastguard Worker 1367*cda5da8dSAndroid Build Coastguard Worker 1368*cda5da8dSAndroid Build Coastguard Worker# The timer class was contributed by Itamar Shtull-Trauring 1369*cda5da8dSAndroid Build Coastguard Worker 1370*cda5da8dSAndroid Build Coastguard Workerclass Timer(Thread): 1371*cda5da8dSAndroid Build Coastguard Worker """Call a function after a specified number of seconds: 1372*cda5da8dSAndroid Build Coastguard Worker 1373*cda5da8dSAndroid Build Coastguard Worker t = Timer(30.0, f, args=None, kwargs=None) 1374*cda5da8dSAndroid Build Coastguard Worker t.start() 1375*cda5da8dSAndroid Build Coastguard Worker t.cancel() # stop the timer's action if it's still waiting 1376*cda5da8dSAndroid Build Coastguard Worker 1377*cda5da8dSAndroid Build Coastguard Worker """ 1378*cda5da8dSAndroid Build Coastguard Worker 1379*cda5da8dSAndroid Build Coastguard Worker def __init__(self, interval, function, args=None, kwargs=None): 1380*cda5da8dSAndroid Build Coastguard Worker Thread.__init__(self) 1381*cda5da8dSAndroid Build Coastguard Worker self.interval = interval 1382*cda5da8dSAndroid Build Coastguard Worker self.function = function 1383*cda5da8dSAndroid Build Coastguard Worker self.args = args if args is not None else [] 1384*cda5da8dSAndroid Build Coastguard Worker self.kwargs = kwargs if kwargs is not None else {} 1385*cda5da8dSAndroid Build Coastguard Worker self.finished = Event() 1386*cda5da8dSAndroid Build Coastguard Worker 1387*cda5da8dSAndroid Build Coastguard Worker def cancel(self): 1388*cda5da8dSAndroid Build Coastguard Worker """Stop the timer if it hasn't finished yet.""" 1389*cda5da8dSAndroid Build Coastguard Worker self.finished.set() 1390*cda5da8dSAndroid Build Coastguard Worker 1391*cda5da8dSAndroid Build Coastguard Worker def run(self): 1392*cda5da8dSAndroid Build Coastguard Worker self.finished.wait(self.interval) 1393*cda5da8dSAndroid Build Coastguard Worker if not self.finished.is_set(): 1394*cda5da8dSAndroid Build Coastguard Worker self.function(*self.args, **self.kwargs) 1395*cda5da8dSAndroid Build Coastguard Worker self.finished.set() 1396*cda5da8dSAndroid Build Coastguard Worker 1397*cda5da8dSAndroid Build Coastguard Worker 1398*cda5da8dSAndroid Build Coastguard Worker# Special thread class to represent the main thread 1399*cda5da8dSAndroid Build Coastguard Worker 1400*cda5da8dSAndroid Build Coastguard Workerclass _MainThread(Thread): 1401*cda5da8dSAndroid Build Coastguard Worker 1402*cda5da8dSAndroid Build Coastguard Worker def __init__(self): 1403*cda5da8dSAndroid Build Coastguard Worker Thread.__init__(self, name="MainThread", daemon=False) 1404*cda5da8dSAndroid Build Coastguard Worker self._set_tstate_lock() 1405*cda5da8dSAndroid Build Coastguard Worker self._started.set() 1406*cda5da8dSAndroid Build Coastguard Worker self._set_ident() 1407*cda5da8dSAndroid Build Coastguard Worker if _HAVE_THREAD_NATIVE_ID: 1408*cda5da8dSAndroid Build Coastguard Worker self._set_native_id() 1409*cda5da8dSAndroid Build Coastguard Worker with _active_limbo_lock: 1410*cda5da8dSAndroid Build Coastguard Worker _active[self._ident] = self 1411*cda5da8dSAndroid Build Coastguard Worker 1412*cda5da8dSAndroid Build Coastguard Worker 1413*cda5da8dSAndroid Build Coastguard Worker# Dummy thread class to represent threads not started here. 1414*cda5da8dSAndroid Build Coastguard Worker# These aren't garbage collected when they die, nor can they be waited for. 1415*cda5da8dSAndroid Build Coastguard Worker# If they invoke anything in threading.py that calls current_thread(), they 1416*cda5da8dSAndroid Build Coastguard Worker# leave an entry in the _active dict forever after. 1417*cda5da8dSAndroid Build Coastguard Worker# Their purpose is to return *something* from current_thread(). 1418*cda5da8dSAndroid Build Coastguard Worker# They are marked as daemon threads so we won't wait for them 1419*cda5da8dSAndroid Build Coastguard Worker# when we exit (conform previous semantics). 1420*cda5da8dSAndroid Build Coastguard Worker 1421*cda5da8dSAndroid Build Coastguard Workerclass _DummyThread(Thread): 1422*cda5da8dSAndroid Build Coastguard Worker 1423*cda5da8dSAndroid Build Coastguard Worker def __init__(self): 1424*cda5da8dSAndroid Build Coastguard Worker Thread.__init__(self, name=_newname("Dummy-%d"), daemon=True) 1425*cda5da8dSAndroid Build Coastguard Worker 1426*cda5da8dSAndroid Build Coastguard Worker self._started.set() 1427*cda5da8dSAndroid Build Coastguard Worker self._set_ident() 1428*cda5da8dSAndroid Build Coastguard Worker if _HAVE_THREAD_NATIVE_ID: 1429*cda5da8dSAndroid Build Coastguard Worker self._set_native_id() 1430*cda5da8dSAndroid Build Coastguard Worker with _active_limbo_lock: 1431*cda5da8dSAndroid Build Coastguard Worker _active[self._ident] = self 1432*cda5da8dSAndroid Build Coastguard Worker 1433*cda5da8dSAndroid Build Coastguard Worker def _stop(self): 1434*cda5da8dSAndroid Build Coastguard Worker pass 1435*cda5da8dSAndroid Build Coastguard Worker 1436*cda5da8dSAndroid Build Coastguard Worker def is_alive(self): 1437*cda5da8dSAndroid Build Coastguard Worker assert not self._is_stopped and self._started.is_set() 1438*cda5da8dSAndroid Build Coastguard Worker return True 1439*cda5da8dSAndroid Build Coastguard Worker 1440*cda5da8dSAndroid Build Coastguard Worker def join(self, timeout=None): 1441*cda5da8dSAndroid Build Coastguard Worker assert False, "cannot join a dummy thread" 1442*cda5da8dSAndroid Build Coastguard Worker 1443*cda5da8dSAndroid Build Coastguard Worker 1444*cda5da8dSAndroid Build Coastguard Worker# Global API functions 1445*cda5da8dSAndroid Build Coastguard Worker 1446*cda5da8dSAndroid Build Coastguard Workerdef current_thread(): 1447*cda5da8dSAndroid Build Coastguard Worker """Return the current Thread object, corresponding to the caller's thread of control. 1448*cda5da8dSAndroid Build Coastguard Worker 1449*cda5da8dSAndroid Build Coastguard Worker If the caller's thread of control was not created through the threading 1450*cda5da8dSAndroid Build Coastguard Worker module, a dummy thread object with limited functionality is returned. 1451*cda5da8dSAndroid Build Coastguard Worker 1452*cda5da8dSAndroid Build Coastguard Worker """ 1453*cda5da8dSAndroid Build Coastguard Worker try: 1454*cda5da8dSAndroid Build Coastguard Worker return _active[get_ident()] 1455*cda5da8dSAndroid Build Coastguard Worker except KeyError: 1456*cda5da8dSAndroid Build Coastguard Worker return _DummyThread() 1457*cda5da8dSAndroid Build Coastguard Worker 1458*cda5da8dSAndroid Build Coastguard Workerdef currentThread(): 1459*cda5da8dSAndroid Build Coastguard Worker """Return the current Thread object, corresponding to the caller's thread of control. 1460*cda5da8dSAndroid Build Coastguard Worker 1461*cda5da8dSAndroid Build Coastguard Worker This function is deprecated, use current_thread() instead. 1462*cda5da8dSAndroid Build Coastguard Worker 1463*cda5da8dSAndroid Build Coastguard Worker """ 1464*cda5da8dSAndroid Build Coastguard Worker import warnings 1465*cda5da8dSAndroid Build Coastguard Worker warnings.warn('currentThread() is deprecated, use current_thread() instead', 1466*cda5da8dSAndroid Build Coastguard Worker DeprecationWarning, stacklevel=2) 1467*cda5da8dSAndroid Build Coastguard Worker return current_thread() 1468*cda5da8dSAndroid Build Coastguard Worker 1469*cda5da8dSAndroid Build Coastguard Workerdef active_count(): 1470*cda5da8dSAndroid Build Coastguard Worker """Return the number of Thread objects currently alive. 1471*cda5da8dSAndroid Build Coastguard Worker 1472*cda5da8dSAndroid Build Coastguard Worker The returned count is equal to the length of the list returned by 1473*cda5da8dSAndroid Build Coastguard Worker enumerate(). 1474*cda5da8dSAndroid Build Coastguard Worker 1475*cda5da8dSAndroid Build Coastguard Worker """ 1476*cda5da8dSAndroid Build Coastguard Worker with _active_limbo_lock: 1477*cda5da8dSAndroid Build Coastguard Worker return len(_active) + len(_limbo) 1478*cda5da8dSAndroid Build Coastguard Worker 1479*cda5da8dSAndroid Build Coastguard Workerdef activeCount(): 1480*cda5da8dSAndroid Build Coastguard Worker """Return the number of Thread objects currently alive. 1481*cda5da8dSAndroid Build Coastguard Worker 1482*cda5da8dSAndroid Build Coastguard Worker This function is deprecated, use active_count() instead. 1483*cda5da8dSAndroid Build Coastguard Worker 1484*cda5da8dSAndroid Build Coastguard Worker """ 1485*cda5da8dSAndroid Build Coastguard Worker import warnings 1486*cda5da8dSAndroid Build Coastguard Worker warnings.warn('activeCount() is deprecated, use active_count() instead', 1487*cda5da8dSAndroid Build Coastguard Worker DeprecationWarning, stacklevel=2) 1488*cda5da8dSAndroid Build Coastguard Worker return active_count() 1489*cda5da8dSAndroid Build Coastguard Worker 1490*cda5da8dSAndroid Build Coastguard Workerdef _enumerate(): 1491*cda5da8dSAndroid Build Coastguard Worker # Same as enumerate(), but without the lock. Internal use only. 1492*cda5da8dSAndroid Build Coastguard Worker return list(_active.values()) + list(_limbo.values()) 1493*cda5da8dSAndroid Build Coastguard Worker 1494*cda5da8dSAndroid Build Coastguard Workerdef enumerate(): 1495*cda5da8dSAndroid Build Coastguard Worker """Return a list of all Thread objects currently alive. 1496*cda5da8dSAndroid Build Coastguard Worker 1497*cda5da8dSAndroid Build Coastguard Worker The list includes daemonic threads, dummy thread objects created by 1498*cda5da8dSAndroid Build Coastguard Worker current_thread(), and the main thread. It excludes terminated threads and 1499*cda5da8dSAndroid Build Coastguard Worker threads that have not yet been started. 1500*cda5da8dSAndroid Build Coastguard Worker 1501*cda5da8dSAndroid Build Coastguard Worker """ 1502*cda5da8dSAndroid Build Coastguard Worker with _active_limbo_lock: 1503*cda5da8dSAndroid Build Coastguard Worker return list(_active.values()) + list(_limbo.values()) 1504*cda5da8dSAndroid Build Coastguard Worker 1505*cda5da8dSAndroid Build Coastguard Worker 1506*cda5da8dSAndroid Build Coastguard Worker_threading_atexits = [] 1507*cda5da8dSAndroid Build Coastguard Worker_SHUTTING_DOWN = False 1508*cda5da8dSAndroid Build Coastguard Worker 1509*cda5da8dSAndroid Build Coastguard Workerdef _register_atexit(func, *arg, **kwargs): 1510*cda5da8dSAndroid Build Coastguard Worker """CPython internal: register *func* to be called before joining threads. 1511*cda5da8dSAndroid Build Coastguard Worker 1512*cda5da8dSAndroid Build Coastguard Worker The registered *func* is called with its arguments just before all 1513*cda5da8dSAndroid Build Coastguard Worker non-daemon threads are joined in `_shutdown()`. It provides a similar 1514*cda5da8dSAndroid Build Coastguard Worker purpose to `atexit.register()`, but its functions are called prior to 1515*cda5da8dSAndroid Build Coastguard Worker threading shutdown instead of interpreter shutdown. 1516*cda5da8dSAndroid Build Coastguard Worker 1517*cda5da8dSAndroid Build Coastguard Worker For similarity to atexit, the registered functions are called in reverse. 1518*cda5da8dSAndroid Build Coastguard Worker """ 1519*cda5da8dSAndroid Build Coastguard Worker if _SHUTTING_DOWN: 1520*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError("can't register atexit after shutdown") 1521*cda5da8dSAndroid Build Coastguard Worker 1522*cda5da8dSAndroid Build Coastguard Worker call = functools.partial(func, *arg, **kwargs) 1523*cda5da8dSAndroid Build Coastguard Worker _threading_atexits.append(call) 1524*cda5da8dSAndroid Build Coastguard Worker 1525*cda5da8dSAndroid Build Coastguard Worker 1526*cda5da8dSAndroid Build Coastguard Workerfrom _thread import stack_size 1527*cda5da8dSAndroid Build Coastguard Worker 1528*cda5da8dSAndroid Build Coastguard Worker# Create the main thread object, 1529*cda5da8dSAndroid Build Coastguard Worker# and make it available for the interpreter 1530*cda5da8dSAndroid Build Coastguard Worker# (Py_Main) as threading._shutdown. 1531*cda5da8dSAndroid Build Coastguard Worker 1532*cda5da8dSAndroid Build Coastguard Worker_main_thread = _MainThread() 1533*cda5da8dSAndroid Build Coastguard Worker 1534*cda5da8dSAndroid Build Coastguard Workerdef _shutdown(): 1535*cda5da8dSAndroid Build Coastguard Worker """ 1536*cda5da8dSAndroid Build Coastguard Worker Wait until the Python thread state of all non-daemon threads get deleted. 1537*cda5da8dSAndroid Build Coastguard Worker """ 1538*cda5da8dSAndroid Build Coastguard Worker # Obscure: other threads may be waiting to join _main_thread. That's 1539*cda5da8dSAndroid Build Coastguard Worker # dubious, but some code does it. We can't wait for C code to release 1540*cda5da8dSAndroid Build Coastguard Worker # the main thread's tstate_lock - that won't happen until the interpreter 1541*cda5da8dSAndroid Build Coastguard Worker # is nearly dead. So we release it here. Note that just calling _stop() 1542*cda5da8dSAndroid Build Coastguard Worker # isn't enough: other threads may already be waiting on _tstate_lock. 1543*cda5da8dSAndroid Build Coastguard Worker if _main_thread._is_stopped: 1544*cda5da8dSAndroid Build Coastguard Worker # _shutdown() was already called 1545*cda5da8dSAndroid Build Coastguard Worker return 1546*cda5da8dSAndroid Build Coastguard Worker 1547*cda5da8dSAndroid Build Coastguard Worker global _SHUTTING_DOWN 1548*cda5da8dSAndroid Build Coastguard Worker _SHUTTING_DOWN = True 1549*cda5da8dSAndroid Build Coastguard Worker 1550*cda5da8dSAndroid Build Coastguard Worker # Call registered threading atexit functions before threads are joined. 1551*cda5da8dSAndroid Build Coastguard Worker # Order is reversed, similar to atexit. 1552*cda5da8dSAndroid Build Coastguard Worker for atexit_call in reversed(_threading_atexits): 1553*cda5da8dSAndroid Build Coastguard Worker atexit_call() 1554*cda5da8dSAndroid Build Coastguard Worker 1555*cda5da8dSAndroid Build Coastguard Worker # Main thread 1556*cda5da8dSAndroid Build Coastguard Worker if _main_thread.ident == get_ident(): 1557*cda5da8dSAndroid Build Coastguard Worker tlock = _main_thread._tstate_lock 1558*cda5da8dSAndroid Build Coastguard Worker # The main thread isn't finished yet, so its thread state lock can't 1559*cda5da8dSAndroid Build Coastguard Worker # have been released. 1560*cda5da8dSAndroid Build Coastguard Worker assert tlock is not None 1561*cda5da8dSAndroid Build Coastguard Worker assert tlock.locked() 1562*cda5da8dSAndroid Build Coastguard Worker tlock.release() 1563*cda5da8dSAndroid Build Coastguard Worker _main_thread._stop() 1564*cda5da8dSAndroid Build Coastguard Worker else: 1565*cda5da8dSAndroid Build Coastguard Worker # bpo-1596321: _shutdown() must be called in the main thread. 1566*cda5da8dSAndroid Build Coastguard Worker # If the threading module was not imported by the main thread, 1567*cda5da8dSAndroid Build Coastguard Worker # _main_thread is the thread which imported the threading module. 1568*cda5da8dSAndroid Build Coastguard Worker # In this case, ignore _main_thread, similar behavior than for threads 1569*cda5da8dSAndroid Build Coastguard Worker # spawned by C libraries or using _thread.start_new_thread(). 1570*cda5da8dSAndroid Build Coastguard Worker pass 1571*cda5da8dSAndroid Build Coastguard Worker 1572*cda5da8dSAndroid Build Coastguard Worker # Join all non-deamon threads 1573*cda5da8dSAndroid Build Coastguard Worker while True: 1574*cda5da8dSAndroid Build Coastguard Worker with _shutdown_locks_lock: 1575*cda5da8dSAndroid Build Coastguard Worker locks = list(_shutdown_locks) 1576*cda5da8dSAndroid Build Coastguard Worker _shutdown_locks.clear() 1577*cda5da8dSAndroid Build Coastguard Worker 1578*cda5da8dSAndroid Build Coastguard Worker if not locks: 1579*cda5da8dSAndroid Build Coastguard Worker break 1580*cda5da8dSAndroid Build Coastguard Worker 1581*cda5da8dSAndroid Build Coastguard Worker for lock in locks: 1582*cda5da8dSAndroid Build Coastguard Worker # mimic Thread.join() 1583*cda5da8dSAndroid Build Coastguard Worker lock.acquire() 1584*cda5da8dSAndroid Build Coastguard Worker lock.release() 1585*cda5da8dSAndroid Build Coastguard Worker 1586*cda5da8dSAndroid Build Coastguard Worker # new threads can be spawned while we were waiting for the other 1587*cda5da8dSAndroid Build Coastguard Worker # threads to complete 1588*cda5da8dSAndroid Build Coastguard Worker 1589*cda5da8dSAndroid Build Coastguard Worker 1590*cda5da8dSAndroid Build Coastguard Workerdef main_thread(): 1591*cda5da8dSAndroid Build Coastguard Worker """Return the main thread object. 1592*cda5da8dSAndroid Build Coastguard Worker 1593*cda5da8dSAndroid Build Coastguard Worker In normal conditions, the main thread is the thread from which the 1594*cda5da8dSAndroid Build Coastguard Worker Python interpreter was started. 1595*cda5da8dSAndroid Build Coastguard Worker """ 1596*cda5da8dSAndroid Build Coastguard Worker return _main_thread 1597*cda5da8dSAndroid Build Coastguard Worker 1598*cda5da8dSAndroid Build Coastguard Worker# get thread-local implementation, either from the thread 1599*cda5da8dSAndroid Build Coastguard Worker# module, or from the python fallback 1600*cda5da8dSAndroid Build Coastguard Worker 1601*cda5da8dSAndroid Build Coastguard Workertry: 1602*cda5da8dSAndroid Build Coastguard Worker from _thread import _local as local 1603*cda5da8dSAndroid Build Coastguard Workerexcept ImportError: 1604*cda5da8dSAndroid Build Coastguard Worker from _threading_local import local 1605*cda5da8dSAndroid Build Coastguard Worker 1606*cda5da8dSAndroid Build Coastguard Worker 1607*cda5da8dSAndroid Build Coastguard Workerdef _after_fork(): 1608*cda5da8dSAndroid Build Coastguard Worker """ 1609*cda5da8dSAndroid Build Coastguard Worker Cleanup threading module state that should not exist after a fork. 1610*cda5da8dSAndroid Build Coastguard Worker """ 1611*cda5da8dSAndroid Build Coastguard Worker # Reset _active_limbo_lock, in case we forked while the lock was held 1612*cda5da8dSAndroid Build Coastguard Worker # by another (non-forked) thread. http://bugs.python.org/issue874900 1613*cda5da8dSAndroid Build Coastguard Worker global _active_limbo_lock, _main_thread 1614*cda5da8dSAndroid Build Coastguard Worker global _shutdown_locks_lock, _shutdown_locks 1615*cda5da8dSAndroid Build Coastguard Worker _active_limbo_lock = RLock() 1616*cda5da8dSAndroid Build Coastguard Worker 1617*cda5da8dSAndroid Build Coastguard Worker # fork() only copied the current thread; clear references to others. 1618*cda5da8dSAndroid Build Coastguard Worker new_active = {} 1619*cda5da8dSAndroid Build Coastguard Worker 1620*cda5da8dSAndroid Build Coastguard Worker try: 1621*cda5da8dSAndroid Build Coastguard Worker current = _active[get_ident()] 1622*cda5da8dSAndroid Build Coastguard Worker except KeyError: 1623*cda5da8dSAndroid Build Coastguard Worker # fork() was called in a thread which was not spawned 1624*cda5da8dSAndroid Build Coastguard Worker # by threading.Thread. For example, a thread spawned 1625*cda5da8dSAndroid Build Coastguard Worker # by thread.start_new_thread(). 1626*cda5da8dSAndroid Build Coastguard Worker current = _MainThread() 1627*cda5da8dSAndroid Build Coastguard Worker 1628*cda5da8dSAndroid Build Coastguard Worker _main_thread = current 1629*cda5da8dSAndroid Build Coastguard Worker 1630*cda5da8dSAndroid Build Coastguard Worker # reset _shutdown() locks: threads re-register their _tstate_lock below 1631*cda5da8dSAndroid Build Coastguard Worker _shutdown_locks_lock = _allocate_lock() 1632*cda5da8dSAndroid Build Coastguard Worker _shutdown_locks = set() 1633*cda5da8dSAndroid Build Coastguard Worker 1634*cda5da8dSAndroid Build Coastguard Worker with _active_limbo_lock: 1635*cda5da8dSAndroid Build Coastguard Worker # Dangling thread instances must still have their locks reset, 1636*cda5da8dSAndroid Build Coastguard Worker # because someone may join() them. 1637*cda5da8dSAndroid Build Coastguard Worker threads = set(_enumerate()) 1638*cda5da8dSAndroid Build Coastguard Worker threads.update(_dangling) 1639*cda5da8dSAndroid Build Coastguard Worker for thread in threads: 1640*cda5da8dSAndroid Build Coastguard Worker # Any lock/condition variable may be currently locked or in an 1641*cda5da8dSAndroid Build Coastguard Worker # invalid state, so we reinitialize them. 1642*cda5da8dSAndroid Build Coastguard Worker if thread is current: 1643*cda5da8dSAndroid Build Coastguard Worker # There is only one active thread. We reset the ident to 1644*cda5da8dSAndroid Build Coastguard Worker # its new value since it can have changed. 1645*cda5da8dSAndroid Build Coastguard Worker thread._reset_internal_locks(True) 1646*cda5da8dSAndroid Build Coastguard Worker ident = get_ident() 1647*cda5da8dSAndroid Build Coastguard Worker thread._ident = ident 1648*cda5da8dSAndroid Build Coastguard Worker new_active[ident] = thread 1649*cda5da8dSAndroid Build Coastguard Worker else: 1650*cda5da8dSAndroid Build Coastguard Worker # All the others are already stopped. 1651*cda5da8dSAndroid Build Coastguard Worker thread._reset_internal_locks(False) 1652*cda5da8dSAndroid Build Coastguard Worker thread._stop() 1653*cda5da8dSAndroid Build Coastguard Worker 1654*cda5da8dSAndroid Build Coastguard Worker _limbo.clear() 1655*cda5da8dSAndroid Build Coastguard Worker _active.clear() 1656*cda5da8dSAndroid Build Coastguard Worker _active.update(new_active) 1657*cda5da8dSAndroid Build Coastguard Worker assert len(_active) == 1 1658*cda5da8dSAndroid Build Coastguard Worker 1659*cda5da8dSAndroid Build Coastguard Worker 1660*cda5da8dSAndroid Build Coastguard Workerif hasattr(_os, "register_at_fork"): 1661*cda5da8dSAndroid Build Coastguard Worker _os.register_at_fork(after_in_child=_after_fork) 1662