python (3.11.7)

(root)/
lib/
python3.11/
test/
__pycache__/
test_threading.cpython-311.pyc

edZddlZddlmZmZddlmZmZmZddlm	Z	ddl
mZmZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZddlmZdd	lmZejd
dZeed
ZdZ dZ!Gdde"Z#Gddej$Z%Gddej&Z'Gdde'Z(Gdde'Z)Gdde'Z*Gdde'Z+Gddej$Z,Gd d!e'Z-Gd"d#e'Z.Gd$d%ej/Z/Gd&d'ej0Z1ej2ej3dud(Gd)d*ej0Z4Gd+d,ej5Z5Gd-d.ej0Z6Gd/d0ej7Z7Gd1d2ej8Z8Gd3d4ej9Z9Gd5d6ej:Z:Gd7d8ej&Z;Gd9d:ej&Z<Gd;d<ej&Z=e>d=krej?dSdS)>z!
Tests for the threading module.
N)threading_helperrequires_subprocess)verbosecpython_only	os_helper)
import_module)assert_python_okassert_python_failure)mock)
lock_tests)supportT)module)netbsd5zhp-ux11gettotalrefcountc
tjstjd|Stjtvrtjd|Stjrtjd|S|S)Nzrequires working os.fork()z*due to known OS bug related to thread+forkz?libasan has a pthread_create() dead lock related to thread+fork)r
has_fork_supportunittestskipsysplatformplatforms_to_skipHAVE_ASAN_FORK_BUG)tests G/BuggyBox/python/3.11.7/bootstrap/lib/python3.11/test/test_threading.pyskip_unless_reliable_forkr(s#A:x}9::4@@@
|(((Jx}IJJ4PPP!f_x}^__`deeeKc|ttdtjtjt_dS)N
excepthook)
addCleanupsetattr	threadingr__excepthook__)testcases rrestore_default_excepthookr$2s0L):NOOO$3Irc&eZdZdZdZdZdZdS)Countercd|_dS)Nrvalueselfs r__init__zCounter.__init__9s



rc&|xjdz
c_dSNr(r*s rinczCounter.inc;

a



rc&|xjdzc_dSr.r(r*s rdeczCounter.dec=r1rc|jSNr(r*s rgetzCounter.get?s
zrN)__name__
__module____qualname__r,r0r3r6rrr&r&8sPrr&ceZdZdZdZdS)
TestThreadctj||||_||_||_||_dS)Nname)r!Threadr,r#semamutexnrunning)r+r?r#rArBrCs      rr,zTestThread.__init__Cs>!!$T!222 
	
 


rctjdz}trtd|j|dzfz|j5|j5|jtr't|jd|j	
|jddddn#1swxYwYtj|trtd|jd|j5|j
|j	|jdtr0td	|j|jfzdddn#1swxYwYddddS#1swxYwYdS)
Ng@ztask %s will run for %.1f usecg.Aztasks are runningtaskdonerz$%s is finished. %d tasks are running)randomrprintr?rArBrCr0r6r#assertLessEqualtimesleepr3assertGreaterEqual)r+delays  rrunzTestThread.runJs
')	,29eck*+
,
,
,Y	<	<
F
F
!!###D$-++--/BCCC
--dm.?.?.A.A1EEE	
F
F
F
F
F
F
F
F
F
F
F
F
F
F
F
Ju
1fdi000
<
<
!!###
001B1B1D1DaHHH<@9dm&7&7&9&9:;<<<	
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<	<	<	<	<	<	<	<	<	<	<	<	<	<	<	<	<	<	<s\F9	A:CF9C	F9C	;F9BF!F9!F%	%F9(F%	)F99F=F=N)r7r8r9r,rOr:rrr<r<Bs2!!!<<<<<rr<ceZdZdZdZdS)BaseTestCasec6tj|_dSr5)rthreading_setup_threadsr*s rsetUpzBaseTestCase.setUpds(8::


rchtj|jtjdSr5)rthreading_cleanuprTrr

reap_childrenr*s rtearDownzBaseTestCase.tearDowngs,*DM::""$$$$$rN)r7r8r9rUrYr:rrrQrQcs2;;;%%%%%rrQc4eZdZedZdZedZdZdZdZ	dZ
dZd	Zd
Z
dZdZd
ZdZdZdZdZdZedZedZedZdZeejeedddZeejeedddZ dZ!dZ"dZ#dZ$dZ%ed Z&d!Z'd"Z(ed#Z)d$Z*d%Z+d&Z,eje-d'd(Z.d)Z/d*S)+ThreadTestscd}tjd}||jdtjd}||jdtj|d}||jdtjtdd	
5tjd}||jddddn#1swxYwYtjtdd
5tj}||jddddn#1swxYwYtjtdd
5tj|}||jdddddS#1swxYwYdS)NcdSr5r:r:rrfuncz#ThreadTests.test_name.<locals>.funcprmyname1r>{123myname2)targetr?_counter)return_valuezThread-2rEzThread-3rdzThread-5 (func))r!r@assertEqualr?rpatchobject)r+r^threads   r	test_namezThreadTests.test_namensx!y111i000!s+++e,,,!I>>>i000
Z

y*1

E
E	6	6%2...FV[*555	6	6	6	6	6	6	6	6	6	6	6	6	6	6	6Z

y*1

E
E	6	6%''FV[*555	6	6	6	6	6	6	6	6	6	6	6	6	6	6	6Z

y*1

E
E	=	=%T222FV[*;<<<	=	=	=	=	=	=	=	=	=	=	=	=	=	=	=	=	=	=s6<1C99C=C=+/E&&E*-E*1GGGc`dg}d}dg}d}dgf}dg}|fdf|fdf|fdf|fdf|fd	f|fd
ff}|D]r\}}	|	|5tj|	|}
|
|
dddn#1swxYwYsdS)Nr/r/strrrc0|dSr.rkargr+s r<lambda>z0ThreadTests.test_args_argument.<locals>.<lambda>s4#3#3C#;#;rc0|dSr.rurvs rrxz0ThreadTests.test_args_argument.<locals>.<lambda>sD$4$4S!$<$<rc0|dSNrrrurvs rrxz0ThreadTests.test_args_argument.<locals>.<lambda>s4#3#3C#?#?rc0|dSr{rurvs rrxz0ThreadTests.test_args_argument.<locals>.<lambda>sD$4$4S%$@$@rc2|dgSr.rurvs rrxz0ThreadTests.test_args_argument.<locals>.<lambda>s(8(8qc(B(Brc0|dS)Nrqrurvs rrxz0ThreadTests.test_args_argument.<locals>.<lambda>s(8(8d(C(Crrdargs)subTestr!r@startjoin)r+num_list	num_tuplestr_list	str_tuple
list_in_tuple
tuple_in_list
test_casesrrdts`          rtest_args_argumentzThreadTests.test_args_arguments\3	7	

;;;;<
<<<<=
????@
@@@@A
BBBBC
CCCCD


'		LD&V$77

$F>>>			














		s?B""B&	)B&	ctj}tj|t|dSr5)r!Lockrr
check_disallow_instantiationtyper+locks  rtest_disallow_instantiationz'ThreadTests.test_disallow_instantiations5~11$T

CCCCCrcld}tjd}tj}t}g}t	|D]~}td|z||||}||||j|	t|d|ttdrjtd|Dtjhz}|d||t#||dzt$rt'd	|D]}|||||jd
||j|	t|dt$rt'd||d
dS)
N
rEr(z<thread %d>z^<TestThread\(.*, initial\)>$
get_native_idc3$K|]}|jVdSr5)	native_id).0rs  r	<genexpr>z/ThreadTests.test_various_ops.<locals>.<genexpr>s$::QQ[::::::rr/z!waiting for all tasks to completerz#^<TestThread\(.*, stopped -?\d+\)>$zall tasks done)r!BoundedSemaphoreRLockr&ranger<appendassertIsNoneidentassertRegexreprrhasattrsetrassertNotInrklenrrIrassertFalseis_aliveassertNotEqualassertIsNotNoner6)	r+NUMTASKSrArB
numrunningthreadsir
native_idss	         rtest_various_opszThreadTests.test_various_opss)222!!YY
x		A=?D$zJJANN1ag&&&T!WW&FGGG
GGIIII9o..	<::':::::i>U>W>W=XXJT:...S__hl;;;	75666	N	NA
FFHHHQZZ\\***+++  )))T!WW&LMMMM	$"###))1-----rc|tjjfd}tjgtj5tj|d}	|
d|dddn#1swxYwYtjd=dS)NctjjdSr5)rr!current_threadrr)rGrsrfz9ThreadTests.test_ident_of_no_threading_threads.<locals>.fs2LL1339:::HHJJJJJrr:r)rr!rrEventrwait_threads_exit_threadstart_new_threadwaitrk_active)r+rtidrGrs   @@r"test_ident_of_no_threading_threadsz.ThreadTests.test_ident_of_no_threading_threadss
Y577=>>>						  

/
1
1	,	,*1b11CIIKKKU1Xs+++	,	,	,	,	,	,	,	,	,	,	,	,	,	,	,

eAh'''sAB..B25B2ctrtd	tjdn'#tj$rt
jdwxYw|tjddS)Nz!with 256 KiB thread stack size...i4platform does not support changing thread stack sizer	rrIr!
stack_sizererrorrSkipTestrr*s rtest_various_ops_small_stackz(ThreadTests.test_various_ops_small_stacks	75666	H ((((}	H	H	H#FHH
H	H	
Q	-$Actrtd	tjdn'#tj$rt
jdwxYw|tjddS)Nzwith 1 MiB thread stack size...irrrr*s rtest_various_ops_large_stackz(ThreadTests.test_various_ops_large_stacks	53444	H ****}	H	H	H#FHH
H	H	
Qrcd}tj}|tj5tj||f}|dddn#1swxYwY||tj|	tj|tj
|tj||
ttj|dtj|=dS)NcTtj|dSr5)r!rrelease)rBs rrz*ThreadTests.test_foreign_thread.<locals>.fs$
$&&&MMOOOOOr_DummyThread)r!racquirerrrrassertInrassertIsInstancer
assertTruerrr)r+rrBrs    rtest_foreign_threadzThreadTests.test_foreign_threadsI			  




/
1
1		*1uh77CMMOOO																


c9,---i/4i6LMMM	)#.7799:::i/455~FFFc"""s+A55A9<A9c	
td}|jj}|j|jf|_Gddt	|	}tj}|	|t||d	|||}		#	$rYnwxYw	|
|dn#t$rYnwxYwtjtj
G	
fdd	tj}|}d|_|t&rt)d
t&rt)d|d|}|
|dt&rt)d
}||t&rt)d||jt&rt)d||j|}|
|dt&rt)d
t4j||jt&rt)d|jr|dSdS)NctypesceZdZdS)<ThreadTests.test_PyThreadState_SetAsyncExc.<locals>.AsyncExcN)r7r8r9r:rrAsyncExcrsDrrrTzAsyncExc not raisedr/ceZdZfdZdS):ThreadTests.test_PyThreadState_SetAsyncExc.<locals>.Workerctj|_d|_		tjd)#$rd|_YdSwxYw)NFTg?)r!	get_identidfinishedrrKrL)r+rworker_saw_exceptionworker_starteds rrOz>ThreadTests.test_PyThreadState_SetAsyncExc.<locals>.Worker.run8s#-// %
/(&**,,,
3( ///$(DM(,,....../s*A A0/A0Nr7r8r9rO)rrrsrWorkerr7s8

/

/

/

/

/

/

/

/

/rrz    started worker threadz     trying nonsensical thread idz,    waiting for worker thread to get startedz"    verifying worker hasn't exitedz2    attempting to raise asynch exception in workerz5    waiting for worker to say it caught the exceptiontimeoutz    all OK -- joining worker)r	pythonapiPyThreadState_SetAsyncExcc_ulong	py_objectargtypes	Exceptionr!rrint
assertGreaterfailrkUnboundLocalErrorrr@daemonrrrIrrrrrr

SHORT_TIMEOUTr)r+r
set_async_exc	exceptionrresultrrretrrrs         @@@rtest_PyThreadState_SetAsyncExcz*ThreadTests.test_PyThreadState_SetAsyncExcs.x(((B
"(.&2B!C
					y			$$X..	!##c3'''3"""	-"]3	22F

			D		VQ'''' 			D	#**(00	/	/	/	/	/	/	/	/	/Y%	/	/	/
FHH					/-...	64555r9--###	B@AAA!!##	86777$$$	HFGGGqtY//###	KIJJJ!!'*?!@@@
###	20111:	
FFHHHHH		s$B..B65B6:C
CCc2d}tj}|t_	tjd}|tj|j||tjvd|t_dS#|t_wxYw)Nc(tjr5)r!ThreadErrorrs rfail_new_threadz7ThreadTests.test_limbo_cleanup.<locals>.fail_new_threadhs')))rcdSr5r:r:rrrxz0ThreadTests.test_limbo_cleanup.<locals>.<lambda>mrrjz:Failed to cleanup _limbo map on failure of Thread.start().)r!_start_new_threadr@assertRaisesrrr_limbo)r+rrrs    rtest_limbo_cleanupzThreadTests.test_limbo_cleanupfs	*	*	*%7&5	#	< 555Ai3QW===Y%%L
N
N
N+<I'''*;I';;;;sABBcxtdtdd\}}}||ddS)Nr-caNif 1:
            import ctypes, sys, time, _thread

            # This lock is used as a simple event variable.
            ready = _thread.allocate_lock()
            ready.acquire()

            # Module globals are cleared before __del__ is run
            # So we save the functions in class dict
            class C:
                ensure = ctypes.pythonapi.PyGILState_Ensure
                release = ctypes.pythonapi.PyGILState_Release
                def __del__(self):
                    state = self.ensure()
                    self.release(state)

            def waitingThread():
                x = C()
                ready.release()
                time.sleep(100)

            _thread.start_new_thread(waitingThread, ())
            ready.acquire()  # Be sure the other thread is waiting.
            sys.exit(42)
            *)rr
rkr+rcouterrs    rtest_finalize_running_threadz(ThreadTests.test_finalize_running_threadusL	h,T4C2	
R     rc&tdddS)NraPif 1:
            import sys, threading

            # A deadlock-killer, to prevent the
            # testsuite to hang forever
            def killer():
                import os, time
                time.sleep(2)
                print('program blocked; aborting')
                os._exit(2)
            t = threading.Thread(target=killer)
            t.daemon = True
            t.start()

            # This is the trace function
            def func(frame, event, arg):
                threading.current_thread()
                return func

            sys.settrace(func)
            )r	r*s rtest_finalize_with_tracez$ThreadTests.test_finalize_with_traces'	 					rctdd\}}}||d||ddS)Nraif 1:
                import threading
                from time import sleep

                def child():
                    sleep(1)
                    # As a non-daemon thread we SHOULD wake up and nothing
                    # should be torn down yet
                    print("Woke up, sleep function is:", sleep)

                threading.Thread(target=child).start()
                raise SystemExit
            s5Woke up, sleep function is: <built-in function sleep>r)r	rkstriprs    rtest_join_nondaemon_on_shutdownz+ThreadTests.test_join_nondaemon_on_shutdownsf(/C	
D	F	F	Fc"""""rctj}tj}	t	ddD]}}tj|dztjd}|||}|	||d||fz~	tj|dS#tj|wxYw)Nr/dg-C6*?cdSr5r:r:rrrxz7ThreadTests.test_enumerate_after_join.<locals>.<lambda>sDrrjz&#1703448 triggered after %d trials: %s)
r!	enumeratergetswitchintervalrsetswitchintervalr@rrr)r+enumold_intervalrrls      rtest_enumerate_after_joinz%ThreadTests.test_enumerate_after_joins",..
	01c]]
G
G%a&j111$LL999			DFF  A<1vEGGGG

G
!,/////C!,////sBCCc"Gddt}t||d}tj|}|j~||dtj|z|d}tj|}|j~||dtj|zdS)NceZdZdZdZdS)DThreadTests.test_no_refcycle_through_target.<locals>.RunSelfFunctionc||_tj|j|fd|i|_|jdS)Nyet_another)rdrkwargs)should_raiser!r@_runrnr)r+rs  rr,zMThreadTests.test_no_refcycle_through_target.<locals>.RunSelfFunction.__init__sU%1!'.di59G7DT6JLLL!!#####rc"|jrtdSr5)r
SystemExit)r+	other_refrs   rrzIThreadTests.test_no_refcycle_through_target.<locals>.RunSelfFunction._runs$%$$%%rN)r7r8r9r,rr:rrRunSelfFunctionrs2
$
$
$
%
%
%
%
%rr F)rz%d references still around)msgT)	rmr$weakrefrefrnrrrgetrefcount)r+r 
cyclic_objectweak_cyclic_objectraising_cyclic_objectweak_raising_cyclic_objects      rtest_no_refcycle_through_targetz+ThreadTests.test_no_refcycle_through_targetsX	%	%	%	%	%f	%	%	%	#4((('U;;;
$[77!!###,,..:!o.@.@.B.BCCD		F	F	F!0T B B B%,[1F%G%G"$))+++!4466:!o.H.H.J.JKKL		N	N	N	N	Nrctj}|td5|dddn#1swxYwY|td5|ddddn#1swxYwY|td5|dddn#1swxYwY|td5|ddddn#1swxYwYtj}|td5|	dddn#1swxYwYtj
}||td5|dddn#1swxYwY|td	5tj
dddn#1swxYwY|td
5tjddddS#1swxYwYdS)Nzget the daemon attributezset the daemon attributeTzget the name attributezset the name attributer?zuse is_set()zuse notify_all()zuse active_count()zuse current_thread())r!r@assertWarnsRegexDeprecationWarningisDaemon	setDaemongetNamesetNamerisSet	Conditionr	notifyAllactiveCount
currentThread)r+reconds    rtest_old_threading_apiz"ThreadTests.test_old_threading_apisI


"
"#5#>@@		
JJLLL															
"
"#5#>@@		
KK															
"
"#5#<>>		
IIKKK															
"
"#5#<>>		
IIf															
O

"
"#5~
F
F		
GGIII															"$$

"
"#57I
J
J		NN															
"
"#57K
L
L	$	$!###	$	$	$	$	$	$	$	$	$	$	$	$	$	$	$

"
"#57M
N
N	&	&#%%%	&	&	&	&	&	&	&	&	&	&	&	&	&	&	&	&	&	&sAAA6BBB>CC#&C#D''D+.D+ FFFG//G36G3H55H9<H9I<<JJctj}|dt|d|_|dt|dSNrT)r!r@rrrrr+rs  rtest_repr_daemonzThreadTests.test_repr_daemonsS477+++

hQ(((((rctj}||jtjd}||jtjd}||jdS)NFrT)r!r@rrrr;s  rtest_daemon_paramzThreadTests.test_daemon_params|"""E***"""D)))!!!!!rctjd}td|\}}}||d||ddS)Nat
            import atexit
            import os
            import sys
            from test.support import wait_process

            # Import the threading module to register its "at fork" callback
            import threading

            def exit_handler():
                pid = os.fork()
                if not pid:
                    print("child process ok", file=sys.stderr, flush=True)
                    # child process
                else:
                    wait_process(pid, exitcode=0)

            # exit_handler() will be called after threading._shutdown()
            atexit.register(exit_handler)
        rrschild process ok)textwrapdedentr	rkrstripr+code_rrs     rtest_fork_at_exitzThreadTests.test_fork_at_exit"sl 

('tT223c"""':;;;;;rcd}td|\}}}||d||ddS)Naif 1:
            import _thread, threading, os, time

            def background_thread(evt):
                # Creates and registers the _DummyThread instance
                threading.current_thread()
                evt.set()
                time.sleep(10)

            evt = threading.Event()
            _thread.start_new_thread(background_thread, (evt,))
            evt.wait()
            assert threading.active_count() == 2, threading.active_count()
            if os.fork() == 0:
                assert threading.active_count() == 1, threading.active_count()
                os._exit(0)
            else:
                os.wait()
        rrr	rkrDs     rtest_dummy_thread_after_forkz(ThreadTests.test_dummy_thread_after_fork>sR&'tT223c"""c"""""rctj}|tj|tjdt
dD]}tjd}|	tj}|dkr+tj|
rdndp|tj|ddS)	Ngư>cdSr5r:r:rrrxz6ThreadTests.test_is_alive_after_fork.<locals>.<lambda>drrrjrrexitcode)rrrrrr
rr!r@rosfork_exitrrwait_process)r+rrrpids     rtest_is_alive_after_forkz$ThreadTests.test_is_alive_after_forkYs,..-|<<<	
&&t,,,r		7		7A 555A
GGIII'))Caxxqzz||34444$S266666		7		7rctj}|jd|jtjj|jtjfd}tj|}||	dS)N
MainThreadctjjtjjdSr5)rr!main_threadrrr*srrz'ThreadTests.test_main_thread.<locals>.ftsG	 5 7 7 = ) 8 : : @
B
B
B
B
Brrj)
r!rZrkr?rrrr@rr)r+mainrths`   rtest_main_threadzThreadTests.test_main_threadns$&&L111Y%=%?%?%EFFFY%8%:%:;;;	B	B	B	B	B
Q
'
'
'




					rwaitpidztest needs os.waitpid()cd}td|\}}}|dd}||d||ddS)Naif 1:
            import os, threading
            from test import support

            pid = os.fork()
            if pid == 0:
                main = threading.main_thread()
                print(main.name)
                print(main.ident == threading.current_thread().ident)
                print(main.ident == threading.get_ident())
            else:
                support.wait_process(pid, exitcode=0)
        r
