Sindbad~EG File Manager

Current Path : /usr/local/lib/python3.11/test/__pycache__/
Upload File :
Current File : //usr/local/lib/python3.11/test/__pycache__/test_threading.cpython-311.pyc

�

SԚg����dZddlZddlmZmZddlmZmZmZddlm	Z	ddl
mZmZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZddlmZdd	lmZejd
���dZeed
��Zd�Z d�Z!Gd�de"��Z#Gd�dej$��Z%Gd�dej&��Z'Gd�de'��Z(Gd�de'��Z)Gd�de'��Z*Gd�de'��Z+Gd�dej$��Z,Gd �d!e'��Z-Gd"�d#e'��Z.Gd$�d%ej/��Z/Gd&�d'ej0��Z1ej2ej3dud(��Gd)�d*ej0����Z4Gd+�d,ej5��Z5Gd-�d.ej0��Z6Gd/�d0ej7��Z7Gd1�d2ej8��Z8Gd3�d4ej9��Z9Gd5�d6ej:��Z:Gd7�d8ej&��Z;Gd9�d:ej&��Z<Gd;�d<ej&��Z=e>d=krej?��dSdS)>z!
Tests for the threading module.
�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�
�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_support�unittest�skip�sys�platform�platforms_to_skip�HAVE_ASAN_FORK_BUG)�tests �0/usr/local/lib/python3.11/test/test_threading.py�skip_unless_reliable_forkr(s���#�A�:�x�}�9�:�:�4�@�@�@�
�|�(�(�(�J�x�}�I�J�J�4�P�P�P��!�f�_�x�}�^�_�_�`d�e�e�e��K�c��|�ttdtj��tjt_dS)N�
excepthook)�
addCleanup�setattr�	threadingr�__excepthook__)�testcases r�restore_default_excepthookr$2s0�������L�)�:N�O�O�O�$�3�I���rc�&�eZdZd�Zd�Zd�Zd�ZdS)�Counterc��d|_dS)Nr��value��selfs r�__init__zCounter.__init__9s
����
�
�
rc�&�|xjdz
c_dS�N�r(r*s r�inczCounter.inc;����
�
�a��
�
�
�
rc�&�|xjdzc_dSr.r(r*s r�deczCounter.dec=r1rc��|jS�Nr(r*s r�getzCounter.get?s
���z�rN)�__name__�
__module__�__qualname__r,r0r3r6�rrr&r&8sP�������������������rr&c��eZdZd�Zd�ZdS)�
TestThreadc��tj�||���||_||_||_||_dS)N��name)r!�Threadr,r#�sema�mutex�nrunning)r+r?r#rArBrCs      rr,zTestThread.__init__Cs>����!�!�$�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�printr?rArBrCr0r6r#�assertLessEqual�time�sleepr3�assertGreaterEqual)r+�delays  r�runzTestThread.runJs���
���'�)���	,��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)r7r8r9r,rOr:rrr<r<Bs2������!�!�!�<�<�<�<�<rr<c��eZdZd�Zd�ZdS)�BaseTestCasec�6�tj��|_dSr5)r�threading_setup�_threadsr*s r�setUpzBaseTestCase.setUpds��(�8�:�:��
�
�
rc�h�tj|j�tj���dSr5)r�threading_cleanuprTrr
�
reap_childrenr*s r�tearDownzBaseTestCase.tearDowngs,���*�D�M�:�:���"�"�$�$�$�$�$rN)r7r8r9rUrYr:rrrQrQcs2������;�;�;�%�%�%�%�%rrQc���eZdZdZed���Zd�Zed���Zd�Zd�Z	d�Z
d�Zd	�Zd
�Z
d�Zd�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zed���Zed���Zed���Zd�Zeejeed��d��d�����Z eejeed��d��d�����Z!ej"e#j$e%vd��e&j'��ejeed��d��d0d�������Z(d0d�Z)d �Z*d!�Z+d"�Z,d#�Z-d$�Z.ed%���Z/d&�Z0d'�Z1ed(���Z2d)�Z3d*�Z4d+�Z5eje6d,��d-���Z7d.�Z8d/S)1�ThreadTestsi'c���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��dSr5r:r:rr�funcz#ThreadTests.test_name.<locals>.funcq����r�myname1r>�{�123�myname2)�targetr?�_counter�)�return_value�zThread-2rEzThread-3��rdzThread-5 (func))r!r@�assertEqualr?r�patch�object)r+r^�threads   r�	test_namezThreadTests.test_nameosx������!�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�rrc�0����|d��Sr.�rk��argr+s �r�<lambda>z0ThreadTests.test_args_argument.<locals>.<lambda>�s���4�#3�#3�C��#;�#;�rc�0����|d��Sr.rurvs �rrxz0ThreadTests.test_args_argument.<locals>.<lambda>�s���D�$4�$4�S�!�$<�$<�rc�0����|d��S�Nrrrurvs �rrxz0ThreadTests.test_args_argument.<locals>.<lambda>�s���4�#3�#3�C��#?�#?�rc�0����|d��Sr{rurvs �rrxz0ThreadTests.test_args_argument.<locals>.<lambda>�s���D�$4�$4�S�%�$@�$@�rc�2����|dg��Sr.rurvs �rrxz0ThreadTests.test_args_argument.<locals>.<lambda>�s����(8�(8��q�c�(B�(B�rc�0����|d��S)Nrqrurvs �rrxz0ThreadTests.test_args_argument.<locals>.<lambda>�s����(8�(8��d�(C�(C�r�rd�args)�subTestr!r@�start�join)r+�num_list�	num_tuple�str_list�	str_tuple�
list_in_tuple�
tuple_in_list�
test_casesr�rd�ts`          r�test_args_argumentzThreadTests.test_args_argument�s\����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|����dSr5)r!�Lockrr
�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�
rEr(z<thread %d>z^<TestThread\(.*, initial\)>$�
get_native_idc3�$K�|]}|jV��dSr5)�	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&�ranger<�append�assertIsNone�ident�assertRegex�reprr��hasattr�setr��assertNotInrk�lenrrIr��assertFalse�is_alive�assertNotEqual�assertIsNotNoner6)	r+�NUMTASKSrArB�
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������dSr5)r�r!�current_threadr�r�)rGr�s��r�fz9ThreadTests.test_ident_of_no_threading_threads.<locals>.f�s2����L�L��1�3�3�9�:�:�:��H�H�J�J�J�J�Jrr:r)r�r!r�r��Eventr�wait_threads_exit�_thread�start_new_thread�waitrk�_active)r+r��tidrGr�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�	rrIr!�
stack_sizer��errorr�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��|���dSr5)r!r��release)rBs rr�z*ThreadTests.test_foreign_thread.<locals>.f�s$��
�$�&�&�&��M�M�O�O�O�O�Or�_DummyThread)r!r��acquirerr�r�r��assertInr��assertIsInstancer��
assertTruer�r�r�)r+r�rBr�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)r7r8r9r:rr�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�rKrL)r+r��worker_saw_exception�worker_starteds ���rrOz>ThreadTests.test_PyThreadState_SetAsyncExc.<locals>.Worker.run9s����#�-�/�/��� %��
�/�(�&�*�*�,�,�,��
�3����(�� �/�/�/�$(�D�M�(�,�,�.�.�.�.�.�.�/���s�*A� A0�/A0N�r7r8r9rO)r�r�r�s���r�Workerr�8s8�������

/�

/�

/�

/�

/�

/�

/�

/�

/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�	Exceptionr!r�r��int�
assertGreater�failrk�UnboundLocalErrorr�r@�daemonr�rrIr�r�r�r�r�r
�
SHORT_TIMEOUTr�)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���r5)r!�ThreadError�r�s r�fail_new_threadz7ThreadTests.test_limbo_cleanup.<locals>.fail_new_threadis���'�)�)�)rc��dSr5r:r:rrrxz0ThreadTests.test_limbo_cleanup.<locals>.<lambda>n����rrjz:Failed to cleanup _limbo map on failure of Thread.start().)r!�_start_new_threadr@�assertRaisesr�r�r��_limbo)r+r�r�r�s    r�test_limbo_cleanupzThreadTests.test_limbo_cleanupgs���	*�	*�	*�%�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
rk�r+�rc�out�errs    r�test_finalize_running_threadz(ThreadTests.test_finalize_running_threadvsL��	�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	rk�striprs    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��dSr5r:r:rrrxz7ThreadTests.test_enumerate_after_join.<locals>.<lambda>�s��D�rrjz&#1703448 triggered after %d trials: %s)
r!�	enumerater�getswitchintervalr��setswitchintervalr@r�r�r�)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)rdr��kwargs)�should_raiser!r@�_runrnr�)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�dSr5)r�
SystemExit)r+�	other_refrs   rrzIThreadTests.test_no_refcycle_through_target.<locals>.RunSelfFunction._run�s���$�%�$�$�%�%rN)r7r8r9r,rr:rr�RunSelfFunctionr�s2������
$�
$�
$�
%�
%�
%�
%�
%rr F)rz%d references still around)�msgT)	rmr$�weakref�refrnr�r�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 attributer?zuse is_set()zuse notify_all()zuse active_count()zuse current_thread())r!r@�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)r!r@r�r�r�r��r+r�s  r�test_repr_daemonzThreadTests.test_repr_daemonsS�����������4��7�7�+�+�+�����
�
�h��Q���(�(�(�(�(rc��tj��}|�|j��tjd���}|�|j��tjd���}|�|j��dS)NF�r�T)r!r@r�r�r�r;s  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	rk�rstrip�r+�code�_rrs     r�test_fork_at_exitzThreadTests.test_fork_at_exit#sl���� �
�
��('�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	rkrDs     r�test_dummy_thread_after_forkz(ThreadTests.test_dummy_thread_after_fork?sR����&'�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��dSr5r:r:rrrxz6ThreadTests.test_is_alive_after_fork.<locals>.<lambda>er�rrjr�r���exitcode)rrrrrr
r�r!r@r��os�fork�_exitr�r��wait_process)r+rr�r��pids     r�test_is_alive_after_forkz$ThreadTests.test_is_alive_after_forkZs����,�.�.������-�|�<�<�<�	
��&�&�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��dSr5)r�r!�main_threadr�r�r*s�rr�z'ThreadTests.test_main_thread.<locals>.fusG������	� 5� 7� 7� =� )� 8� :� :� @�
B�
B�
B�
B�
Brrj)
r!rZrkr?r�r�r�r@r�r�)r+�mainr��ths`   r�test_main_threadzThreadTests.test_main_threados�����$�&�&�������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

            ident = threading.get_ident()
            pid = os.fork()
            if pid == 0:
                print("current ident", threading.get_ident() == ident)
                main = threading.main_thread()
                print("main", main.name)
                print("main ident", main.ident == ident)
                print("current is main", threading.current_thread() is main)
            else:
                support.wait_process(pid, exitcode=0)
        r��
rhrzHcurrent ident True
main MainThread
main ident True
current is main True
�r	�decode�replacerk�r+rErFrr�datas      r�test_main_thread_after_forkz'ThreadTests.test_main_thread_after_fork|s|����'�t�T�2�2���3���z�z�|�|�#�#�D�"�-�-������c�"�"�"�����2�	3�	3�	3�	3�	3rc��d}td|��\}}}|����dd��}|�|�d��d��|�|d��dS)Na%if 1:
            import os, threading, sys
            from test import support

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

            th = threading.Thread(target=func)
            th.start()
            th.join()
        r�r`rh�utf-8zTcurrent ident True
