Current File : //usr/local/apps/python3/lib/python3.11/test/__pycache__/test_threading.cpython-311.opt-2.pyc
�

�Ke�����	ddlZddlmZmZddlmZmZmZddlmZddl	m
Z
mZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZddlmZddlmZejd	�
��dZee
d��Zd
�ZGd�de ��Z!Gd�dej"��Z#Gd�dej$��Z%Gd�de%��Z&Gd�de%��Z'Gd�de%��Z(Gd�de%��Z)Gd�dej"��Z*Gd�de%��Z+Gd �d!e%��Z,Gd"�d#ej-��Z-Gd$�d%ej.��Z/ej0ej1dud&��Gd'�d(ej.����Z2Gd)�d*ej3��Z3Gd+�d,ej.��Z4Gd-�d.ej5��Z5Gd/�d0ej6��Z6Gd1�d2ej7��Z7Gd3�d4ej8��Z8Gd5�d6ej$��Z9Gd7�d8ej$��Z:Gd9�d:ej$��Z;e<d;krej=��dSdS)<�N)�threading_helper�requires_subprocess)�verbose�cpython_only�	os_helper)�
import_module)�assert_python_ok�assert_python_failure)�mock)�
lock_tests)�supportT)�module)�netbsd5zhp-ux11�gettotalrefcountc��|�ttdtj��tjt_dS)N�
excepthook)�
addCleanup�setattr�	threadingr�__excepthook__)�testcases �=/usr/local/apps/python3/lib/python3.11/test/test_threading.py�restore_default_excepthookr(s0�������L�)�:N�O�O�O�$�3�I����c�&�eZdZd�Zd�Zd�Zd�ZdS)�Counterc��d|_dS)Nr��value��selfs r�__init__zCounter.__init__/s
����
�
�
rc�&�|xjdz
c_dS�N�rr s r�inczCounter.inc1����
�
�a��
�
�
�
rc�&�|xjdzc_dSr$rr s r�deczCounter.dec3r'rc��|jS�Nrr s r�getzCounter.get5s
���z�rN)�__name__�
__module__�__qualname__r"r&r)r,�rrrr.sP�������������������rrc��eZdZd�Zd�ZdS)�
TestThreadc��tj�||���||_||_||_||_dS)N��name)r�Threadr"r�sema�mutex�nrunning)r!r5rr7r8r9s      rr"zTestThread.__init__9s>����!�!�$�T�!�2�2�2� ��
���	���
� ��
�
�
rc��tj��dz}trtd|j|dzfz��|j5|j5|j���tr't|j���d��|j	�
|j���d��ddd��n#1swxYwYtj|��trtd|jd��|j5|j�
��|j	�|j���d��tr0td	|j|j���fz��ddd��n#1swxYwYddd��dS#1swxYwYdS)
Ng��@ztask %s will run for %.1f usecg��.Aztasks are running��task�donerz$%s is finished. %d tasks are running)�randomr�printr5r7r8r9r&r,r�assertLessEqual�time�sleepr)�assertGreaterEqual)r!�delays  r�runzTestThread.run@s���
���'�)���	,��2��9�e�c�k�*�+�
,�
,�
,��Y�	<�	<���
F�
F��
�!�!�#�#�#��D��$�-�+�+�-�-�/B�C�C�C��
�-�-�d�m�.?�.?�.A�.A�1�E�E�E�	
F�
F�
F�
F�
F�
F�
F�
F�
F�
F�
F����
F�
F�
F�
F�
�J�u�����
1��f�d�i��0�0�0���
<�
<��
�!�!�#�#�#��
�0�0���1B�1B�1D�1D�a�H�H�H��<��@��9�d�m�&7�&7�&9�&9�:�;�<�<�<�	
<�
<�
<�
<�
<�
<�
<�
<�
<�
<�
<����
<�
<�
<�
<�	<�	<�	<�	<�	<�	<�	<�	<�	<�	<�	<�	<����	<�	<�	<�	<�	<�	<s\�F9�	A:C�F9�C	�F9�C	�;F9�BF!�F9�!F%	�%F9�(F%	�)F9�9F=�F=N)r-r.r/r"rEr0rrr2r28s2������!�!�!�<�<�<�<�<rr2c��eZdZd�Zd�ZdS)�BaseTestCasec�6�tj��|_dSr+)r�threading_setup�_threadsr s r�setUpzBaseTestCase.setUpZs��(�8�:�:��
�
�
rc�h�tj|j�tj���dSr+)r�threading_cleanuprJ�testr
�
reap_childrenr s r�tearDownzBaseTestCase.tearDown]s,���*�D�M�:�:���"�"�$�$�$�$�$rN)r-r.r/rKrPr0rrrGrGYs2������;�;�;�%�%�%�%�%rrGc���eZdZed���Zd�Zed���Zd�Zd�Zd�Z	d�Z
d�Zd	�Zd
�Z
d�Zd�Zd
�Zd�Zd�Zd�Zd�Zd�Zej��d���Zej��d���Zej��d���Zd�Zej��ejeed��d��d�����Z ej!e"j#e$vd��ej��ejeed��d��d�������Z%d�Z&d�Z'd�Z(d�Z)d �Z*ed!���Z+d"�Z,d#�Z-ed$���Z.d%�Z/d&�Z0d'�Z1eje2d(��d)���Z3d*�Z4d+S),�ThreadTestsc���d�}tjd���}|�|jd��tjd���}|�|jd��tj|d���}|�|jd��tj�tdd	�
��5tjd���}|�|jd��ddd��n#1swxYwYtj�tdd
�
��5tj��}|�|jd��ddd��n#1swxYwYtj�tdd�
��5tj|���}|�|jd��ddd��dS#1swxYwYdS)Nc��dSr+r0r0rr�funcz#ThreadTests.test_name.<locals>.funcf����r�myname1r4�{�123�myname2)�targetr5�_counter�)�return_value�zThread-2r;zThread-3��r[zThread-5 (func))rr6�assertEqualr5r�patch�object)r!rU�threads   r�	test_namezThreadTests.test_namedsx������!�y�1�1�1�������i�0�0�0��!�s�+�+�+�������e�,�,�,��!��I�>�>�>�������i�0�0�0�
�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�	6��Z�
�
�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�	6��Z�
�
�y�*�1�
�
E�
E�	=�	=��%�T�2�2�2�F����V�[�*;�<�<�<�	=�	=�	=�	=�	=�	=�	=�	=�	=�	=�	=�	=����	=�	=�	=�	=�	=�	=s6�<1C9�9C=�C=�+/E&�&E*�-E*�1G�G�Gc�`��dg}d}dg}d}dgf}dg}|�fd�f|�fd�f|�fd�f|�fd�f|�fd	�f|�fd
�ff}|D]r\}}	��|	|���5tj|	|���}
|
���|
���ddd��n#1swxYwY�sdS)Nr%�r%�str�ric�0����|d��Sr$�rb��argr!s �r�<lambda>z0ThreadTests.test_args_argument.<locals>.<lambda>�s���4�#3�#3�C��#;�#;�rc�0����|d��Sr$rlrms �rroz0ThreadTests.test_args_argument.<locals>.<lambda>�s���D�$4�$4�S�!�$<�$<�rc�0����|d��S�Nrirlrms �rroz0ThreadTests.test_args_argument.<locals>.<lambda>�s���4�#3�#3�C��#?�#?�rc�0����|d��Srrrlrms �rroz0ThreadTests.test_args_argument.<locals>.<lambda>�s���D�$4�$4�S�%�$@�$@�rc�2����|dg��Sr$rlrms �rroz0ThreadTests.test_args_argument.<locals>.<lambda>�s����(8�(8��q�c�(B�(B�rc�0����|d��S)Nrhrlrms �rroz0ThreadTests.test_args_argument.<locals>.<lambda>�s����(8�(8��d�(C�(C�r�r[�args)�subTestrr6�start�join)r!�num_list�	num_tuple�str_list�	str_tuple�
list_in_tuple�
tuple_in_list�
test_casesrwr[�ts`          r�test_args_argumentzThreadTests.test_args_arguments\����3���	��7���	����
���
��;�;�;�;�<�
�<�<�<�<�=�
�?�?�?�?�@�
�@�@�@�@�A�
�B�B�B�B�C�
�C�C�C�C�D�

�
�'�	�	�L�D�&����V�$��7�7�
�
��$�F��>�>�>�����	�	�	�������
�
�
�
�
�
�
�
�
�
�
����
�
�
�
��	�	s�?B"�"B&	�)B&	c��tj��}tj�|t|����dSr+)r�LockrNr
�check_disallow_instantiation�type�r!�locks  r�test_disallow_instantiationz'ThreadTests.test_disallow_instantiation�s5���~������1�1�$��T�
�
�C�C�C�C�Crc�l�d}tjd���}tj��}t��}g}t	|��D]~}td|z||||��}|�|��|�|j��|�	t|��d��|����ttd��rjtd�|D����tj��hz}|�d|��|�t#|��|dz��t$rt'd	��|D]�}|���|�|�����|�|jd
��|�|j��|�	t|��d����t$rt'd��|�|���d
��dS)
N�
r;rz<thread %d>z^<TestThread\(.*, initial\)>$�
get_native_idc3�$K�|]}|jV��dSr+)�	native_id)�.0r�s  r�	<genexpr>z/ThreadTests.test_various_ops.<locals>.<genexpr>�s$����:�:�Q�Q�[�:�:�:�:�:�:rr%z!waiting for all tasks to completerz#^<TestThread\(.*, stopped -?\d+\)>$zall tasks done)r�BoundedSemaphore�RLockr�ranger2�append�assertIsNone�ident�assertRegex�reprry�hasattr�setr��assertNotInrb�lenrr?rz�assertFalse�is_alive�assertNotEqual�assertIsNotNoner,)	r!�NUMTASKSr7r8�
numrunning�threads�ir��
native_idss	         r�test_various_opszThreadTests.test_various_ops�s�����)��2�2�2����!�!���Y�Y�
����x���	�	�A��=��?�D�$��z�J�J�A��N�N�1�������a�g�&�&�&����T�!�W�W�&F�G�G�G�
�G�G�I�I�I�I��9�o�.�.�	<��:�:�'�:�:�:�:�:�i�>U�>W�>W�=X�X�J����T�:�.�.�.����S��_�_�h��l�;�;�;��	7��5�6�6�6��	N�	N�A�
�F�F�H�H�H����Q�Z�Z�\�\�*�*�*�������+�+�+�� � ���)�)�)����T�!�W�W�&L�M�M�M�M��	$��"�#�#�#�������)�)�1�-�-�-�-�-rc����|�tj��j����fd�}tj���g�tj��5tj|d��}��	��|�
�d|��ddd��n#1swxYwYtj�d=dS)Nc�����tj��j������dSr+)r�r�current_threadr�r�)r=r�s��r�fz9ThreadTests.test_ident_of_no_threading_threads.<locals>.f�s2����L�L��1�3�3�9�:�:�:��H�H�J�J�J�J�Jrr0r)r�rr�r��Eventr�wait_threads_exit�_thread�start_new_thread�waitrb�_active)r!r��tidr=r�s   @@r�"test_ident_of_no_threading_threadsz.ThreadTests.test_ident_of_no_threading_threads�s
�������Y�5�7�7�=�>�>�>�	�	�	�	�	�	��� � ����
�
/�
1�
1�	,�	,��*�1�b�1�1�C��I�I�K�K�K����U�1�X�s�+�+�+�	,�	,�	,�	,�	,�	,�	,�	,�	,�	,�	,����	,�	,�	,�	,�

