xref: /aosp_15_r20/prebuilts/build-tools/common/py3-stdlib/threading.py (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
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