main Thread-1 (func) Thread
main ident True
current is main True
rards      r�/test_main_thread_after_fork_from_nonmain_threadz;ThreadTests.test_main_thread_after_fork_from_nonmain_thread�s�����*'�t�T�2�2���3���z�z�|�|�#�#�D�"�-�-��������G�,�,�b�1�1�1�����2�	�	�	�	�	r�due to known OS bugFc�$�d|z}tddd|��\}}}|����dd��}|�|���d��|�||rdndd|�d	�zd
z��dS)NaCif 1:
            import os, threading, sys, traceback, _thread
            from test import support

            def func(lock):
                ident = threading.get_ident()
                if %s:
                    # call current_thread() before fork to allocate DummyThread
                    current = threading.current_thread()
                    print("current", current.name, type(current).__name__)
                print("ident in _active", ident in threading._active)
                # flush before fork, so child won't flush it again
                sys.stdout.flush()
                pid = os.fork()
                if pid == 0:
                    print("current ident", threading.get_ident() == ident)
                    main = threading.main_thread()
                    print("main", main.name, type(main).__name__)
                    print("main ident", main.ident == ident)
                    print("current is main", threading.current_thread() is main)
                    print("_dangling", [t.name for t in list(threading._dangling)])
                    # stdout is fully buffered because not a tty,
                    # we have to flush before exit.
                    sys.stdout.flush()
                    try:
                        threading._shutdown()
                        os._exit(0)
                    except:
                        traceback.print_exc()
                        sys.stderr.flush()
                        os._exit(1)
                else:
                    try:
                        support.wait_process(pid, exitcode=0)
                    except Exception:
                        # avoid 'could not acquire lock for
                        # <_io.BufferedWriter name='<stderr>'> at interpreter shutdown,'
                        traceback.print_exc()
                        sys.stderr.flush()
                    finally:
                        lock.release()

            join_lock = _thread.allocate_lock()
            join_lock.acquire()
            th = _thread.start_new_thread(func, (join_lock,))
            join_lock.acquire()
        z-Wzignore::DeprecationWarningr�r`rhzcurrent Dummy-1 _DummyThread
zident in _active �
zmcurrent ident True
main MainThread _MainThread
main ident True
current is main True
_dangling ['MainThread']
ra)r+�create_dummyrErFrrres       r�/test_main_thread_after_fork_from_foreign_threadz;ThreadTests.test_main_thread_after_fork_from_foreign_thread�s���.�\�].��b'�t�-I�4�QU�V�V���3���z�z�|�|�#�#�D�"�-�-����������r�*�*�*�����>J�R�:�:�PR�?�\�?�?�?�@�6�6�	7�	7�	7�	7�	7rc�2�|�d���dS)NT)rm)rn)r+rms  r�-test_main_thread_after_fork_from_dummy_threadz9ThreadTests.test_main_thread_after_fork_from_dummy_thread�s���<�<�$�<�O�O�O�O�Orc���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 Truerf)r	rbrk�
splitlinesrds      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�rrI�r+rErrrs     r�test_finalization_shutdownz&ThreadTests.test_finalization_shutdowns<����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�rKrL��finish�starteds��rr�z'ThreadTests.test_tstate_lock.<locals>.fCs9����O�O�����N�N�����J�t�����rrjrr�F)r��
allocate_lockr�r!r@�assertIs�_tstate_lockr�r�r�r�r�r
r�r�r�)r+r�r��tstate_lockr{r|s    @@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����������dSr5)r�r�rzs��rr�z(ThreadTests.test_repr_stopped.<locals>.ffs)����O�O�����N�N�����rrjr|�stoppedi�ry)
r�r}r�r!r@r�r�r�r�r�rKrLr�)r+r�r��LOOKING_FORr�r{r|s     @@r�test_repr_stoppedzThreadTests.test_repr_stopped`s*�����'�)�)���&�(�(��������������	�	�	�	�	�	�
��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�rj)r!r@r��r�rF�bss  �r�
<listcomp>z;ThreadTests.test_BoundedSemaphore_limit.<locals>.<listcomp>�9���.�.�.��!�'�r�z�:�:�:�.�.�.rc�D��g|]}tj�j�����Sr�)r!r@r�r�s  �rr�z;ThreadTests.test_BoundedSemaphore_limit.<locals>.<listcomp>�r�r)r�r!r�r�r�r��
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����Sr5r:��frame�eventrw�
noop_traces   �rr�z9ThreadTests.test_frame_tstate_tracing.<locals>.noop_trace��	����rc3�K�	dV��)Nr/�	generatorr:r:rrr�z8ThreadTests.test_frame_tstate_tracing.<locals>.generator�s����
"�!�!�!�!�
"rc�X���j�����_t�j��Sr5)�gen�next)�callbackr�s��rr�z7ThreadTests.test_frame_tstate_tracing.<locals>.callback�s(����|�#�(�y�{�{������%�%�%rrrE)r�r�gettrace�settracer!�	_testcapi�call_in_temporary_c_threadr�)r+�	old_tracer�rr�r�r�s    @@@r�test_frame_tstate_tracingz%ThreadTests.test_frame_tstate_tracing�s������	�	�	�	�	�	"�	"�	"�	&�	&�	&�	&�	&�	&�����L�N�N�	���Z� � � �	$���z�*�*�*�
�����0�0��:�:�:��a���
�
����
�
�
�
�
�
�L��#�#�#�#�#��C�L��#�#�#�#���s
�A	B!�!B7c����fd��tj��}	tj���tj��}|��|��tj|��dS#tj|��wxYw)Nc����Sr5r:r�s   �rr�z-ThreadTests.test_gettrace.<locals>.noop_trace�r�r)r!r�r�rk)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��dSr5r:r�s r�fnz'ThreadTests.test_getprofile.<locals>.fn�r_r)r!�
getprofile�
setprofilerk)r+r��old_profiles   r�test_getprofilezThreadTests.test_getprofile�s|������*�,�,��	.�� ��$�$�$����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)FTr>)rdr�)r�r!r�r@r�r�rr��_shutdown_locksr�r�r�)r+r�r�rnr�s     r�test_shutdown_lockszThreadTests.test_shutdown_locks�sH��#�	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	rkrCrs    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�r:r*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)r7r8r9r,r�r�r:rr�
BooleanTargetr��sA������
!�
!�
!�
�
�
�
 �
 �
 �
 �
 rr�rj)rmr!r@r�r�r�r�)r+r�rdrns    r�test_boolean_targetzThreadTests.test_boolean_target�s���
	 �	 �	 �	 �	 �F�	 �	 �	 �������!��0�0�0�����������
�
�
�����
�#�#�#�#�#rc��d�}tj��5tj|������ddd��dS#1swxYwYdS)Nc��dSr5r:r:rr�noopz0ThreadTests.test_leak_without_join.<locals>.noop	r_rrj)rr�r!r@r�)r+r�s  r�test_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�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+rrrr!s     r�test_debug_deprecationz"ThreadTests.test_debug_deprecationsK��(��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)rArBr	rkrus     r�test_import_from_another_threadz+ThreadTests.test_import_from_another_threadsc���� �
�
��2(��d�3�3���C������c�"�"�"�����c�"�"�"�"�"rN)F)9r7r8r9�maxDiffrror�r�r�r�r�r�r�r�r�rrr
rr)r8r<r?rrGrJrVr]r�
skipUnlessr�rQrfri�skipIfrrrr
�
requires_forkrnrprsrvr�r�r�r�r�r�r�r�r�r��Py_DEBUGr�r�r:rrr[r[ls��������G��=�=��\�=�4���6�D�D��\�D�".�".�".�H
(�
(�
(� 	 �	 �	 �	 �	 �	 �#�#�#�.U�U�U�p
<�
<�
<�!�!�!�B���2#�#�#�(0�0�0�"N�N�N�B&�&�&�>)�)�)�"�"�"��<�<���<�6�#�#���#�4�7�7���7�(�����X�����Y�/�/�1J�K�K�3�3�L�K���3�2��X�����Y�/�/�1J�K�K���L�K����@�X�_�S�\�%6�6�8M�N�N��W�����X�����Y�/�/�1J�K�K�<7�<7�<7�L�K���O�N�<7�|P�P�P�P�5�5�5�:!#�!#�!#�F!�!�!�F���66�6�6�$�%$�%$��\�%$�N
*�
*�
*�.�.�.��I�I��\�I�.H�H�H�"$�$�$�&2�2�2��X���#@�A�A� � �B�A� �#�#�#�#�#rr[c��eZdZd�Zd�Zed���Zed���Zej	e
jevd��d���Z
ed���Zed���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�r`rhzend of main
end of thread
ra)r+�scriptrrrres      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_shutdownMs%����	
���6�"�"�"�"�"rc�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_processYs%����	
���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_threadms%��
��*	
���6�"�"�"�"�"rrjc�\�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�rrrs     r�test_4_daemon_threadsz*ThreadJoinOnShutdown.test_4_daemon_threads�s;��
!��D(��f�5�5���C����������rc���d�}g}td��D]@}tj|���}|�|��|����A|D]}|����dS)Nc��tj��}|dkrtj|d���dStjd��dS)Nr�2rO)rQrRr
rTrS)rUs r�do_fork_and_waitzIThreadJoinOnShutdown.test_reinit_tls_after_fork.<locals>.do_fork_and_wait�sC���'�)�)�C��Q�w�w��$�S�2�6�6�6�6�6�6��������r�rj)r�r!r@r�r�r�)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�?)rKrLr:rrrxzKThreadJoinOnShutdown.test_clear_threads_states_after_fork.<locals>.<lambda>�s����C���rrjrr/�3�4rO)r�r!r@r�r�rQrRr�r�_current_framesrSr
rTr�)r+r�r�r�rUs     r�$test_clear_threads_states_after_forkz9ThreadJoinOnShutdown.test_clear_threads_states_after_fork�s���
���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)r7r8r9r�r�rr�r�rr�rrrr�r�r�r:rrr�r�:s�������?�?�?�"
#�
#�
#��#�#���#�&�#�#���#�6�X�_�S�\�%6�6�8M�N�N�'�'�O�N�'�R������,�������rr�c�6�eZdZd�Zd�Zd�Zed���ZdS)�SubinterpThreadingTestsc�
�tj��\}}|�tj|��|�tj|��t	td��rtj|d��||fS)N�set_blockingF)rQ�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�rArBrr
�run_in_subinterprkrQ�read�r+r�r�rEr�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_2s���
�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)rr
r��SuppressCrashReportr
r�rb)r+�subinterp_coder�rrrs      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)r7r8r9r�r�r�rrr:rrr�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��|���dSr5)r!r@r�r��RuntimeErrorr��r+rns  r�test_start_thread_againz/ThreadingExceptionTests.test_start_thread_againHsF���!�#�#�����������,���5�5�5����
�
�
�
�
rc�l�tj��}|�t|j��dSr5)r!r�r�rr�)r+r�s  r�test_joining_current_threadz3ThreadingExceptionTests.test_joining_current_threadNs/��"�1�3�3�����,��(;�<�<�<�<�<rc�l�tj��}|�t|j��dSr5)r!r@r�rr�rs  r�test_joining_inactive_threadz4ThreadingExceptionTests.test_joining_inactive_threadRs.���!�#�#�����,���4�4�4�4�4rc���tj��}|���|�tt
|dd��|���dSr:)r!r@r�r�rr r�rs  r�test_daemonize_active_threadz4ThreadingExceptionTests.test_daemonize_active_threadVsJ���!�#�#�����������,����4�H�H�H����
�
�
�
�
rc�l�tj��}|�t|j��dSr5)r!r�r�rr�r�s  r�test_releasing_unacquired_lockz6ThreadingExceptionTests.test_releasing_unacquired_lock\s-���~�������,���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�stderrr`rhrzUnexpected error: )
�
subprocess�Popenr�
executable�PIPE�communicaterbrcrk�
returncode)r+r��expected_output�prrres       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	rkrbr�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�rrr r!r"r#r�s     r�%test_print_exception_stderr_is_none_1z=ThreadingExceptionTests.test_print_exception_stderr_is_none_1�s�����((��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	rkr�rbr�s     r�%test_print_exception_stderr_is_none_2z=ThreadingExceptionTests.test_print_exception_stderr_is_none_2�s[����((��f�5�5���C������c�"�"�"����.��
�
���=�=�=�=�=rc�(��d��G�fd�dtj��}|��}|���|���|�|j��|�|jt��d|_dS)Nc���r5r:r:rr�
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}~wwxYwr5)r��exc)r+r/r+s  �rrOzSThreadingExceptionTests.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�
�
+�&�+)r7r8r9r/rO)r+s�r�
Issue27558r-�s3��������C�
#�
#�
#�
#�
#�
#�
#rr0)r!r@r�r�r�r/r�r)r+r0rnr+s   @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�rh)�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�)r!r@)r�r�r<s  �rr�zPThreadingExceptionTests.test_multithread_modify_file_noerror.<locals>.<listcomp>�s7���
�
�
��
��K�0�0�0�
�
�
rr)rr�unlinkr7r�r�r�)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)r7r8r9r	rr
rrrrr$r&r(r1r?r:rrrrEs����������>�>�>�5�5�5����6�6�6�����0�0���0�>5�5�5�65�5�5�:>�>�>�2���*����rrc��eZdZd�ZdS)�
ThreadRunFailc� �td���)N�
run failed�r�r*s rrOzThreadRunFail.run�s����&�&�&rNr�r:rrrArA�s#������'�'�'�'�'rrAc�\��eZdZ�fd�Zd�Zejd���Zd�Zd�Z	d�Z
d�Z�xZS)�ExceptHookTestsc�f��t|��t�����dSr5)r$�superrU)r+�	__class__s �rrUzExceptHookTests.setUp�s&���"�4�(�(�(�
���
�
�����rc���tjd��5}td���}|���|���ddd��n#1swxYwY|������}|�d|j�d�|��|�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_outputrAr�r��getvaluer	r�r?)r+rrns   r�test_excepthookzExceptHookTests.test_excepthooks��
�
$�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�bugrLrMrNz  raise ValueError("bug")zValueError: bug)
r
rOr�r�r!�ExceptHookArgsr�exc_inforrPr	r�r�)r+rr/r�s    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 rrOz8ExceptHookTests.test_system_exit.<locals>.ThreadExit.run$s���������rNr�r:rr�
ThreadExitrZ#s#������
�
�
�
�
rr]rrh)r!r@r
rOr�r�rkrP)r+r]rrns    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���|�dSr5r:)�	hook_argsr�s �r�hookz4ExceptHookTests.test_custom_excepthook.<locals>.hook2s����D�D�DrrrC)r
�	swap_attrr!rAr�r�rk�exc_typer�rr�	exc_value�
exc_traceback�
__traceback__r~rn)r+rbrnr�s   @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 failedrDr�s r�threading_hookzCExceptHookTests.test_custom_excepthook_fail.<locals>.threading_hookEs���4�5�5�5rc�&��t|���dSr5rs)rdrerf�err_strs   �r�sys_hookz=ExceptHookTests.test_custom_excepthook_fail.<locals>.sys_hookJs����)�n�n�G�G�Grrrz#Exception in threading.excepthook:
rk)
r
rcr!rrOrAr�r�rkrP)r+rlrorrnrns     @r�test_custom_excepthook_failz+ExceptHookTests.test_custom_excepthook_failDs����	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)NrrKr>)r
rOrAr�r�rP)�outputrns  r�
run_threadz<ExceptHookTests.test_original_excepthook.<locals>.run_threadZs����(��2�2�
�f�&�,?�@�@�@�����������
�
�
�
�
�
�
�
�
�
�
�
�
�
����
�
�
�
��?�?�$�$�$rRc�<�tdtj���dS)NzRunning a thread failed)�file)rIrrr�s rrlz@ExceptHookTests.test_original_excepthook.<locals>.threading_hookas���+�#�*�=�=�=�=�=�=rrzRunning a thread failed
)r
rcr!r"rrkr�)r+rtrl�default_output�custom_hook_output�recovered_outputs      r�test_original_excepthookz(ExceptHookTests.test_original_excepthookYs��	%�	%�	%�	>�	>�	>�$�����
�
�y�,��
G�
G�	,�	,�!+�����#,�#;�I� �)�z�|�|��	,�	,�	,�	,�	,�	,�	,�	,�	,�	,�	,����	,�	,�	,�	,�
	