��e�A�h�'�'�'s�AB.�.B2�5B2c��trtd��	tjd��n'#tj$rt
jd���wxYw|���tjd��dS)Nz!with 256 KiB thread stack size...i�4platform does not support changing thread stack sizer�	rr?r�
stack_sizer��error�unittest�SkipTestr�r s r�test_various_ops_small_stackz(ThreadTests.test_various_ops_small_stack�s����	7��5�6�6�6�	H�� ��(�(�(�(���}�	H�	H�	H��#�F�H�H�
H�	H����	
��������Q������	�-�$Ac��trtd��	tjd��n'#tj$rt
jd���wxYw|���tjd��dS)Nzwith 1 MiB thread stack size...ir�rr�r s r�test_various_ops_large_stackz(ThreadTests.test_various_ops_large_stack�s����	5��3�4�4�4�	H�� ��*�*�*�*���}�	H�	H�	H��#�F�H�H�
H�	H����	
��������Q�����r�c��d�}tj��}|���tj��5tj||f��}|���ddd��n#1swxYwY|�|tj��|�	tj|tj
��|�tj|�����|�
ttj|��d��tj|=dS)Nc�T�tj��|���dSr+)rr��release)r8s rr�z*ThreadTests.test_foreign_thread.<locals>.f�s$��
�$�&�&�&��M�M�O�O�O�O�Or�_DummyThread)rr��acquirerr�r�r��assertInr��assertIsInstancer��
assertTruer�r�r�)r!r�r8r�s    r�test_foreign_threadzThreadTests.test_foreign_thread�sI��	�	�	��� � ��
�
�
����
�
/�
1�
1�	�	��*�1�u�h�7�7�C��M�M�O�O�O�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�	
�
�
�c�9�,�-�-�-����i�/��4�i�6L�M�M�M����	�)�#�.�7�7�9�9�:�:�:�����i�/��4�5�5�~�F�F�F���c�"�"�"s�+A5�5A9�<A9c��	�
��td��}|jj}|j|jf|_Gd�dt���	|��	��}tj��}|�	|t��|�|d��	|||��}		�#�	$rYnwxYw	|�
|d��n#t$rYnwxYwtj���tj���
G�	�
�fd�d	tj��}|��}d|_|���t&rt)d
��t&rt)d��|d|��}|�
|d��t&rt)d
������}|�|��t&rt)d��|�|j��t&rt)d��||j|��}|�
|d��t&rt)d���
�t4j���|�|j��t&rt)d��|jr|���dSdS)N�ctypesc��eZdZdS)�<ThreadTests.test_PyThreadState_SetAsyncExc.<locals>.AsyncExcN)r-r.r/r0rr�AsyncExcr�
s�������Drr�rTzAsyncExc not raisedr%c���eZdZ���fd�ZdS)�:ThreadTests.test_PyThreadState_SetAsyncExc.<locals>.Workerc����tj��|_d|_		����tjd���)#�$rd|_����YdSwxYw)NFTg�������?)r�	get_ident�id�finishedr�rArB)r!r��worker_saw_exception�worker_starteds ���rrEz>ThreadTests.test_PyThreadState_SetAsyncExc.<locals>.Worker.run.s����#�-�/�/��� %��
�/�(�&�*�*�,�,�,��
�3����(�� �/�/�/�$(�D�M�(�,�,�.�.�.�.�.�.�/���s�*A� A0�/A0N�r-r.r/rE)r�r�r�s���r�Workerr�-s8�������

/�

/�

/�

/�

/�

/�

/�

/�

/rr�z    started worker threadz     trying nonsensical thread id���z,    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 exception��timeoutz    all OK -- joining worker)r�	pythonapi�PyThreadState_SetAsyncExc�c_ulong�	py_object�argtypes�	Exceptionrr�r��int�
assertGreater�failrb�UnboundLocalErrorr�r6�daemonryrr?r�r�r�r�r�r
�
SHORT_TIMEOUTrz)r!r��
set_async_exc�	exceptionr��resultr�r��retr�r�r�s         @@@r�test_PyThreadState_SetAsyncExcz*ThreadTests.test_PyThreadState_SetAsyncExcs.������x�(�(���(�B�
�"(�.�&�2B�!C�
��	�	�	�	�	�y�	�	�	��$�$�X�.�.�	��!�#�#�����c�3�'�'�'����3��"�"�"�	-�"�]�3�	�2�2�F�
��
���	�	�	��D�	����	����V�Q�'�'�'�'�� �	�	�	��D�	����#��*�*��(��0�0��	/�	/�	/�	/�	/�	/�	/�	/�	/�Y�%�	/�	/�	/�
�F�H�H�����	���	�	�	��	/��-�.�.�.��	6��4�5�5�5���r�9�-�-�������#�#�#��	B��@�A�A�A��!�!�#�#����������	8��6�7�7�7������$�$�$��	H��F�G�G�G���q�t�Y�/�/�������#�#�#��	K��I�J�J�J��!�!�'�*?�!�@�@�@�����
�#�#�#��	2��0�1�1�1��:�	�
�F�F�H�H�H�H�H�	�	s$�B.�.B6�5B6�:C�
C�Cc�2�d�}tj}|t_	tjd����}|�tj|j��|�|tjvd��|t_dS#|t_wxYw)Nc�(�tj���r+)r�ThreadError�rws r�fail_new_threadz7ThreadTests.test_limbo_cleanup.<locals>.fail_new_thread^s���'�)�)�)rc��dSr+r0r0rrroz0ThreadTests.test_limbo_cleanup.<locals>.<lambda>c����rraz:Failed to cleanup _limbo map on failure of Thread.start().)r�_start_new_threadr6�assertRaisesr�ryr��_limbo)r!r�r�r�s    r�test_limbo_cleanupzThreadTests.test_limbo_cleanup\s���	*�	*�	*�%�7��&5�	�#�	<�� ���5�5�5�A����i�3�Q�W�=�=�=�����Y�%�%�L�
N�
N�
N�+<�I�'�'�'��*;�I�'�;�;�;�;s�AB�Bc�x�td��tdd��\}}}|�|d��dS)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
rb�r!�rc�out�errs    r�test_finalize_running_threadz(ThreadTests.test_finalize_running_threadksL��	�h����,�T�4�����C��2	
����R� � � � � rc�&�tdd��dS)Nr�aPif 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 r�test_finalize_with_tracez$ThreadTests.test_finalize_with_trace�s'��	�� �	�	�	�	�	rc��tdd��\}}}|�|���d��|�|d��dS)Nr�a�if 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	rb�stripr�s    r�test_join_nondaemon_on_shutdownz+ThreadTests.test_join_nondaemon_on_shutdown�sf��(��/�����C��	
��������D�	F�	F�	F�����c�"�"�"�"�"rc��tj}tj��}	t	dd��D]}}tj|dz��tjd����}|���|���|��}|�	||d||fz���~	tj|��dS#tj|��wxYw)Nr%�dg-C��6*?c��dSr+r0r0rrroz7ThreadTests.test_enumerate_after_join.<locals>.<lambda>�s��D�rraz&#1703448 triggered after %d trials: %s)
r�	enumerate�sys�getswitchintervalr��setswitchintervalr6ryrzr�)r!�enum�old_intervalr�r��ls      r�test_enumerate_after_joinz%ThreadTests.test_enumerate_after_join�s����"���,�.�.��
	0��1�c�]�]�
G�
G���%�a�&�j�1�1�1��$�L�L�9�9�9�����	�	�	��������D�F�F��� � ��A�<��1�v�E�G�G�G�G�

G�
�!�,�/�/�/�/�/��C�!�,�/�/�/�/���s�BC�Cc�"�Gd�dt��}t|��|d���}tj|��}|j���~|�|��dtj|����z���|d���}tj|��}|j���~|�|��dtj|����z���dS)Nc��eZdZd�Zd�ZdS)�DThreadTests.test_no_refcycle_through_target.<locals>.RunSelfFunctionc��||_tj|j|fd|i���|_|j���dS)N�yet_another)r[rw�kwargs)�should_raiserr6�_runrery)r!rs  rr"zMThreadTests.test_no_refcycle_through_target.<locals>.RunSelfFunction.__init__�sU��%1��!�'�.�d�i�59�G�7D�T�6J�L�L�L�����!�!�#�#�#�#�#rc�"�|jrt�dSr+)r�
SystemExit)r!�	other_refrs   rrzIThreadTests.test_no_refcycle_through_target.<locals>.RunSelfFunction._run�s���$�%�$�$�%�%rN)r-r.r/r"rr0rr�RunSelfFunctionr�s2������
$�
$�
$�
%�
%�
%�
%�
%rrF)rz%d references still around)�msgT)	rdr�weakref�refrerzr�r�getrefcount)r!r�
cyclic_object�weak_cyclic_object�raising_cyclic_object�weak_raising_cyclic_objects      r�test_no_refcycle_through_targetz+ThreadTests.test_no_refcycle_through_target�sX��	%�	%�	%�	%�	%�f�	%�	%�	%�	#�4�(�(�(�'��U�;�;�;�
�$�[��7�7����!�!�#�#�#�����,�,�.�.�:�!�o�.@�.@�.B�.B�C�C�D�	�	F�	F�	F�!0��T� B� B� B��%,�[�1F�%G�%G�"��$�)�)�+�+�+�!����4�4�6�6�:�!�o�.H�.H�.J�.J�K�K�L�	�	N�	N�	N�	N�	Nrc��tj��}|�td��5|���ddd��n#1swxYwY|�td��5|�d��ddd��n#1swxYwY|�td��5|���ddd��n#1swxYwY|�td��5|�d��ddd��n#1swxYwYtj��}|�td��5|�	��ddd��n#1swxYwYtj
��}|���|�td��5|���ddd��n#1swxYwY|�td	��5tj
��ddd��n#1swxYwY|�td
��5tj��ddd��dS#1swxYwYdS)Nzget the daemon attributezset the daemon attributeTzget the name attributezset the name attributer5zuse is_set()zuse notify_all()zuse active_count()zuse current_thread())rr6�assertWarnsRegex�DeprecationWarning�isDaemon�	setDaemon�getName�setNamer��isSet�	Conditionr��	notifyAll�activeCount�
currentThread)r!r��e�conds    r�test_old_threading_apiz"ThreadTests.test_old_threading_api�sI��
�����
�
"�
"�#5�#>�@�@�	�	�
�J�J�L�L�L�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	��
"�
"�#5�#>�@�@�	�	�
�K�K�����	�	�	�	�	�	�	�	�	�	�	����	�	�	�	��
"�
"�#5�#<�>�>�	�	�
�I�I�K�K�K�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	��
"�
"�#5�#<�>�>�	�	�
�I�I�f����	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�
�O����
�
"�
"�#5�~�
F�
F�	�	�
�G�G�I�I�I�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	��"�$�$��������
�
"�
"�#5�7I�
J�
J�	�	��N�N����	�	�	�	�	�	�	�	�	�	�	����	�	�	�	��
"�
"�#5�7K�
L�
L�	$�	$��!�#�#�#�	$�	$�	$�	$�	$�	$�	$�	$�	$�	$�	$����	$�	$�	$�	$�
�
"�
"�#5�7M�
N�
N�	&�	&��#�%�%�%�	&�	&�	&�	&�	&�	&�	&�	&�	&�	&�	&�	&����	&�	&�	&�	&�	&�	&s��A�A�A�6B�B�B�>C�C#�&C#�D'�'D+�.D+� F�F�F�G/�/G3�6G3�H5�5H9�<H9�I<�<J�Jc���tj��}|�dt|����d|_|�dt|����dS�Nr�T)rr6r�r�r�r��r!r�s  r�test_repr_daemonzThreadTests.test_repr_daemon
sS�����������4��7�7�+�+�+�����
�
�h��Q���(�(�(�(�(rc��tj��}|�|j��tjd���}|�|j��tjd���}|�|j��dS)NF�r�T)rr6r�r�r�r4s  r�test_daemon_paramzThreadTests.test_daemon_params|������������"�"�"���E�*�*�*�������"�"�"���D�)�)�)�������!�!�!�!�!rc���tjd��}td|��\}}}|�|d��|�|���d��dS)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)
        r�rschild process ok)�textwrap�dedentr	rb�rstrip�r!�code�_r�r�s     r�test_fork_at_exitzThreadTests.test_fork_at_exitsl���� �
�
��('�t�T�2�2���3������c�"�"�"���������':�;�;�;�;�;rc��d}td|��\}}}|�|d��|�|d��dS)Na�if 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()
        r�r�r	rbr=s     r�test_dummy_thread_after_forkz(ThreadTests.test_dummy_thread_after_fork4sR����&'�t�T�2�2���3������c�"�"�"�����c�"�"�"�"�"rc��tj��}|�tj|��tj�d��t
d��D]�}tjd����}|�	��tj��}|dkr+tj|�
��rdnd���p|���tj|d�����dS)	Ng���ư>�c��dSr+r0r0rrroz6ThreadTests.test_is_alive_after_fork.<locals>.<lambda>Zr�rrar�r���exitcode)rrrr	rNr
r�rr6ry�os�fork�_exitr�rz�wait_process)r!rr�r��pids     r�test_is_alive_after_forkz$ThreadTests.test_is_alive_after_forkOs����,�.�.������-�|�<�<�<�	
��&�&�t�,�,�,��r���		7�		7�A�� ���5�5�5�A�
�G�G�I�I�I��'�)�)�C��a�x�x���q�z�z�|�|�3����4�4�4�4��������$�S�2�6�6�6�6�6�		7�		7rc���tj��}��|jd����|jtj��j����|jtj�����fd�}tj|���}|���|�	��dS)N�
MainThreadc�����tj��jtj��j��dSr+)r�r�main_threadr�r�r s�rr�z'ThreadTests.test_main_thread.<locals>.fjsG������	� 5� 7� 7� =� )� 8� :� :� @�
B�
B�
B�
B�
Brra)
rrSrbr5r�r�r�r6ryrz)r!�mainr��ths`   r�test_main_threadzThreadTests.test_main_threadds�����$�&�&�������L�1�1�1������Y�%=�%?�%?�%E�F�F�F������Y�%8�%:�%:�;�;�;�	B�	B�	B�	B�	B��
�Q�
'�
'�
'��
���
�
�
�
���	�	�	�	�	r�waitpidztest needs os.waitpid()c���d}td|��\}}}|����dd��}|�|d��|�|d��dS)Na�if 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��
r_rzMainThread
True
True
�r	�decode�replacerb�r!r>r?r�r��datas      r�test_main_thread_after_forkz'ThreadTests.test_main_thread_after_forkqsp����'�t�T�2�2���3���z�z�|�|�#�#�D�"�-�-������c�"�"�"�����9�:�:�:�:�:r�due to known OS bugc���d}td|��\}}}|����dd��}|�|d��|�|d��dS)Na�if 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()
        r�rYr_rzThread-1 (func)
True
True
rZr]s      r�/test_main_thread_after_fork_from_nonmain_threadz;ThreadTests.test_main_thread_after_fork_from_nonmain_thread�sp����*'�t�T�2�2���3���z�z�|�|�#�#�D�"�-�-������c�"�"�"�����>�?�?�?�?�?rc���d}td|��\}}}|���}|�|d��|�|���dgdz��dS)Na�if 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()
        r�rzGC: True True Truer])r	r[rb�
splitlinesr]s      r� test_main_thread_during_shutdownz,ThreadTests.test_main_thread_during_shutdown�s|����('�t�T�2�2���3���z�z�|�|������c�"�"�"�������*�*�.�/�!�3�	5�	5�	5�	5�	5rc�^�d}td|��\}}}|�|d��dS)Na�if 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()
        r�rrB�r!r>r�r�r�s     r�test_finalization_shutdownz&ThreadTests.test_finalization_shutdown�s<����4(��d�3�3���C������c�"�"�"�"�"rc�����tj���tj�������������fd�}tj|���}|�|jd��|�������|�|�	����|j}|�
|�d���d������|�|�tj
���d��|�|�	����|���|�
|�	����|�|j��|���dS)Nc�����������tjd��dS)N�{�G�z�?)r�r�rArB��finish�starteds��rr�z'ThreadTests.test_tstate_lock.<locals>.f�s9����O�O�����N�N�����J�t�����rrarr�F)r��
allocate_lockr�rr6�assertIs�_tstate_lockryr�r�r�r�r
r�r�rz)r!r�r��tstate_lockrmrns    @@r�test_tstate_lockzThreadTests.test_tstate_lock�s������'�)�)���&�(�(��������������	�	�	�	�	�	�

��A�&�&�&���
�
�a�n�d�+�+�+�	���	�	�	�����������
�
���%�%�%��n������,�,�Q�,�7�7��?�?�?�������	
����+�+�G�4I�+�J�J�E�R�R�R�	
����
�
���%�%�%���������������&�&�&����!�.�)�)�)�	�������rc�~���tj���tj�������������fd�}tj|���}|�������|�dt|��������d}td��D])}|t|��vrntjd���*|�|t|����|���dS)Nc�X����������dSr+)r�r�rls��rr�z(ThreadTests.test_repr_stopped.<locals>.f
s)����O�O�����N�N�����rrarn�stoppedi�rk)
r�ror�rr6ryr�r�r�r�rArBrz)r!r�r��LOOKING_FORr�rmrns     @@r�test_repr_stoppedzThreadTests.test_repr_stoppeds*�����'�)�)���&�(�(��������������	�	�	�	�	�	�
��A�&�&�&��	���	�	�	��������
�
�i��a���)�)�)������� ���s���	�	�A��d�1�g�g�%�%����J�t������
�
�k�4��7�7�+�+�+�	�������rc����tdd��D]�}tj|����fd�t|��D��}|D]}|����|D]}|�����fd�t|��D��}|D]}|����|D]}|����|�t�j����dS)Nr%r�c�D��g|]}tj�j�����S�ra)rr6r��r�r?�bss  �r�
<listcomp>z;ThreadTests.test_BoundedSemaphore_limit.<locals>.<listcomp>&�9���.�.�.��!�'�r�z�:�:�:�.�.�.rc�D��g|]}tj�j�����Sr{)rr6r�r|s  �rr~z;ThreadTests.test_BoundedSemaphore_limit.<locals>.<listcomp>,rr)r�rr�ryrzr��
ValueErrorr�)r!�limitr�r�r}s    @r�test_BoundedSemaphore_limitz'ThreadTests.test_BoundedSemaphore_limit"s#����1�b�\�\�	6�	6�E��+�E�2�2�B�.�.�.�.� %�e���.�.�.�G��
�
�����	�	�	�	��
�
���������.�.�.�.� %�e���.�.�.�G��
�
�����	�	�	�	��
�
������������j�"�*�5�5�5�5�	6�	6rc�t�����fd��d����fd��d�_tj��}tj���	t	j���ddl}|����td��D]}����
	tj|��dS#tj|��wxYw)Nc����Sr+r0��frame�eventrn�
noop_traces   �rr�z9ThreadTests.test_frame_tstate_tracing.<locals>.noop_trace<�	����rc3�K�	dV��)Nr%�	generatorr0r0rrr�z8ThreadTests.test_frame_tstate_tracing.<locals>.generator@s����
"�!�!�!�!�
"rc�X���j�����_t�j��Sr+)�gen�next)�callbackr�s��rr�z7ThreadTests.test_frame_tstate_tracing.<locals>.callbackDs(����|�#�(�y�{�{������%�%�%rrr;)r�r�gettrace�settracer�	_testcapi�call_in_temporary_c_threadr�)r!�	old_tracer�rNr�r�r�s    @@@r�test_frame_tstate_tracingz%ThreadTests.test_frame_tstate_tracing4s������	�	�	�	�	�	"�	"�	"�	&�	&�	&�	&�	&�	&�����L�N�N�	���Z� � � �	$���z�*�*�*�
�����0�0��:�:�:��a���
�
����
�
�
�
�
�
�L��#�#�#�#�#��C�L��#�#�#�#���s
�A	B!�!B7c����fd��tj��}	tj���tj��}|��|��tj|��dS#tj|��wxYw)Nc����Sr+r0r�s   �rr�z-ThreadTests.test_gettrace.<locals>.noop_trace]r�r)rr�r�rb)r!r��
trace_funcr�s   @r�
test_gettracezThreadTests.test_gettrace\s����	�	�	�	�	��&�(�(�	�	*���z�*�*�*�"�+�-�-�J����Z�
�3�3�3���y�)�)�)�)�)��I��y�)�)�)�)���s�=A.�.Bc��d�}tj��}	tj|��|�|tj����tj|��dS#tj|��wxYw)Nc��dSr+r0r�s r�fnz'ThreadTests.test_getprofile.<locals>.fnirVr)r�
getprofile�
setprofilerb)r!r��old_profiles   r�test_getprofilezThreadTests.test_getprofilehs|������*�,�,��	.�� ��$�$�$����R��!5�!7�!7�8�8�8�� ��-�-�-�-�-��I� ��-�-�-�-���s�;A)�)A?c��dD�]}|�|���5tj��}tj|j|���}|���|j}|s!|�|tj��n |�	|tj��|�
��|���|�	|tj��ddd��n#1swxYwY��dS)N)FTr7)r[r�)rxrr�r6r�ryrqr��_shutdown_locksr�r�rz)r!r�r�rerrs     r�test_shutdown_lockszThreadTests.test_shutdown_locksqsH��#�	I�	I�F����V��,�,�
I�
I�!��)�)��"�)���F�K�K�K��������$�1���M��M�M�+�y�/H�I�I�I�I��$�$�[�)�2K�L�L�L��	�	�������
�
�
�� � ��i�.G�H�H�H�'
I�
I�
I�
I�
I�
I�
I�
I�
I�
I�
I����
I�
I�
I�
I��	I�	Is�CC=�=D	�D	c�~�tdd��\}}}|�|���d��dS)Nr�a(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	rbr<r�s    r�test_locals_at_exitzThreadTests.test_locals_at_exit�sG��(��/�
�
���C��	
��������'F�G�G�G�G�Grc���Gd�dt��}|��}tj|���}|���|���|�|j��dS)Nc� �eZdZd�Zd�Zd�ZdS)�6ThreadTests.test_boolean_target.<locals>.BooleanTargetc��d|_dS�NF��ranr s rr"z?ThreadTests.test_boolean_target.<locals>.BooleanTarget.__init__�s
�� ����rc��dSr�r0r s r�__bool__z?ThreadTests.test_boolean_target.<locals>.BooleanTarget.__bool__�s���urc��d|_dS)NTr�r s r�__call__z?ThreadTests.test_boolean_target.<locals>.BooleanTarget.__call__�s
������rN)r-r.r/r"r�r�r0rr�
BooleanTargetr��sA������
!�
!�
!�
�
�
�
 �
 �
 �
 �
 rr�ra)rdrr6ryrzr�r�)r!r�r[res    r�test_boolean_targetzThreadTests.test_boolean_target�s���
	 �	 �	 �	 �	 �F�	 �	 �	 �������!��0�0�0�����������
�
�
�����
�#�#�#�#�#rc��d�}tj��5tj|������ddd��dS#1swxYwYdS)Nc��dSr+r0r0rr�noopz0ThreadTests.test_leak_without_join.<locals>.noop�rVrra)rr�rr6ry)r!r�s  r�test_leak_without_joinz"ThreadTests.test_leak_without_join�s���	���
�
/�
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�A�Azneed debug build (Py_DEBUG)c�d�tdddd���\}}}d}|�||��dS)Nz	-Wdefaultr��pass�1)�PYTHONTHREADDEBUGs�DeprecationWarning: The threading debug (PYTHONTHREADDEBUG environment variable) is deprecated and will be removed in Python 3.12)r	r�)r!r�r�r�rs     r�test_debug_deprecationz"ThreadTests.test_debug_deprecation�sK��(��T�6�:=�?�?�?���C��C��	
�
�
�c�3�����rc��tjd��}td|��\}}}|�|d��|�|d��dS)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
        r�r)r:r;r	rbrgs     r�test_import_from_another_threadz+ThreadTests.test_import_from_another_thread�sc���� �
�
��2(��d�3�3���C������c�"�"�"�����c�"�"�"�"�"rN)5r-r.r/rrfr�r�r�r�r�r�r�r�r�r�r�rr
r"r1r5r8r
�
requires_forkr@rCrOrVr��
skipUnlessr�rJr_�skipIfr�platform�platforms_to_skiprbrerhrsrxr�r�r�r�r�r�r�r��Py_DEBUGr�r�r0rrrRrRbs��������=�=��\�=�4���6�D�D��\�D�".�".�".�H
(�
(�
(� 	 �	 �	 �	 �	 �	 �#�#�#�.U�U�U�p
<�
<�
<�!�!�!�B���2#�#�#�(0�0�0�"N�N�N�B&�&�&�>)�)�)�"�"�"��W����<�<���<�6�W����#�#���#�4�W����7�7���7�(����W�����X�����Y�/�/�1J�K�K�;�;�L�K���;�&�X�_�S�\�%6�6�8M�N�N��W�����X�����Y�/�/�1J�K�K�@�@�L�K���O�N�@�65�5�5�:!#�!#�!#�F!�!�!�F���66�6�6�$�%$�%$��\�%$�N
*�
*�
*�.�.�.��I�I��\�I�.H�H�H�"$�$�$�&2�2�2��X���#@�A�A� � �B�A� �#�#�#�#�#rrRc���eZdZd�Zd�Zej��eje	j
evd��d�����Zej��eje	j
evd��d�����Z
eje	j
evd��d���Zej��eje	j
evd��d�����Zej��d���Zd	S)
�ThreadJoinOnShutdownc��d|z}td|��\}}}|����dd��}|�|d��dS)Na�if 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()
        
r�rYr_zend of main
end of thread
rZ)r!�scriptr�r�r�r^s      r�
_run_and_joinz"ThreadJoinOnShutdown._run_and_join�sd��
��
��(��f�5�5���C���z�z�|�|�#�#�D�"�-�-������=�>�>�>�>�>rc�4�d}|�|��dS)Nz�if 1:
            import os
            t = threading.Thread(target=joiningfunc,
                                 args=(threading.current_thread(),))
            t.start()
            time.sleep(0.1)
            print('end of main')
            �r��r!r�s  r�test_1_join_on_shutdownz,ThreadJoinOnShutdown.test_1_join_on_shutdown�s%����	
���6�"�"�"�"�"rr`c�4�d}|�|��dS)Na�if 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')
            r�r�s  r�test_2_join_in_forked_processz2ThreadJoinOnShutdown.test_2_join_in_forked_processs%����	
���6�"�"�"�"�"rc�4�d}|�|��dS)Na�if 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()
            r�r�s  r�!test_3_join_in_forked_from_threadz6ThreadJoinOnShutdown.test_3_join_in_forked_from_threads%����*	
���6�"�"�"�"�"rc�\�d}td|��\}}}|�|��dS)Na�if 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()
            r��r	r��r!r�r�r�r�s     r�test_4_daemon_threadsz*ThreadJoinOnShutdown.test_4_daemon_threads2s;��
!��D(��f�5�5���C����������rc���d�}g}td��D]@}tj|���}|�|��|����A|D]}|����dS)Nc��tj��}|dkrtj|d���dStjd��dS)Nr�2rH)rJrKr
rMrL)rNs r�do_fork_and_waitzIThreadJoinOnShutdown.test_reinit_tls_after_fork.<locals>.do_fork_and_waitbsC���'�)�)�C��Q�w�w��$�S�2�6�6�6�6�6�6��������r�ra)r�rr6r�ryrz)r!r�r�r�r�s     r�test_reinit_tls_after_forkz/ThreadJoinOnShutdown.test_reinit_tls_after_fork\s���	�	�	����r���	�	�A�� �(8�9�9�9�A��N�N�1����
�G�G�I�I�I�I��	�	�A�
�F�F�H�H�H�H�	�	rc���g}td��D]A}tjd����}|�|��|����Btj��}|dkrNttj	����dkrtj
d��n+tj
d��ntj|d���|D]}|�
���dS)	Nr�c�*�tjd��S)Ng333333�?)rArBr0rrrozKThreadJoinOnShutdown.test_clear_threads_states_after_fork.<locals>.<lambda>{s����C���rrarr%�3�4rH)r�rr6r�ryrJrKr�r�_current_framesrLr
rMrz)r!r�r�r�rNs     r�$test_clear_threads_states_after_forkz9ThreadJoinOnShutdown.test_clear_threads_states_after_forkts���
���r���	�	�A�� �(@�(@�A�A�A�A��N�N�1����
�G�G�I�I�I�I��g�i�i���!�8�8��3�&�(�(�)�)�Q�.�.���������������� ��r�2�2�2�2��	�	�A�
�F�F�H�H�H�H�	�	rN)r-r.r/r�r�r
r�r�r�rr�r�r�r�r�r�r�r0rrr�r��sl������?�?�?�"
#�
#�
#��W�����X�_�S�\�%6�6�8M�N�N�#�#�O�N���#�&�W�����X�_�S�\�%6�6�8M�N�N�#�#�O�N���#�6�X�_�S�\�%6�6�8M�N�N�'�'�O�N�'�R�W�����X�_�S�\�%6�6�8M�N�N���O�N����,�W����������rr�c�6�eZdZd�Zd�Zd�Zed���ZdS)�SubinterpThreadingTestsc�
�tj��\}}|�tj|��|�tj|��t	td��rtj|d��||fS)N�set_blockingF)rJ�piper�closer�r�)r!�r�ws   rr�zSubinterpThreadingTests.pipe�sj���w�y�y���1������!�$�$�$������!�$�$�$��2�~�&�&�	&��O�A�u�%�%�%��1�v�
rc� �|���\}}tjd|fz��}tj�|��}|�|d��|�tj|d��d��dS)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�	r�r:r;rNr
�run_in_subinterprbrJ�read�r!r�r�r>r�s     r�test_threads_joinz)SubinterpThreadingTests.test_threads_join�s����y�y�{�{���1��� �$�d�% ����&�l�+�+�D�1�1������a� � � �������A����-�-�-�-�-rc� �|���\}}tjd|fz��}tj�|��}|�|d��|�tj|d��d��dS)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%r�r�r�s     r�test_threads_join_2z+SubinterpThreadingTests.test_threads_join_2�s���
�y�y�{�{���1��� �2�d�3 ����4�l�+�+�D�1�1������a� � � �������A����-�-�-�-�-rc� �dtjj�d�}d|�d�}tj���5t	d|��\}}}ddd��n#1swxYwY|�d|�����dS)Nz�if 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)
            r�z:Fatal Python error: Py_EndInterpreter: not the last thread)rNr
r��SuppressCrashReportr
r�r[)r!�subinterp_coder�r�r�r�s      r�test_daemon_threads_fatal_errorz7SubinterpThreadingTests.test_daemon_threads_fatal_error�s���
�!�L�6�
�
�
���"�>�>�	$��
�\�
-�
-�
/�
/�	?�	?�0��v�>�>�L�B��S�	?�	?�	?�	?�	?�	?�	?�	?�	?�	?�	?����	?�	?�	?�	?��
�
�,�-0�Z�Z�\�\�	;�	;�	;�	;�	;s�A�A�"AN)r-r.r/r�r�r�rr�r0rrr�r��s]���������.�.�.�8#.�#.�#.�J�;�;��\�;�;�;rr�c�p�eZdZd�Zd�Zd�Zd�Zd�Ze��d���Z	d�Z
d�Zd	�Zd
�Z
d�ZdS)
�ThreadingExceptionTestsc��tj��}|���|�t|j��|���dSr+)rr6ryr��RuntimeErrorrz�r!res  r�test_start_thread_againz/ThreadingExceptionTests.test_start_thread_again�sF���!�#�#�����������,���5�5�5����
�
�
�
�
rc�l�tj��}|�t|j��dSr+)rr�r�r�rz)r!r�s  r�test_joining_current_threadz3ThreadingExceptionTests.test_joining_current_thread�s/��"�1�3�3�����,��(;�<�<�<�<�<rc�l�tj��}|�t|j��dSr+)rr6r�r�rzr�s  r�test_joining_inactive_threadz4ThreadingExceptionTests.test_joining_inactive_thread�s.���!�#�#�����,���4�4�4�4�4rc���tj��}|���|�tt
|dd��|���dSr3)rr6ryr�r�rrzr�s  r�test_daemonize_active_threadz4ThreadingExceptionTests.test_daemonize_active_threadsJ���!�#�#�����������,����4�H�H�H����
�
�
�
�
rc�l�tj��}|�t|j��dSr+)rr�r�r�r�r�s  r�test_releasing_unacquired_lockz6ThreadingExceptionTests.test_releasing_unacquired_locks-���~�������,���5�5�5�5�5rc��d}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�)�stdout�stderrrYr_rzUnexpected error: )
�
subprocess�Popenr�
executable�PIPE�communicater[r\rb�
returncode)r!r��expected_output�prrr^s       r�test_recursion_limitz,ThreadingExceptionTests.test_recursion_limit
s�����"1����c�n�d�F�;�$.�O�J�O�
M�
M�
M�����������}�}���&�&�t�R�0�0�������q�*>������*P�Q�Q�Q������/�/�/�/�/rc�6�d}td|��\}}}|�|d��|���}|�d|��|�d|��|�d|��|�d|��dS)Na�if 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()
            r�r�Exception in thread�"Traceback (most recent call last):�ZeroDivisionError�Unhandled exception�r	rbr[r�r�r�s     r�test_print_exceptionz,ThreadingExceptionTests.test_print_exception*s�����$(��f�5�5���C������c�"�"�"��j�j�l�l���
�
�+�S�1�1�1��
�
�:�C�@�@�@��
�
�)�3�/�/�/����.��4�4�4�4�4rc�6�d}td|��\}}}|�|d��|���}|�d|��|�d|��|�d|��|�d|��dS)Na�if 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()
            r�rrrrrrr�s     r�%test_print_exception_stderr_is_none_1z=ThreadingExceptionTests.test_print_exception_stderr_is_none_1Es�����((��f�5�5���C������c�"�"�"��j�j�l�l���
�
�+�S�1�1�1��
�
�:�C�@�@�@��
�
�)�3�/�/�/����.��4�4�4�4�4rc��d}td|��\}}}|�|d��|�d|�����dS)Na�if 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()
            r�rr)r	rbr�r[r�s     r�%test_print_exception_stderr_is_none_2z=ThreadingExceptionTests.test_print_exception_stderr_is_none_2bs[����((��f�5�5���C������c�"�"�"����.��
�
���=�=�=�=�=rc�(��d��G�fd�dtj��}|��}|���|���|�|j��|�|jt��d|_dS)Nc���r+r0r0rr�
bare_raisezOThreadingExceptionTests.test_bare_raise_in_brand_new_thread.<locals>.bare_raise|s��rc���eZdZdZ�fd�ZdS)�OThreadingExceptionTests.test_bare_raise_in_brand_new_thread.<locals>.Issue27558Nc�\��	���dS#t$r}||_Yd}~dSd}~wwxYwr+)r��exc)r!r"rs  �rrEzSThreadingExceptionTests.test_bare_raise_in_brand_new_thread.<locals>.Issue27558.run�sI���#��J�L�L�L�L�L�� �#�#�#�"�D�H�H�H�H�H�H�H�����#���s�
�
+�&�+)r-r.r/r"rE)rs�r�
Issue27558r s3��������C�
#�
#�
#�
#�
#�
#�
#rr#)rr6ryrzr�r"r�r�)r!r#rers   @r�#test_bare_raise_in_brand_new_threadz;ThreadingExceptionTests.test_bare_raise_in_brand_new_thread{s����	�	�	�	#�	#�	#�	#�	#�	#�	#��)�	#�	#�	#���������������
�
�
����V�Z�(�(�(����f�j�,�7�7�7���
�
�
rc����d��|�tjtj���fd�t	d��D��}|D]*}|���|����+dS)Nc��ttjdd���5}|�d��t	j��ddd��dS#1swxYwYdS)Nr�zutf-8)�encoding� )�openr�TESTFN�write�	traceback�format_stack)�fps r�modify_filezQThreadingExceptionTests.test_multithread_modify_file_noerror.<locals>.modify_file�s����i�&��g�>�>�>�
)�"�����
�
�
��&�(�(�(�
)�
)�
)�
)�
)�
)�
)�
)�
)�
)�
)�
)����
)�
)�
)�
)�
)�
)s�)A�A�Ac�:��g|]}tj������Sr{)rr6)r�r�r/s  �rr~zPThreadingExceptionTests.test_multithread_modify_file_noerror.<locals>.<listcomp>�s7���
�
�
��
��K�0�0�0�
�
�
rr)rr�unlinkr*r�ryrz)r!r�r�r/s   @r�$test_multithread_modify_file_noerrorz<ThreadingExceptionTests.test_multithread_modify_file_noerror�s����	)�	)�	)�
	
���	�(�)�*:�;�;�;�
�
�
�
��3�Z�Z�
�
�
���	�	�A�
�G�G�I�I�I�
�F�F�H�H�H�H�	�	rN)r-r.r/r�r�rrrrrrrrr$r2r0rrr�r��s����������>�>�>�5�5�5����6�6�6�����0�0���0�>5�5�5�65�5�5�:>�>�>�2���*����rr�c��eZdZd�ZdS)�
ThreadRunFailc� �td���)N�
run failed�r�r s rrEzThreadRunFail.run�s����&�&�&rNr�r0rrr4r4�s#������'�'�'�'�'rr4c�\��eZdZ�fd�Zd�Zejd���Zd�Zd�Z	d�Z
d�Z�xZS)�ExceptHookTestsc�f��t|��t�����dSr+)r�superrK)r!�	__class__s �rrKzExceptHookTests.setUp�s&���"�4�(�(�(�
���
�
�����rc���tjd��5}td���}|���|���ddd��n#1swxYwY|������}|�d|j�d�|��|�d|��|�d|��|�d|��dS)	Nr�excepthook threadr4�Exception in thread �:
�#Traceback (most recent call last):
z   raise ValueError("run failed")zValueError: run failed)	r
�captured_outputr4ryrz�getvaluerr�r5)r!rres   r�test_excepthookzExceptHookTests.test_excepthook�s��
�
$�X�
.�
.�	�&�"�(;�<�<�<�F��L�L�N�N�N��K�K�M�M�M�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�
���"�"�(�(�*�*���
�
�=�V�[�=�=�=�v�F�F�F��
�
�<�f�E�E�E��
�
�8�&�A�A�A��
�
�.��7�7�7�7�7��9A�A�!Ac�d�tjd��5}	td���#t$rR}t	jgt
j���d���}	t	j|��d}n#d}wxYwYd}~nd}~wwxYw	ddd��n#1swxYwY|�	���
��}|�dt	j���d�|��|�d|��|�d|��|�d|��dS)Nr�bugr?r@rAz  raise ValueError("bug")zValueError: bug)
r
rBr�r�r�ExceptHookArgsr�exc_inforrCrr�r�)r!rr"rws    r�test_excepthook_thread_Nonez+ExceptHookTests.test_excepthook_thread_None�s����
$�X�
.�
.�		 �&�
 � ��'�'�'���
 �
 �
 � �/�0G�#�,�.�.�0G�$�0G�H�H�� ��(��.�.�.� �D�D��4�D�K�K�K�K�D�D�D�D�D�����

 �����		 �		 �		 �		 �		 �		 �		 �		 �		 �		 �		 ����		 �		 �		 �		 ����"�"�(�(�*�*���
�
�G�Y�-@�-B�-B�G�G�G��P�P�P��
�
�<�f�E�E�E��
�
�1�6�:�:�:��
�
�'��0�0�0�0�0sI�B�&�
B�)A=�A1�.A=�1A5�5A=�8B�=B�B�B�Bc�B�Gd�dtj��}tjd��5}|��}|���|���ddd��n#1swxYwY|�|���d��dS)Nc��eZdZd�ZdS)�4ExceptHookTests.test_system_exit.<locals>.ThreadExitc�.�tjd��dSr$)r�exitr s rrEz8ExceptHookTests.test_system_exit.<locals>.ThreadExit.run�s���������rNr�r0rr�
ThreadExitrM�s#������
�
�
�
�
rrPrr_)rr6r
rBryrzrbrC)r!rPrres    r�test_system_exitz ExceptHookTests.test_system_exit�s���	�	�	�	�	��)�	�	�	�
�
$�X�
.�
.�	�&��Z�\�\�F��L�L�N�N�N��K�K�M�M�M�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�
	
������*�*�B�/�/�/�/�/s�3A,�,A0�3A0c���d��fd�}	tjtd|��5t��}|���|���ddd��n#1swxYwY|��jt��|�t�j
��d��|��j�j
j��|�
�j|��d�dS#d�wxYw)Nc���|�dSr+r0)�	hook_argsrws �r�hookz4ExceptHookTests.test_custom_excepthook.<locals>.hook�s����D�D�Drrr6)r
�	swap_attrrr4ryrzrb�exc_typer�ri�	exc_value�
exc_traceback�
__traceback__rpre)r!rUrerws   @r�test_custom_excepthookz&ExceptHookTests.test_custom_excepthook�s9�����	�	�	�	�	�	��"�9�l�D�A�A�
�
�&�������������
�
�
�
�
�
�
�
�
�
�
�
�
�
����
�
�
�
�

���T�]�J�7�7�7����S���0�0�,�?�?�?����T�/���1M�N�N�N��M�M�$�+�v�.�.�.��D�D�D��4�D�K�K�K�Ks/�C?�7A(�C?�(A,�,C?�/A,�0BC?�?Dc�(��d�}d��fd�}tjtd|��5tjtd|��5tjd��5}t��}|���|���ddd��n#1swxYwYddd��n#1swxYwYddd��n#1swxYwY|�|�	��d��|��d��dS)Nc� �td���)N�threading_hook failedr7r�s r�threading_hookzCExceptHookTests.test_custom_excepthook_fail.<locals>.threading_hook�s���4�5�5�5rc�&��t|���dSr+rj)rWrXrY�err_strs   �r�sys_hookz=ExceptHookTests.test_custom_excepthook_fail.<locals>.sys_hook�s����)�n�n�G�G�Grrrz#Exception in threading.excepthook:
r^)
r
rVrrrBr4ryrzrbrC)r!r_rbrreras     @r�test_custom_excepthook_failz+ExceptHookTests.test_custom_excepthook_fail�s����	6�	6�	6���	%�	%�	%�	%�	%��
�y�,��
G�
G�	�	�
�
�s�L�(�
;�
;�	�	�
�
$�X�
.�
.�	�28�"�_�_�F��L�L�N�N�N��K�K�M�M�M�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�	
������*�*�?�	A�	A�	A�����"9�:�:�:�:�:sY�C	�B2�7B�B2�B�B2�"B�#B2�&C	�2B6	�6C	�9B6	�:C	�	C
�C
c�d�d�}d�}|��}tjtd|��5|��}tjt_|��}ddd��n#1swxYwY|�||��|�||��|�|d��dS)Nc���tjd��5}td���}|���|���ddd��n#1swxYwY|���S)Nrr>r4)r
rBr4ryrzrC)�outputres  r�
run_threadz<ExceptHookTests.test_original_excepthook.<locals>.run_threads����(��2�2�
�f�&�,?�@�@�@�����������
�
�
�
�
�
�
�
�
�
�
�
�
�
����
�
�
�
��?�?�$�$�$rEc�<�tdtj���dS)NzRunning a thread failed)�file)r?rrr�s rr_z@ExceptHookTests.test_original_excepthook.<locals>.threading_hooks���+�#�*�=�=�=�=�=�=rrzRunning a thread failed
)r
rVrrrrbr�)r!rgr_�default_output�custom_hook_output�recovered_outputs      r�test_original_excepthookz(ExceptHookTests.test_original_excepthooks��	%�	%�	%�	>�	>�	>�$�����
�
�y�,��
G�
G�	,�	,�!+�����#,�#;�I� �)�z�|�|��	,�	,�	,�	,�	,�	,�	,�	,�	,�	,�	,����	,�	,�	,�	,�
	
����)9�:�:�:����N�,>�?�?�?����+�-H�I�I�I�I�Is�+A#�#A'�*A')
r-r.r/rKrDr
rrJrQr[rcrm�
__classcell__)r<s@rr9r9�s�������������
8�
8�
8�
��1�1���1�(0�0�0����*;�;�;�*J�J�J�J�J�J�Jrr9c� �eZdZd�Zd�Zd�ZdS)�
TimerTestsc�x�t�|��g|_tj��|_dSr+)rGrK�
callback_argsrr��callback_eventr s rrKzTimerTests.setUps4�����4� � � ����'�o�/�/����rc�~�tjd|j��}|���|j���|j�d��d|jd<|j�	��tjd|j��}|���|j���|�
t|j��d��|�
|jdifdifg��|�
��|�
��dS)Nrk�blah�bar�foor]r0)r�Timer�
_callback_spyryrsr�rwr�r�clearrbr�rrrz)r!�timer1�timer2s   r� test_init_immutable_default_argsz+TimerTests.test_init_immutable_default_args s�����t�'9�:�:���������� � �"�"�"�����6�"�"�"�$��
�e����!�!�#�#�#����t�'9�:�:���������� � �"�"�"�����T�/�0�0�!�4�4�4�����+�r�2�h��R��-A�B�B�B����
�
�
����
�
�
�
�
rc��|j�|dd�|���f��|j���dSr+)rrr��copyrsr�)r!rwrs   rryzTimerTests._callback_spy1sI����!�!�4����7�F�K�K�M�M�":�;�;�;�����!�!�!�!�!rN)r-r.r/rKr}ryr0rrrprpsA������0�0�0�
���""�"�"�"�"rrpc�.�eZdZeej��ZdS)�	LockTestsN)r-r.r/�staticmethodrr��locktyper0rrr�r�5s�������|�I�N�+�+�H�H�Hrr�c�.�eZdZeej��ZdS)�PyRLockTestsN)r-r.r/r�r�_PyRLockr�r0rrr�r�8s �������|�I�.�/�/�H�H�Hrr�zRLock not implemented in Cc�.�eZdZeej��ZdS)�CRLockTestsN)r-r.r/r�r�_CRLockr�r0rrr�r�;s �������|�I�-�.�.�H�H�Hrr�c�.�eZdZeej��ZdS)�
EventTestsN)r-r.r/r�rr��	eventtyper0rrr�r�?s��������Y�_�-�-�I�I�Irr�c�.�eZdZeej��ZdS)�ConditionAsRLockTestsN)r-r.r/r�rr+r�r0rrr�r�Bs �������|�I�/�0�0�H�H�Hrr�c�.�eZdZeej��ZdS)�ConditionTestsN)r-r.r/r�rr+�condtyper0rrr�r�Fs �������|�I�/�0�0�H�H�Hrr�c�.�eZdZeej��ZdS)�SemaphoreTestsN)r-r.r/r�r�	Semaphore�semtyper0rrr�r�Is �������l�9�.�/�/�G�G�Grr�c�.�eZdZeej��ZdS)�BoundedSemaphoreTestsN)r-r.r/r�rr�r�r0rrr�r�Ls �������l�9�5�6�6�G�G�Grr�c�.�eZdZeej��ZdS)�BarrierTestsN)r-r.r/r�r�Barrier�barriertyper0rrr�r�Os �������,�y�0�1�1�K�K�Krr�c��eZdZd�ZdS)�MiscTestCasec�n�t|��dh}ddh}tj|td||���dS)Nr�r.r-)rr�)�extra�not_exported)rr
�check__all__r)r!r�r�s   r�test__all__zMiscTestCase.test__all__TsW��"�4�(�(�(����'��7����T�9�.F�#(�|�	E�	E�	E�	E�	E�	ErN)r-r.r/r�r0rrr�r�Ss(������E�E�E�E�Err�c�X�eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z	e
jd���Zd	S)
�InterruptMainTestsc��d�}tj||��}|�tj||��|�t��5t	j��ddd��dS#1swxYwYdS)Nc��ddzdS)Nr%rr0)�signumr�s  r�handlerzLInterruptMainTests.check_interrupt_main_with_signal_handler.<locals>.handler_s��
�a�C�C�C�Cr)�signalrr�rr��interrupt_main)r!r�r��old_handlers    r�(check_interrupt_main_with_signal_handlerz;InterruptMainTests.check_interrupt_main_with_signal_handler^s���	�	�	��m�F�G�4�4������
�v�{�;�;�;�
�
�
�0�
1�
1�	%�	%��"�$�$�$�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%����	%�	%�	%�	%�	%�	%s�A5�5A9�<A9c�Z�tj|��}	tj|tj��tj|��tj|tj��tj|��tj||��dS#tj||��wxYwr+)r��	getsignal�SIG_IGNr�r��SIG_DFL)r!r�r�s   r�check_interrupt_main_noerrorz/InterruptMainTests.check_interrupt_main_noerrorhs����"�6�*�*��		+��M�&�&�.�1�1�1��"�6�*�*�*��M�&�&�.�1�1�1��"�6�*�*�*�
�M�&�'�*�*�*�*�*��F�M�&�'�*�*�*�*���s�A&B�B*c��d�}tj|���}|�t��5|���|���ddd��n#1swxYwY|���dS)Nc�,�tj��dSr+)r�r�r0rr�call_interruptzHInterruptMainTests.test_interrupt_main_subthread.<locals>.call_interruptxs���"�$�$�$�$�$rra)rr6r��KeyboardInterruptryrz)r!r�r�s   r�test_interrupt_main_subthreadz0InterruptMainTests.test_interrupt_main_subthreadus���	%�	%�	%���N�3�3�3��
�
�
�0�
1�
1�	�	�
�G�G�I�I�I�
�F�F�H�H�H�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�	
�������s�)A(�(A,�/A,c��|�t��5tj��ddd��dS#1swxYwYdSr+)r�r�r�r�r s r�test_interrupt_main_mainthreadz1InterruptMainTests.test_interrupt_main_mainthread�s����
�
�0�
1�
1�	%�	%��"�$�$�$�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%����	%�	%�	%�	%�	%�	%s�<�A�Ac��|�tj��|�tj��dSr+)r�r��SIGINT�SIGTERMr s r�'test_interrupt_main_with_signal_handlerz:InterruptMainTests.test_interrupt_main_with_signal_handler�s4���5�5�f�m�D�D�D��5�5�f�n�E�E�E�E�Erc��|�tj��|�tj��dSr+)r�r�r�r�r s r�test_interrupt_main_noerrorz.InterruptMainTests.test_interrupt_main_noerror�s4���)�)�&�-�8�8�8��)�)�&�.�9�9�9�9�9rc��|�ttjd��|�ttjtj��|�ttjd��dS)Nr�i@B)r�r�r�r�r��NSIGr s r�"test_interrupt_main_invalid_signalz5InterruptMainTests.test_interrupt_main_invalid_signal�s[�����*�g�&<�b�A�A�A����*�g�&<�f�k�J�J�J����*�g�&<�g�F�F�F�F�Frc��dg}dg}dg}d�}tj||||f���}|���|ds		|d�	d|d<|���|�|d��dS)NTFc�T�d}d|d<|dr|r|dz}ndS	|d�d|d<dS)Ni�Trr%r0)rn�cont�interrupted�
iterationss    r�workerzAInterruptMainTests.test_can_interrupt_tight_loops.<locals>.worker�sT��$�J��G�A�J��q�'�
����!�O�J�J��F���q�'�
�"�K��N�N�Nrrvr)rr6ryrzr�)r!r�rnr�r�r�s      r�test_can_interrupt_tight_loopsz1InterruptMainTests.test_can_interrupt_tight_loops�s����v���'���g��		"�		"�		"�
��F��$��0L�M�M�M��	���	�	�	��!�*�	���!�*�	���Q��	����������A��'�'�'�'�'rN)
r-r.r/r�r�r�r�r�r�r�r�reap_threadsr�r0rrr�r�]s�������%�%�%�+�+�+�	�	�	�%�%�%�F�F�F�:�:�:�G�G�G�
�"�(�(�#�"�(�(�(rr�c� �eZdZd�Zd�Zd�ZdS)�AtexitTestsc��tdd��\}}}|�|��|�|���d��dS)Nr�z�if True:
            import threading

            def run_last():
                print('parrot')

            threading._register_atexit(run_last)
        sparrot)r	r�rbrr�s    r�test_atexit_outputzAtexitTests.test_atexit_output�sX��'��/�
�
���C��	
���������������i�0�0�0�0�0rc�X�tdd��\}}}|�|��dS)Nr�aNif 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()
        r�r�s    r�test_atexit_called_oncez#AtexitTests.test_atexit_called_once�s:��'��
/�

�

���C��	
��������rc��tdd��\}}}|�|��|�d|�����dS)Nr�z�if 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	r�r�r[r�s    r�test_atexit_after_shutdownz&AtexitTests.test_atexit_after_shutdown�sb��(��
/�

�

���C��	
��������
�
�J��
�
���	�	�	�	�	rN)r-r.r/r�r�r�r0rrr�r��sA������1�1�1�
�
�
�����rr��__main__)>�test.supportrNrrrrr�test.support.import_helperr�test.support.script_helperr	r
r>rr�rrAr�rrJrr�r:r,rrr
�requires_working_threadingr�r�r�rrdrr6r2�TestCaserGrRr�r�r�r4r9rpr��
RLockTestsr�r�r�r�r�r�r�r�r�r�r�r�r�r-rTr0rr�<module>r�s��������>�>�>�>�>�>�>�>�9�9�9�9�9�9�9�9�9�9�4�4�4�4�4�4�N�N�N�N�N�N�N�N�
�
�
�
�
�
�
�
���������������������	�	�	�	�����
�
�
�
���������������������������+��+�4�8�8�8�8�+���7�3�*�+�+��4�4�4������f����<�<�<�<�<��!�<�<�<�B%�%�%�%�%�8�$�%�%�%�|
#�|
#�|
#�|
#�|
#�,�|
#�|
#�|
#�~i�i�i�i�i�<�i�i�i�X_;�_;�_;�_;�_;�l�_;�_;�_;�Do�o�o�o�o�l�o�o�o�d'�'�'�'�'�I�$�'�'�'�
pJ�pJ�pJ�pJ�pJ�l�pJ�pJ�pJ�f"�"�"�"�"��"�"�"�8,�,�,�,�,�
�$�,�,�,�0�0�0�0�0�:�(�0�0�0�����"�d�*�,H�I�I�/�/�/�/�/�*�'�/�/�J�I�/�.�.�.�.�.��&�.�.�.�1�1�1�1�1�J�1�1�1�1�1�1�1�1�1�Z�.�1�1�1�0�0�0�0�0�Z�.�0�0�0�7�7�7�7�7�J�<�7�7�7�2�2�2�2�2�:�*�2�2�2�E�E�E�E�E�8�$�E�E�E�M(�M(�M(�M(�M(��*�M(�M(�M(�`/�/�/�/�/�(�#�/�/�/�d�z����H�M�O�O�O�O�O��r