rhrzMainThread
True
True
r	decodereplacerkr+rErFrrdatas      rtest_main_thread_after_forkz'ThreadTests.test_main_thread_after_fork{sp'tT223zz||##D"--c"""9:::::rcd}td|\}}}|dd}||d||ddS)Naif 1:
            import os, threading, sys
            from test import support

            def func():
                pid = os.fork()
                if pid == 0:
                    main = threading.main_thread()
                    print(main.name)
                    print(main.ident == threading.current_thread().ident)
                    print(main.ident == threading.get_ident())
                    # stdout is fully buffered because not a tty,
                    # we have to flush before exit.
                    sys.stdout.flush()
                else:
                    support.wait_process(pid, exitcode=0)

            th = threading.Thread(target=func)
            th.start()
            th.join()
        rr`rhrzThread-1 (func)
True
True
rards      r/test_main_thread_after_fork_from_nonmain_threadz;ThreadTests.test_main_thread_after_fork_from_nonmain_threadsp*'tT223zz||##D"--c""">?????rcd}td|\}}}|}||d||dgdzdS)Naif 1:
            import gc, threading

            main_thread = threading.current_thread()
            assert main_thread is threading.main_thread()  # sanity check

            class RefCycle:
                def __init__(self):
                    self.cycle = self

                def __del__(self):
                    print("GC:",
                          threading.current_thread() is main_thread,
                          threading.main_thread() is main_thread,
                          threading.enumerate() == [main_thread])

            RefCycle()
            gc.collect()  # sanity check
            x = RefCycle()
        rrzGC: True True Truerf)r	rbrk
splitlinesrds      r test_main_thread_during_shutdownz,ThreadTests.test_main_thread_during_shutdowns|('tT223zz||c"""**./!3	5	5	5	5	5rc^d}td|\}}}||ddS)Naif 1:
            import os
            import threading
            import time
            import random

            def random_sleep():
                seconds = random.random() * 0.010
                time.sleep(seconds)

            class Sleeper:
                def __del__(self):
                    random_sleep()

            tls = threading.local()

            def f():
                # Sleep a bit so that the thread is still running when
                # Py_Finalize() is called.
                random_sleep()
                tls.x = Sleeper()
                random_sleep()

            threading.Thread(target=f).start()
            random_sleep()
        rrrIr+rErrrs     rtest_finalization_shutdownz&ThreadTests.test_finalization_shutdowns<4(d33Cc"""""rctjtjfd}tj|}||jd|||	|j}|
|dd||tj
d||	||
|	||j|dS)NctjddS)N{Gz?)rrrKrLfinishstartedsrrz'ThreadTests.test_tstate_lock.<locals>.fs9OONNJtrrjrrF)r
allocate_lockrr!r@assertIs_tstate_lockrrrrrr
rrr)r+rrtstate_lockrsrts    @@rtest_tstate_lockzThreadTests.test_tstate_locks'))&((						

A&&&

and+++				

%%%n,,Q,77???	
++G4I+JJERRR	


%%%&&&!.)))	rc~tjtjfd}tj|}||dt|d}tdD])}|t|vrntjd*||t||dS)NcXdSr5)rrrrsrrz(ThreadTests.test_repr_stopped.<locals>.fs)OONNrrjrtstoppedirq)
rrurr!r@rrrrrrKrLr)r+rrLOOKING_FORrrsrts     @@rtest_repr_stoppedzThreadTests.test_repr_stoppeds*'))&((						
A&&&				

ia))) s		Ad1gg%%Jt

k477+++	rctddD]}tj|fdt|D}|D]}||D]}|fdt|D}|D]}||D]}||tjdS)Nr/rcDg|]}tjjSrj)r!r@rrrFbss  r
<listcomp>z;ThreadTests.test_BoundedSemaphore_limit.<locals>.<listcomp>/9...!'rz:::...rcDg|]}tjjSr)r!r@rrs  rrz;ThreadTests.test_BoundedSemaphore_limit.<locals>.<listcomp>5rr)rr!rrrr
ValueErrorr)r+limitrrrs    @rtest_BoundedSemaphore_limitz'ThreadTests.test_BoundedSemaphore_limit+s#1b\\	6	6E+E22B.... %e...G

				

.... %e...G

				

j"*5555	6	6rctfddfdd_tj}tj	t	jddl}|tdD]}
	tj|dS#tj|wxYw)NcSr5r:frameeventrw
noop_traces   rrz9ThreadTests.test_frame_tstate_tracing.<locals>.noop_traceE	rc3K	dV)Nr/	generatorr:r:rrrz8ThreadTests.test_frame_tstate_tracing.<locals>.generatorIs
"!!!!
"rcXj_tjSr5)gennext)callbackrsrrz7ThreadTests.test_frame_tstate_tracing.<locals>.callbackMs(|#(y{{%%%rrrE)rrgettracesettracer!	_testcapicall_in_temporary_c_threadr)r+	old_tracerrrrrs    @@@rtest_frame_tstate_tracingz%ThreadTests.test_frame_tstate_tracing=s						"	"	"	&	&	&	&	&	&LNN	Z   	$z***
00:::a







L#####CL####s
A	B!!B7cfdtj}	tjtj}||tj|dS#tj|wxYw)NcSr5r:rs   rrz-ThreadTests.test_gettrace.<locals>.noop_tracefrr)r!rrrk)r+r
trace_funcrs   @r
test_gettracezThreadTests.test_gettracees					&((		*z***"+--JZ
333y)))))Iy))))s=A..Bcd}tj}	tj|||tjtj|dS#tj|wxYw)NcdSr5r:rs rfnz'ThreadTests.test_getprofile.<locals>.fnrr_r)r!
getprofile
setprofilerk)r+rold_profiles   rtest_getprofilezThreadTests.test_getprofileqs|*,,	. $$$R!5!7!7888 -----I ----s;A))A?cdD]}||5tj}tj|j|}||j}|s!||tjn |	|tj|
||	|tjdddn#1swxYwYdS)N)FTr>)rdr)rr!rr@rrrwr_shutdown_locksrrr)r+rrrnrxs     rtest_shutdown_lockszThreadTests.test_shutdown_lockszsH#	I	IFV,,
I
I!))")FKKK$1MMM+y/HIIII$$[)2KLLL		


  i.GHHH'
I
I
I
I
I
I
I
I
I
I
I
I
I
I
I	I	IsCC==D	D	c~tdd\}}}||ddS)Nra(if 1:
            import threading

            class Atexit:
                def __del__(self):
                    print("thread_dict.atexit = %r" % thread_dict.atexit)

            thread_dict = threading.local()
            thread_dict.atexit = "value"

            atexit = Atexit()
        sthread_dict.atexit = 'value')r	rkrCrs    rtest_locals_at_exitzThreadTests.test_locals_at_exitsG(/

C	
'FGGGGGrcGddt}|}tj|}||||jdS)Nc eZdZdZdZdZdS)6ThreadTests.test_boolean_target.<locals>.BooleanTargetcd|_dSNFranr*s rr,z?ThreadTests.test_boolean_target.<locals>.BooleanTarget.__init__s
 rcdSrr:r*s r__bool__z?ThreadTests.test_boolean_target.<locals>.BooleanTarget.__bool__surcd|_dS)NTrr*s r__call__z?ThreadTests.test_boolean_target.<locals>.BooleanTarget.__call__s
rN)r7r8r9r,rrr:rr
BooleanTargetrsA
!
!
!



 
 
 
 
 rrrj)rmr!r@rrrr)r+rrdrns    rtest_boolean_targetzThreadTests.test_boolean_targets
	 	 	 	 	 F	 	 	 !000



#####rcd}tj5tj|ddddS#1swxYwYdS)NcdSr5r:r:rrnoopz0ThreadTests.test_leak_without_join.<locals>.noopr_rrj)rrr!r@r)r+rs  rtest_leak_without_joinz"ThreadTests.test_leak_without_joins	

/
1
1	2	2D)))//111	2	2	2	2	2	2	2	2	2	2	2	2	2	2	2	2	2	2s(AAAzneed debug build (Py_DEBUG)cdtdddd\}}}d}|||dS)Nz	-Wdefaultrpass1)PYTHONTHREADDEBUGsDeprecationWarning: The threading debug (PYTHONTHREADDEBUG environment variable) is deprecated and will be removed in Python 3.12)r	r)r+rrrr!s     rtest_debug_deprecationz"ThreadTests.test_debug_deprecationsK(T6:=???CC	


c3rctjd}td|\}}}||d||ddS)Na
            import _thread
            import sys

            event = _thread.allocate_lock()
            event.acquire()

            def import_threading():
                import threading
                event.release()

            if 'threading' in sys.modules:
                raise Exception('threading is already imported')

            _thread.start_new_thread(import_threading, ())

            # wait until the threading module is imported
            event.acquire()
            event.release()

            if 'threading' not in sys.modules:
                raise Exception('threading is not imported')

            # don't wait until the thread completes
        rr)rArBr	rkrms     rtest_import_from_another_threadz+ThreadTests.test_import_from_another_threadsc 

2(d33Cc"""c"""""rN)0r7r8r9rrorrrrrrrrrrrr
rr)r8r<r?rrGrJrVr]r
skipUnlessrrQrfrhrkrnryr~rrrrrrrrPy_DEBUGrrr:rrr[r[lsD==\=46DD\D".".".H
(
(
( 	 	 	 	 	 	 ###.UUUp
<
<
<!!!B2###(000"NNNB&&&>)))"""<<<6###4777(XY//1JKK;;LK;&XY//1JKK@@LK@6555:!#!#!#F!!!F6666$%$%$\%$N
*
*
*...II\I.HHH"$$$&222X#@AA  BA #####rr[ceZdZdZdZedZedZej	e
jevddZ
edZedZd	S)
ThreadJoinOnShutdowncd|z}td|\}}}|dd}||ddS)Naif 1:
            import sys, os, time, threading

            # a thread, which waits for the main program to terminate
            def joiningfunc(mainthread):
                mainthread.join()
                print('end of thread')
                # stdout is fully buffered because not a tty, we have to flush
                # before exit.
                sys.stdout.flush()
        
rr`rhzend of main
end of thread
ra)r+scriptrrrres      r
_run_and_joinz"ThreadJoinOnShutdown._run_and_joinsd

(f55Czz||##D"--=>>>>>rc4d}||dS)Nzif 1:
            import os
            t = threading.Thread(target=joiningfunc,
                                 args=(threading.current_thread(),))
            t.start()
            time.sleep(0.1)
            print('end of main')
            rr+rs  rtest_1_join_on_shutdownz,ThreadJoinOnShutdown.test_1_join_on_shutdowns%	
6"""""rc4d}||dS)Naif 1:
            from test import support

            childpid = os.fork()
            if childpid != 0:
                # parent process
                support.wait_process(childpid, exitcode=0)
                sys.exit(0)

            # child process
            t = threading.Thread(target=joiningfunc,
                                 args=(threading.current_thread(),))
            t.start()
            print('end of main')
            rrs  rtest_2_join_in_forked_processz2ThreadJoinOnShutdown.test_2_join_in_forked_process	s%	
6"""""rc4d}||dS)Naif 1:
            from test import support

            main_thread = threading.current_thread()
            def worker():
                childpid = os.fork()
                if childpid != 0:
                    # parent process
                    support.wait_process(childpid, exitcode=0)
                    sys.exit(0)

                # child process
                t = threading.Thread(target=joiningfunc,
                                     args=(main_thread,))
                print('end of main')
                t.start()
                t.join() # Should not block: main_thread is already stopped

            w = threading.Thread(target=worker)
            w.start()
            rrs  r!test_3_join_in_forked_from_threadz6ThreadJoinOnShutdown.test_3_join_in_forked_from_threads%
*	
6"""""rzdue to known OS bugc\d}td|\}}}||dS)Naif True:
            import os
            import random
            import sys
            import time
            import threading

            thread_has_run = set()

            def random_io():
                '''Loop for a while sleeping random tiny amounts and doing some I/O.'''
                import test.test_threading as mod
                while True:
                    with open(mod.__file__, 'rb') as in_f:
                        stuff = in_f.read(200)
                        with open(os.devnull, 'wb') as null_f:
                            null_f.write(stuff)
                            time.sleep(random.random() / 1995)
                    thread_has_run.add(threading.current_thread())

            def main():
                count = 0
                for _ in range(40):
                    new_thread = threading.Thread(target=random_io)
                    new_thread.daemon = True
                    new_thread.start()
                    count += 1
                while len(thread_has_run) < count:
                    time.sleep(0.001)
                # Trigger process shutdown
                sys.exit(0)

            main()
            rr	rr+rrrrs     rtest_4_daemon_threadsz*ThreadJoinOnShutdown.test_4_daemon_threads9s;
!D(f55Crcd}g}tdD]@}tj|}|||A|D]}|dS)Nctj}|dkrtj|ddStjddS)Nr2rO)rQrRr
rTrS)rUs rdo_fork_and_waitzIThreadJoinOnShutdown.test_reinit_tls_after_fork.<locals>.do_fork_and_waithsC'))CQww$S2666666rrj)rr!r@rrr)r+rrrrs     rtest_reinit_tls_after_forkz/ThreadJoinOnShutdown.test_reinit_tls_after_forkcs
			r		A (8999ANN1
GGIIII		A
FFHHHH		rcg}tdD]A}tjd}|||Btj}|dkrNttj	dkrtj
dn+tj
dntj|d|D]}|
dS)	Nrc*tjdS)Ng333333?)rKrLr:rrrxzKThreadJoinOnShutdown.test_clear_threads_states_after_fork.<locals>.<lambda>sCrrjrr/34rO)rr!r@rrrQrRrr_current_framesrSr
rTr)r+rrrrUs     r$test_clear_threads_states_after_forkz9ThreadJoinOnShutdown.test_clear_threads_states_after_forkzs
r		A (@(@AAAANN1
GGIIIIgii!883&(())Q.. r2222		A
FFHHHH		rN)r7r8r9rrrrrrskipIfrrrrrrr:rrrrs???"
#
#
####&###6X_S\%668MNN''ON'R,rrc6eZdZdZdZdZedZdS)SubinterpThreadingTestsc
tj\}}|tj||tj|t	tdrtj|d||fS)Nset_blockingF)rQpipercloserr)r+rws   rrzSubinterpThreadingTests.pipesjwyy1!$$$!$$$2~&&	&OAu%%%1v
rc |\}}tjd|fz}tj|}||d|tj|dddS)Na
            import os
            import random
            import threading
            import time

            def random_sleep():
                seconds = random.random() * 0.010
                time.sleep(seconds)

            def f():
                # Sleep a bit so that the thread is still running when
                # Py_EndInterpreter is called.
                random_sleep()
                os.write(%d, b"x")

            threading.Thread(target=f).start()
            random_sleep()
        rr/x	rrArBrr
run_in_subinterprkrQreadr+rrrErs     rtest_threads_joinz)SubinterpThreadingTests.test_threads_joinsyy{{1 $d% &l++D11a   A-----rc |\}}tjd|fz}tj|}||d|tj|dddS)Na
            import os
            import random
            import threading
            import time

            def random_sleep():
                seconds = random.random() * 0.010
                time.sleep(seconds)

            class Sleeper:
                def __del__(self):
                    random_sleep()

            tls = threading.local()

            def f():
                # Sleep a bit so that the thread is still running when
                # Py_EndInterpreter is called.
                random_sleep()
                tls.x = Sleeper()
                os.write(%d, b"x")

            threading.Thread(target=f).start()
            random_sleep()
        rr/rrrs     rtest_threads_join_2z+SubinterpThreadingTests.test_threads_join_2s
yy{{1 2d3 4l++D11a   A-----rc dtjjd}d|d}tj5t	d|\}}}dddn#1swxYwY|d|dS)Nzif 1:
            import os
            import threading
            import time

            def f():
                # Make sure the daemon thread is still running when
                # Py_EndInterpreter is called.
                time.sleep(zJ)
            threading.Thread(target=f, daemon=True).start()
            zKif 1:
            import _testcapi

            _testcapi.run_in_subinterp(z)
            rz:Fatal Python error: Py_EndInterpreter: not the last thread)rr
rSuppressCrashReportr
rrb)r+subinterp_coderrrrs      rtest_daemon_threads_fatal_errorz7SubinterpThreadingTests.test_daemon_threads_fatal_errors
!L6


">>	$
\
-
-
/
/	?	?0v>>LBS	?	?	?	?	?	?	?	?	?	?	?	?	?	?	?

,-0ZZ\\	;	;	;	;	;sAA"AN)r7r8r9rrrrrr:rrrrs]...8#.#.#.J;;\;;;rrcpeZdZdZdZdZdZdZedZ	dZ
dZd	Zd
Z
dZdS)
ThreadingExceptionTestsctj}||t|j|dSr5)r!r@rrRuntimeErrorrr+rns  rtest_start_thread_againz/ThreadingExceptionTests.test_start_thread_againsF!##,555




rcltj}|t|jdSr5)r!rrrr)r+rs  rtest_joining_current_threadz3ThreadingExceptionTests.test_joining_current_threads/"133,(;<<<<<rcltj}|t|jdSr5)r!r@rrrrs  rtest_joining_inactive_threadz4ThreadingExceptionTests.test_joining_inactive_threads.!##,44444rctj}||tt
|dd|dSr:)r!r@rrrr rrs  rtest_daemonize_active_threadz4ThreadingExceptionTests.test_daemonize_active_threadsJ!##,4HHH




rcltj}|t|jdSr5)r!rrrrrs  rtest_releasing_unacquired_lockz6ThreadingExceptionTests.test_releasing_unacquired_locks-~,55555rcd}d}tjtjd|gtjtj}|\}}|dd}||j	dd|z|||dS)	Naif True:
            import threading

            def recurse():
                return recurse()

            def outer():
                try:
                    recurse()
                except RecursionError:
                    pass

            w = threading.Thread(target=outer)
            w.start()
            w.join()
            print('end of main thread')
            zend of main thread
r)stdoutstderrr`rhrzUnexpected error: )

subprocessPopenr
executablePIPEcommunicaterbrcrk
returncode)r+rexpected_outputpr	r
res       rtest_recursion_limitz,ThreadingExceptionTests.test_recursion_limits"1cndF;$.OJO
M
M
M}}&&tR00q*>*PQQQ/////rc6d}td|\}}}||d|}|d||d||d||d|dS)Naif True:
            import threading
            import time

            running = False
            def run():
                global running
                running = True
                while running:
                    time.sleep(0.01)
                1/0
            t = threading.Thread(target=run)
            t.start()
            while not running:
                time.sleep(0.01)
            running = False
            t.join()
            rrException in thread"Traceback (most recent call last):ZeroDivisionErrorUnhandled exceptionr	rkrbrrrs     rtest_print_exceptionz,ThreadingExceptionTests.test_print_exception0s$(f55Cc"""jjll

+S111

:C@@@

)3///.44444rc6d}td|\}}}||d|}|d||d||d||d|dS)Naif True:
            import sys
            import threading
            import time

            running = False
            def run():
                global running
                running = True
                while running:
                    time.sleep(0.01)
                1/0
            t = threading.Thread(target=run)
            t.start()
            while not running:
                time.sleep(0.01)
            sys.stderr = None
            running = False
            t.join()
            rrrrrrrrs     r%test_print_exception_stderr_is_none_1z=ThreadingExceptionTests.test_print_exception_stderr_is_none_1Ks((f55Cc"""jjll

+S111

:C@@@

)3///.44444rcd}td|\}}}||d|d|dS)Naif True:
            import sys
            import threading
            import time

            running = False
            def run():
                global running
                running = True
                while running:
                    time.sleep(0.01)
                1/0
            sys.stderr = None
            t = threading.Thread(target=run)
            t.start()
            while not running:
                time.sleep(0.01)
            running = False
            t.join()
            rrr)r	rkrrbrs     r%test_print_exception_stderr_is_none_2z=ThreadingExceptionTests.test_print_exception_stderr_is_none_2hs[((f55Cc""".

=====rc(dGfddtj}|}||||j||jtd|_dS)Ncr5r:r:rr
bare_raisezOThreadingExceptionTests.test_bare_raise_in_brand_new_thread.<locals>.bare_raisesrceZdZdZfdZdS)OThreadingExceptionTests.test_bare_raise_in_brand_new_thread.<locals>.Issue27558Nc\	dS#t$r}||_Yd}~dSd}~wwxYwr5)rexc)r+r%r!s  rrOzSThreadingExceptionTests.test_bare_raise_in_brand_new_thread.<locals>.Issue27558.runsI#JLLLLL ###"DHHHHHHH#s

+&+)r7r8r9r%rO)r!sr
Issue27558r#s3C
#
#
#
#
#
#
#rr&)r!r@rrrr%rr)r+r&rnr!s   @r#test_bare_raise_in_brand_new_threadz;ThreadingExceptionTests.test_bare_raise_in_brand_new_threads				#	#	#	#	#	#	#)	#	#	#


VZ(((fj,777


rcd|tjtjfdt	dD}|D]*}||+dS)Ncttjdd5}|dt	jddddS#1swxYwYdS)Nrzutf-8)encoding )openrTESTFNwrite	tracebackformat_stack)fps rmodify_filezQThreadingExceptionTests.test_multithread_modify_file_noerror.<locals>.modify_filesi&g>>>
)"


&(((
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)s)AAAc:g|]}tjSr)r!r@)rrr2s  rrzPThreadingExceptionTests.test_multithread_modify_file_noerror.<locals>.<listcomp>s7



K000


rr)rrunlinkr-rrr)r+rrr2s   @r$test_multithread_modify_file_noerrorz<ThreadingExceptionTests.test_multithread_modify_file_noerrors	)	)	)
	
	()*:;;;



3ZZ


		A
GGIII
FFHHHH		rN)r7r8r9rrrrrrrrrrr'r5r:rrrrs>>>555666000>5556555:>>>2*rrceZdZdZdS)
ThreadRunFailc td)N
run failedrr*s rrOzThreadRunFail.runs&&&rNrr:rrr7r7s#'''''rr7c\eZdZfdZdZejdZdZdZ	dZ
dZxZS)ExceptHookTestscft|tdSr5)r$superrU)r+	__class__s rrUzExceptHookTests.setUps&"4(((


rctjd5}td}||dddn#1swxYwY|}|d|jd||d||d||d|dS)	Nr
excepthook threadr>Exception in thread :
#Traceback (most recent call last):
z   raise ValueError("run failed")zValueError: run failed)	r
captured_outputr7rrgetvaluer	rr?)r+r
rns   rtest_excepthookzExceptHookTests.test_excepthooks

$X
.
.	&"(;<<<FLLNNNKKMMM															
""((**

=V[===vFFF

<fEEE

8&AAA

.777779AA!Acdtjd5}	td#t$rR}t	jgt
jd}	t	j|d}n#d}wxYwYd}~nd}~wwxYw	dddn#1swxYwY|	
}|dt	jd||d||d||d|dS)Nr
bugrBrCrDz  raise ValueError("bug")zValueError: bug)
r
rErrr!ExceptHookArgsrexc_inforrFr	rr)r+r
r%rs    rtest_excepthook_thread_Nonez+ExceptHookTests.test_excepthook_thread_Nones
$X
.
.		 &
  '''
 
 
  /0G#,..0G$0GHH (... DD4DKKKKDDDDD

 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 ""((**

GY-@-B-BGGGPPP

<fEEE

16:::

'00000sIB&
B)A=A1.A=1A55A=8B=BBBBcBGddtj}tjd5}|}||dddn#1swxYwY||ddS)NceZdZdZdS)4ExceptHookTests.test_system_exit.<locals>.ThreadExitc.tjddSr.)rexitr*s rrOz8ExceptHookTests.test_system_exit.<locals>.ThreadExit.runsrNrr:rr
ThreadExitrPs#




rrSr
rh)r!r@r
rErrrkrF)r+rSr
rns    rtest_system_exitz ExceptHookTests.test_system_exits					)			

$X
.
.	&Z\\FLLNNNKKMMM															
	
**B/////s3A,,A03A0cdfd}	tjtd|5t}||dddn#1swxYwY|jt|tj
d|jj
j|
j|ddS#dwxYw)Nc|dSr5r:)	hook_argsrs rhookz4ExceptHookTests.test_custom_excepthook.<locals>.hooksDDDrrr9)r
	swap_attrr!r7rrrkexc_typerrr	exc_value
exc_traceback
__traceback__rvrn)r+rXrnrs   @rtest_custom_excepthookz&ExceptHookTests.test_custom_excepthooks9						"9lDAA

&



















T]J777S00,???T/1MNNNMM$+v...DDD4DKKKKs/C?7A(C?(A,,C?/A,0BC??Dc(d}dfd}tjtd|5tjtd|5tjd5}t}||dddn#1swxYwYdddn#1swxYwYdddn#1swxYwY||	d|ddS)Nc td)Nthreading_hook failedr:rs rthreading_hookzCExceptHookTests.test_custom_excepthook_fail.<locals>.threading_hooks4555rc&t|dSr5rs)rZr[r\err_strs   rsys_hookz=ExceptHookTests.test_custom_excepthook_fail.<locals>.sys_hooks)nnGGGrrr
z#Exception in threading.excepthook:
ra)
r
rYr!rrEr7rrrkrF)r+rbrer
rnrds     @rtest_custom_excepthook_failz+ExceptHookTests.test_custom_excepthook_fails	6	6	6	%	%	%	%	%
y,
G
G		

sL(
;
;		

$X
.
.	28"__FLLNNNKKMMM																																														
**?	A	A	A"9:::::sYC	B27BB2BB2"B#B2&C	2B6	6C	9B6	:C		C
C
cdd}d}|}tjtd|5|}tjt_|}dddn#1swxYwY||||||||ddS)Nctjd5}td}||dddn#1swxYwY|S)Nr
rAr>)r
rEr7rrrF)outputrns  r
run_threadz<ExceptHookTests.test_original_excepthook.<locals>.run_thread
s(22
f&,?@@@

















??$$$rHc<tdtjdS)NzRunning a thread failed)file)rIrr
rs rrbz@ExceptHookTests.test_original_excepthook.<locals>.threading_hooks+#*======rrzRunning a thread failed
)r
rYr!r"rrkr)r+rjrbdefault_outputcustom_hook_outputrecovered_outputs      rtest_original_excepthookz(ExceptHookTests.test_original_excepthook	s	%	%	%	>	>	>$

y,
G
G	,	,!+#,#;I )z||	,	,	,	,	,	,	,	,	,	,	,	,	,	,	,
	
)9:::N,>???+-HIIIIIs+A##A'*A')
r7r8r9rUrGr
rrMrTr^rfrp
__classcell__)r?s@rr<r<s
8
8
8
111(000*;;;*JJJJJJJrr<c eZdZdZdZdZdS)
TimerTestscxt|g|_tj|_dSr5)rQrU
callback_argsr!rcallback_eventr*s rrUzTimerTests.setUp!s44   'o//rc~tjd|j}||j|jdd|jd<|j	tjd|j}||j|
t|jd|
|jdifdifg|
|
dS)Nrqblahbarfoorfr:)r!Timer
_callback_spyrrvrrrrclearrkrrur)r+timer1timer2s   r test_init_immutable_default_argsz+TimerTests.test_init_immutable_default_args&st'9::  """6"""$
e!!###t'9::  """T/00!444+r2hR-ABBB







rc|j|dd|f|jdSr5)rurcopyrvr)r+rrs   rr|zTimerTests._callback_spy7sI!!47FKKMM":;;;!!!!!rN)r7r8r9rUrr|r:rrrsrssA000
""""""rrsc.eZdZeejZdS)	LockTestsN)r7r8r9staticmethodr!rlocktyper:rrrr;s|IN++HHHrrc.eZdZeejZdS)PyRLockTestsN)r7r8r9rr!_PyRLockrr:rrrr>s |I.//HHHrrzRLock not implemented in Cc.eZdZeejZdS)CRLockTestsN)r7r8r9rr!_CRLockrr:rrrrAs |I-..HHHrrc.eZdZeejZdS)
EventTestsN)r7r8r9rr!r	eventtyper:rrrrEsY_--IIIrrc4eZdZeejZdZdS)ConditionAsRLockTestsc0|ddS)Nz,Condition does not expose _recursion_count())skipTestr*s rtest_recursion_countz*ConditionAsRLockTests.test_recursion_countLs

DEEEEErN)r7r8r9rr!r2rrr:rrrrHs:|I/00HFFFFFrrc.eZdZeejZdS)ConditionTestsN)r7r8r9rr!r2condtyper:rrrrOs |I/00HHHrrc.eZdZeejZdS)SemaphoreTestsN)r7r8r9rr!	Semaphoresemtyper:rrrrRs l9.//GGGrrc.eZdZeejZdS)BoundedSemaphoreTestsN)r7r8r9rr!rrr:rrrrUs l9566GGGrrc.eZdZeejZdS)BarrierTestsN)r7r8r9rr!Barrierbarriertyper:rrrrXs ,y011KKKrrceZdZdZdS)MiscTestCasecnt|dh}ddh}tj|td||dS)Nrr5r4)r!r)extranot_exported)r$r
check__all__r!)r+rrs   rtest__all__zMiscTestCase.test__all__]sW"4((('7T9.F#(|	E	E	E	E	E	ErN)r7r8r9rr:rrrr\s(EEEEErrcXeZdZdZdZdZdZdZdZdZ	e
jdZd	S)
InterruptMainTestscd}tj||}|tj|||t5t	jddddS#1swxYwYdS)NcddzdS)Nr/rr:)signumrs  rhandlerzLInterruptMainTests.check_interrupt_main_with_signal_handler.<locals>.handlerhs
aCCCCr)signalrrrrinterrupt_main)r+rrold_handlers    r(check_interrupt_main_with_signal_handlerz;InterruptMainTests.check_interrupt_main_with_signal_handlergs			mFG44
v{;;;


0
1
1	%	%"$$$	%	%	%	%	%	%	%	%	%	%	%	%	%	%	%	%	%	%sA55A9<A9cZtj|}	tj|tjtj|tj|tjtj|tj||dS#tj||wxYwr5)r	getsignalSIG_IGNrrSIG_DFL)r+rrs   rcheck_interrupt_main_noerrorz/InterruptMainTests.check_interrupt_main_noerrorqs"6**		+M&&.111"6***M&&.111"6***
M&'*****FM&'****sA&BB*cd}tj|}|t5||dddn#1swxYwY|dS)Nc,tjdSr5)rrr:rrcall_interruptzHInterruptMainTests.test_interrupt_main_subthread.<locals>.call_interrupts"$$$$$rrj)r!r@rKeyboardInterruptrr)r+rrs   rtest_interrupt_main_subthreadz0InterruptMainTests.test_interrupt_main_subthread~s	%	%	%N333


0
1
1		
GGIII
FFHHH																
s)A((A,/A,c|t5tjddddS#1swxYwYdSr5)rrrrr*s rtest_interrupt_main_mainthreadz1InterruptMainTests.test_interrupt_main_mainthreads

0
1
1	%	%"$$$	%	%	%	%	%	%	%	%	%	%	%	%	%	%	%	%	%	%s<AAc|tj|tjdSr5)rrSIGINTSIGTERMr*s r'test_interrupt_main_with_signal_handlerz:InterruptMainTests.test_interrupt_main_with_signal_handlers455fmDDD55fnEEEEErc|tj|tjdSr5)rrrrr*s rtest_interrupt_main_noerrorz.InterruptMainTests.test_interrupt_main_noerrors4))&-888))&.99999rc|ttjd|ttjtj|ttjddS)Nri@B)rrrrrNSIGr*s r"test_interrupt_main_invalid_signalz5InterruptMainTests.test_interrupt_main_invalid_signals[*g&<bAAA*g&<fkJJJ*g&<gFFFFFrcdg}dg}dg}d}tj||||f}||ds		|d	d|d<|||ddS)NTFcTd}d|d<|dr|r|dz}ndS	|dd|d<dS)NiTrr/r:)rtcontinterrupted
iterationss    rworkerzAInterruptMainTests.test_can_interrupt_tight_loops.<locals>.workersT$JGAJq'
!OJJFq'
"KNNNrrr)r!r@rrr)r+rrtrrrs      rtest_can_interrupt_tight_loopsz1InterruptMainTests.test_can_interrupt_tight_loopssv'g		"		"		"
F$0LMMM				!*	!*	Q	A'''''rN)
r7r8r9rrrrrrrrreap_threadsrr:rrrrfs%%%+++			%%%FFF:::GGG
"((#"(((rrc eZdZdZdZdZdS)AtexitTestsctdd\}}}||||ddS)Nrzif True:
            import threading

            def run_last():
                print('parrot')

            threading._register_atexit(run_last)
        sparrot)r	rrkr	rs    rtest_atexit_outputzAtexitTests.test_atexit_outputsX'/

C	
i00000rcXtdd\}}}||dS)NraNif True:
            import threading
            from unittest.mock import Mock

            mock = Mock()
            threading._register_atexit(mock)
            mock.assert_not_called()
            # force early shutdown to ensure it was called once
            threading._shutdown()
            mock.assert_called_once()
        rrs    rtest_atexit_called_oncez#AtexitTests.test_atexit_called_onces:'
/



C	
rctdd\}}}|||d|dS)Nrzif True:
            import threading

            def func():
                pass

            def run_last():
                threading._register_atexit(func)

            threading._register_atexit(run_last)
        z2RuntimeError: can't register atexit after shutdown)r	rrrbrs    rtest_atexit_after_shutdownz&AtexitTests.test_atexit_after_shutdownsb(
/



C	


J

					rN)r7r8r9rrrr:rrrrsA111


rr__main__)@__doc__test.supportrrrrrrtest.support.import_helperrtest.support.script_helperr	r
rHrrr!rKrr"rQrrrAr/rrr
requires_working_threadingrrrrr$rmr&r@r<TestCaserQr[rrrr7r<rsr
RLockTestsrrrrrrrrrrrrrr7r[r:rr<module>rs>>>>>>>>9999999999444444NNNNNNNN







				



++48888+73*++444f<<<<<!<<<B%%%%%8$%%%{
#{
#{
#{
#{
#,{
#{
#{
#|fffff<fffR_;_;_;_;_;l_;_;_;Doooooloood'''''I$'''
pJpJpJpJpJlpJpJpJf""""""""8,,,,,
$,,,00000:(000"d*,HII/////*'//JI/.....&...FFFFFJ1FFF11111Z.11100000Z.00077777J<77722222:*222EEEEE8$EEEM(M(M(M(M(*M(M(M(`/////(#///dzHMOOOOOr