����)9�:�:�:����N�,>�?�?�?����+�-H�I�I�I�I�Is�+A#�#A'�*A')
r7r8r9rUrQr
rrWr^rhrprz�
__classcell__)rIs@rrFrF�s�������������
8�
8�
8�
��1�1���1�(0�0�0����*;�;�;�*J�J�J�J�J�J�JrrFc� �eZdZd�Zd�Zd�ZdS)�
TimerTestsc�x�t�|��g|_tj��|_dSr5)rQrU�
callback_argsr!r��callback_eventr*s rrUzTimerTests.setUpqs4�����4� � � ����'�o�/�/����rc�~�tjd|j��}|���|j���|j�d��d|jd<|j�	��tjd|j��}|���|j���|�
t|j��d��|�
|jdifdifg��|�
��|�
��dS)Nry�blah�bar�foorfr:)r!�Timer�
_callback_spyr�r�r�r�r�r�clearrkr�rr�)r+�timer1�timer2s   r� test_init_immutable_default_argsz+TimerTests.test_init_immutable_default_argsvs�����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���dSr5)rr��copyr�r�)r+r�rs   rr�zTimerTests._callback_spy�sI����!�!�4����7�F�K�K�M�M�":�;�;�;�����!�!�!�!�!rN)r7r8r9rUr�r�r:rrr}r}osA������0�0�0�
���""�"�"�"�"rr}c�.�eZdZeej��ZdS)�	LockTestsN)r7r8r9�staticmethodr!r��locktyper:rrr�r��s�������|�I�N�+�+�H�H�Hrr�c�.�eZdZeej��ZdS)�PyRLockTestsN)r7r8r9r�r!�_PyRLockr�r:rrr�r��s �������|�I�.�/�/�H�H�Hrr�zRLock not implemented in Cc�.�eZdZeej��ZdS)�CRLockTestsN)r7r8r9r�r!�_CRLockr�r:rrr�r��s �������|�I�-�.�.�H�H�Hrr�c�.�eZdZeej��ZdS)�
EventTestsN)r7r8r9r�r!r��	eventtyper:rrr�r��s��������Y�_�-�-�I�I�Irr�c�4�eZdZeej��Zd�ZdS)�ConditionAsRLockTestsc�0�|�d��dS)Nz,Condition does not expose _recursion_count())�skipTestr*s r�test_recursion_countz*ConditionAsRLockTests.test_recursion_count�s���
�
�D�E�E�E�E�ErN)r7r8r9r�r!r2r�r�r:rrr�r��s:�������|�I�/�0�0�H�F�F�F�F�Frr�c�.�eZdZeej��ZdS)�ConditionTestsN)r7r8r9r�r!r2�condtyper:rrr�r��s �������|�I�/�0�0�H�H�Hrr�c�.�eZdZeej��ZdS)�SemaphoreTestsN)r7r8r9r�r!�	Semaphore�semtyper:rrr�r��s �������l�9�.�/�/�G�G�Grr�c�.�eZdZeej��ZdS)�BoundedSemaphoreTestsN)r7r8r9r�r!r�r�r:rrr�r��s �������l�9�5�6�6�G�G�Grr�c�.�eZdZeej��ZdS)�BarrierTestsN)r7r8r9r�r!�Barrier�barriertyper:rrr�r��s �������,�y�0�1�1�K�K�Krr�c��eZdZd�ZdS)�MiscTestCasec�n�t|��dh}ddh}tj|td||���dS)Nr�r5r4)r!r�)�extra�not_exported)r$r
�check__all__r!)r+r�r�s   r�test__all__zMiscTestCase.test__all__�sW��"�4�(�(�(����'��7����T�9�.F�#(�|�	E�	E�	E�	E�	E�	ErN)r7r8r9r�r:rrr�r��s(������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/rr:)�signumr�s  r�handlerzLInterruptMainTests.check_interrupt_main_with_signal_handler.<locals>.handler�s��
�a�C�C�C�Cr)�signalrr�r!r��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||��wxYwr5)r��	getsignal�SIG_IGNr�r��SIG_DFL)r+r�r�s   r�check_interrupt_main_noerrorz/InterruptMainTests.check_interrupt_main_noerror�s����"�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��dSr5)r�r�r:rr�call_interruptzHInterruptMainTests.test_interrupt_main_subthread.<locals>.call_interrupt�s���"�$�$�$�$�$rrj)r!r@r��KeyboardInterruptr�r�)r+r�r�s   r�test_interrupt_main_subthreadz0InterruptMainTests.test_interrupt_main_subthread�s���	%�	%�	%���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#1swxYwYdSr5)r�r�r�r�r*s r�test_interrupt_main_mainthreadz1InterruptMainTests.test_interrupt_main_mainthread�s����
�
�0�
1�
1�	%�	%��"�$�$�$�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%�	%����	%�	%�	%�	%�	%�	%s�<�A�Ac��|�tj��|�tj��dSr5)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��dSr5)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/r:)r|�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�Nrrr)r!r@r�r�r�)r+r�r|r�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)
r7r8r9r�r�r�r�r�r�r�r�reap_threadsr�r:rrr�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�rkr	rs    r�test_atexit_outputzAtexitTests.test_atexit_outputsX��'��/�
�
���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�rs    r�test_atexit_called_oncez#AtexitTests.test_atexit_called_onces:��'��
/�

�

���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�rbrs    r�test_atexit_after_shutdownz&AtexitTests.test_atexit_after_shutdown$sb��(��
/�

�

���C��	
��������
�
�J��
�
���	�	�	�	�	rN)r7r8r9r�r�r�r:rrr�r�sA������1�1�1�
�
�
�����rr��__main__)@�__doc__�test.supportrrrrrr�test.support.import_helperr�test.support.script_helperr	r
rHrr�r!rKrr"rQrr�rAr9rrr
�requires_working_threadingrr�r�rr$rmr&r@r<�TestCaserQr[r�r�rrArFr}r��
RLockTestsr�r�r�r�r�r�r�r�r�r�r�r�r�r7r[r:rr�<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�$�%�%�%�K#�K#�K#�K#�K#�,�K#�K#�K#�\f�f�f�f�f�<�f�f�f�R_;�_;�_;�_;�_;�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�/�.�.�.�.�.��&�.�.�.�F�F�F�F�F�J�1�F�F�F�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

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists