HEX
Server: LiteSpeed
System: Linux server.nevid-deploma.com 4.18.0-553.111.1.lve.el8.x86_64 #1 SMP Fri Mar 13 13:42:17 UTC 2026 x86_64
User: smilepac (1037)
PHP: 8.1.34
Disabled: NONE
Upload Files
File: //opt/cppython/lib/python3.8/test/__pycache__/_test_multiprocessing.cpython-38.pyc
U

.D�g���@slddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZej�d�Ze��ddlZddlZddl Zddl!Zddl"Zddl#Zddl$Zddlm%Z%zddlm&Z&e&j'Z(Wne)k
�rLdZ(YnXzddl*m+Z+m,Z,dZ-Wne)k
�r�dZ-YnXzdd	lm.Z.dZ/Wne)k
�r�dZ/YnXzddl0Z0Wne)k
�r�dZ0YnXd
Z1dd�Z2d
d�Z3dd�Z4ej5dk�rddlm6Z6dd�Z7e%j8Z9dZ:dZ;e;�r6d\Z<Z=Z>n
d\Z<Z=Z>e?edd�Z@ejAdkZBddlmCZCdd�ZDze�Ed�ZFWndZFYnXdd gZGzdd!lHmIZImJZJmKZKmLZLWn&e)k
�r�eMZIdZJZKZLYnXd"d#�ZNGd$d%�d%eM�ZOGd&d'�d'eM�ZPd(d)�ZQGd*d+�d+�ZRGd,d-�d-eP�ZSGd.d/�d/ejT�ZUGd0d1�d1eP�ZVd2d3�ZWd4d5�ZXGd6d7�d7eP�ZYGd8d9�d9eP�ZZGd:d;�d;eP�Z[Gd<d=�d=eP�Z\Gd>d?�d?eP�Z]Gd@dA�dAeM�Z^dBdC�Z_GdDdE�dEeM�Z`GdFdG�dGeM�ZaGdHdI�dIeP�ZbGdJdK�dKeP�ZcGdLdM�dMeP�ZdGdNdO�dOeP�Zed�dQdR�ZfdSdT�ZgdUdV�ZhdWdX�ZiGdYdZ�dZeM�ZjGd[d\�d\ek�Zld]d^�ZmGd_d`�d`eP�Zndadb�Zodcdd�ZpGdedf�dfeP�ZqGdgdh�dheP�Zrddil"msZsmtZtmuZuGdjdk�dkeM�Zvdldm�ZwGdndo�doet�ZxGdpdq�dqes�Zyeyjzdrevds�eyjzdtevdudv�eyjzdmewexdw�Gdxdy�dyeP�Z{e�|�Z}dzd{�Z~Gd|d}�d}es�Zejzd{e~ds�Gd~d�des�Z�e��zd{�d�Z�Gd�d��d�eP�Z�Gd�d��d�eP�Z�e2d��Z�Gd�d��d�eP�Z�Gd�d��d�eP�Z�Gd�d��d�eP�Z�Gd�d��d�eP�Z�e��e(d��Gd�d��d�eP��Z�Gd�d��d�eP�Z�Gd�d��d�eI�Z�Gd�d��d�eP�Z�e��e/d��Gd�d��d�eP��Z�Gd�d��d�eP�Z�Gd�d��d�ej��Z�Gd�d��d�eP�Z�Gd�d��d�eP�Z�Gd�d��d�ej��Z�Gd�d��d�ej��Z�d�d��Z�Gd�d��d�ej��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�Gd�d��d�eM�Z�Gd�d��d�ej��Z�Gd�d��d�ej��Z�Gd�d��d�ej��Z�Gd�d��d�ej��Z�Gd�d��d�ej��Z�Gd�d��d�ej��Z�Gd�d��d�ej��Z�Gd�dÄd�ej��Z�Gd�dńd�ej��Z�Gd�dDŽd�ej��Z�e��ejAdkdȡGd�dʄd�ej���Z�Gd�d̄d�ej��Z�Gd�d΄d�ej��Z�Gd�dЄd�ej��Z�Gd�d҄d�ej��Z�Gd�dԄd�eM�Z�Gd�dքd�e��Z�Gd�d؄d�e��Z�Gd�dڄd�e��Z�d�d܄Z�dS)��N)�support�_multiprocessing)�util)�	reductionF)�Value�copyT)�
shared_memorygN@cCs
|�d�S)N�latin)�encode)�s�r�9/opt/cppython/lib/python3.8/test/_test_multiprocessing.pyr	Lsr	cCs"t|tjj�r|��|��dS�N)�
isinstance�multiprocessing�queues�Queue�close�join_thread��queuerrr
�close_queuePsrcCstj|td�dS�N��timeout)rr�TIMEOUT)�processrrr
�join_processVsr�posix)�resource_trackercCstj||�dSr)r�_CLEANUP_FUNCS)�name�rtyperrr
�_resource_unlink_sr#皙�����?)g=
ףp=�?gffffff�?gffffff�?)r$r$r$ZHAVE_BROKEN_SEM_GETVALUE�win32��waitcCs |dk	r|dkrd}t|g|�S)N�r&)�handlerrrr
�wait_for_handle{sr*�SC_OPEN_MAX��__main__z$test.test_multiprocessing_forkserver)�	Structure�c_int�c_double�
c_longlongc	CsTd}zt�d�}Wnttfk
r,YdSX|dks>||krBdSt�d|��dS)zACheck that the system supports enough semaphores to run the test.r,�SC_SEM_NSEMS_MAXN���zHThe OS doesn't support enough semaphores to run the test (required: %d).)�os�sysconf�AttributeError�
ValueError�unittest�SkipTest)Z	nsems_minZnsemsrrr
�check_enough_semaphores�s�r:c@seZdZdd�Zdd�ZdS)�
TimingWrappercCs||_d|_dSr)�func�elapsed)�selfr<rrr
�__init__�szTimingWrapper.__init__cOs.t��}z|j||�W�St��||_XdSr)�time�	monotonicr=r<)r>�args�kwds�trrr
�__call__�szTimingWrapper.__call__N��__name__�
__module__�__qualname__r?rErrrr
r;�sr;c@s,eZdZdZdd�Zdd�Zdd�ZeZdS)	�BaseTestCase)�	processes�manager�threadscCstr|�||d�dS�N�)�
CHECK_TIMINGS�assertAlmostEqual�r>�a�brrr
�assertTimingAlmostEqual�sz$BaseTestCase.assertTimingAlmostEqualcGs2z||�}Wntk
r YnX|�||�SdSr)�NotImplementedError�assertEqual)r>�valuer<rB�resrrr
�assertReturnsIfImplemented�s
z'BaseTestCase.assertReturnsIfImplementedcGstd��dS)Nz#shouldn't try to pickle a test case)rV)r>rBrrr
�
__reduce__�szBaseTestCase.__reduce__N)rGrHrI�
ALLOWED_TYPESrUrZr[�
__reduce_ex__rrrr
rJ�s

rJcCspz
|��WStk
rjz|jWYStk
rdz|jWYYStk
r^t�YnXYnXYnXdSr)�	get_valuer6Z_Semaphore__value�_valuerV�r>rrr
r^�s
r^c@seZdZdd�ZdS)�
DummyCallablecCst|t�st�|�d�dS�N�)rra�AssertionError�put)r>�q�crrr
rE�szDummyCallable.__call__N)rGrHrIrErrrr
ra�srac@s�eZdZdZdd�Zdd�Zedd��Zdd	�Zed
d��Z	dd
�Z
edd��Zedd��Zdd�Z
e�ejd�dd��Zedd��Zedd��Zedd��Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zed'd(��Zd)d*�Zed+d,��Zd-d.�ZedPd1d2��Zd3d4�Z d5d6�Z!d7d8�Z"ed9d:��Z#d;d<�Z$ed=d>��Z%d?d@�Z&eifdAdB��Z'dCdD�Z(dEdF�Z)edQdHdI��Z*dJdK�Z+dLdM�Z,dNdO�Z-d0S)R�_TestProcess�rKrMcCs�|jdkr|�d�|j��|��}|j}|�|���|�|j�|�|t	�|�t
|�dk�|�|jt
���|�|jd�dS)NrM�test not appropriate for {}r)�TYPE�skipTest�format�current_process�authkey�
assertTrue�is_alive�daemon�assertIsInstance�bytes�lenrW�identr4�getpid�exitcode)r>�currentrorrr
�test_current�s
z_TestProcess.test_currentcCsz|jdkr|�d�|j��|j|jd�}|�|j|��j�|j|jdd�}|�|j�|j|jdd�}|�	|j�dS)NrMrj��targetT�r|rrF)
rkrlrm�Process�_testrWrrrnrp�assertFalse)r>Zproc0Zproc1�proc2rrr
�test_daemon_argument�s
z!_TestProcess.test_daemon_argumentcOsR|��}|�|�|�|�|�|j�|jdkrN|�t|j��|�|j�dS)NrM)rnrer!rkrtro�pid)�clsrfrBrCryrrr
rs


z_TestProcess._testcCs�|jdkr|�d�|j��|�|���|jdd�\}}|j|j|fd�}|��|�	�|�
�\}}|�||��j
�|�|t���|�||��j�dS)NrMrjF��duplex�r|rB)rkrlrm�assertIsNone�parent_process�Piper~�_test_send_parent_process�start�join�recvrWrnr�r4rwr!)r>�rconn�wconn�pZ
parent_pid�parent_namerrr
�test_parent_process_attributess
z+_TestProcess.test_parent_process_attributescCs&ddlm}|�|�j|�jg�dS)Nr�r�)�multiprocessing.processr��sendr�r!�r�r�r�rrr
r�sz&_TestProcess._test_send_parent_processcCs�|jdkr|�d�|j��|jdd�\}}|j|j|fd�}|��|jdd�sZtd��|�	�}|�
|d	�|��|��|jdd�s�td��|�	�}|�
|d
�dS)NrMrjFr�r��<rz(Could not communicate with child process�alive�	not alive)
rkrlrmr�r~�_test_create_grandchild_processr��pollrdr�rW�	terminater�)r>r�r�r�Zparent_process_statusrrr
�test_parent_process$s$
�z _TestProcess.test_parent_processcCs(|j|j|fd�}|��t�d�dS)Nr�i,)r~�_test_report_parent_statusr�r@�sleep)r�r�r�rrr
r�=sz,_TestProcess._test_create_grandchild_processcCsNddlm}|�|���rdnd�|�jdd�|�|���rDdnd�dS)Nrr�r�r�rcr)r�r�r�rqr�r�rrr
r�Csz'_TestProcess._test_report_parent_statuscCs�|�d�}|��}|ddf}ddd�}d}|j|j|||d�}d|_|��}|jd	krf|�|j|j�|�|�	�d
�|�|jd�|�
||���|�t
|���tk�|�|jd�|��|�|jd�|�|�	�d�|�||���|�|��|dd��|�|��|�|�|��|j�|jd	k�rX|�|��|j�|�|��|j�|��|�|jd�|�|�	�d
�|�
||���t|�dS)NrO��gR���Q@)�helloZbyeZSomeProcess)r|rB�kwargsr!TrMFr)r�Eventr~rrrrnrkrWrorq�assertNotIn�active_childrenrp�type�listrxr��assertIn�getr!r�r�r)r>rf�erBr�r!r�ryrrr
�test_processJsF


�
z_TestProcess.test_processzneeds native_idcCsr|jdkr|�d�|j��t��j}|�d�}|j|j|fd�}|�	�|�
�}|��t|�|�
||�dS)NrMrjrOr�)rkrlrm�	threading�main_thread�	native_idrr~�"_test_process_mainthread_native_idr�r�r�r�assertNotEqual)r>Zcurrent_mainthread_native_idrfr�Zchild_mainthread_native_idrrr
�!test_process_mainthread_native_idrs


z._TestProcess.test_process_mainthread_native_idcCst��j}|�|�dSr)r�r�r�re)r�rfZmainthread_native_idrrr
r��s
z/_TestProcess._test_process_mainthread_native_idcCst�d�dS)N�d�r@r��r�rrr
�_sleep_some�sz_TestProcess._sleep_somecCst�|�dSrr�)r��delayrrr
�_test_sleep�sz_TestProcess._test_sleepc
s�|jdkr|�d�|j��|j|jd��d�_���|����d�|�	�|�
��|��jd�t�j
�}|�|d�d�|�|jd�|����d�|�|d�d�|�|jd�|����d�t�d�|��ttd	��r>�fd
d�}t�tj|�}zt�d�|�|�d�W5t�d�t�tj|�Xn|�|�d�|�|jd�|����d
�|��|�
����
��jS)NrMrjr{Trr(r3rO�alarmcstd���dS)Nzjoin took too long: %s��RuntimeError�rB�r�rr
�handler�sz+_TestProcess._kill_process.<locals>.handler�
F)rkrlrmr~r�rrr�rWrqr�r�rxr;r�rUr=r@r��hasattr�signal�SIGALRMr�r�)r>�methr�r�Zold_handlerrr�r
�
_kill_process�s>




z_TestProcess._kill_processcCs,|�tjj�}tjdkr(|�|tj�dS�N�nt)	r�rr~r�r4r!rWr��SIGTERM�r>rxrrr
�test_terminate�s
z_TestProcess.test_terminatecCs,|�tjj�}tjdkr(|�|tj�dSr�)	r�rr~�killr4r!rWr��SIGKILLr�rrr
�	test_kill�s
z_TestProcess.test_killcCsJzt��}Wntk
r$d}YnX|�t|�tk�|�|dk�dSrN)r�	cpu_countrVrpr��int)r>Zcpusrrr
�test_cpu_count�s
z_TestProcess.test_cpu_countcCsp|�t|���t�|jtjtfd�}|�||���d|_	|�
�|�||���|��|�||���dS�Nr�T)
rWr�r�r�r~r@r��DELTAr�rrr�r�r��r>r�rrr
�test_active_children�sz!_TestProcess.test_active_childrencCsR|�|�t|�dkrNtd�D].}|j|j|||gfd�}|��|��qdS)Nr�r�)r�ru�ranger~�_test_recursionr�r�)r�r��id�ir�rrr
r��s
�z_TestProcess._test_recursioncCsx|jdd�\}}|�|g�t�t�g}|��rB|�|���q*gdgddgddgdgddgddgg}|�||�dS)NFr�rrO)	r�r�r@r�r�r��appendr�rW)r>r�r��result�expectedrrr
�test_recursion�s
�	z_TestProcess.test_recursioncCs|�d�dS)N�$@r&�r��eventrrr
�_test_sentinelsz_TestProcess._test_sentinelc	Cs�|jdkr|�d�|j��|��}|j|j|fd�}|�t��|jW5QRX|�	�|�
|j�|j}|�|t
�|�t|dd��|��|��|�t|dd��dS)NrMrjr�r(rrO)rkrlrmr�r~r��assertRaisesr7�sentinelr��
addCleanupr�rsr�r�r*�setrp)r>r�r�r�rrr
�
test_sentinels
z_TestProcess.test_sentinelrNcCs|dk	r|��t�|�dSr)r��sys�exit)r��rcrfrrr
�_test_closesz_TestProcess._test_closec	Cs<|jdkr|�d�|j��|��}|j|jd|id�}d|_|��|�|�	�d�|�
t��|��W5QRX|�
d�|��|�|�	�d�|�|jd�|��|�
t��|�	�W5QRX|�
t��|��W5QRX|�
t��|��W5QRX|��t�|�}~t��|�|�d�t|�dS)NrMrjrf)r|r�TFr)rkrlrmrr~r�rrr�rWrqr�r7rrer�rxr��weakref�ref�gc�collect�assertIsr)r>rfr��wrrrr
�
test_closes4


z_TestProcess.test_closecs*�jdkr��d��j��t��}|dkr0dnd}�fdd�t|�D�}|D]}|��qN|D]}t|�q`|D]}��|j	d�qr�fd	d�t|�D�}|D]}|��q�t
�d
�|D]}|��q�|D]}t|�q�t
jdk�r&tjg}tjdk�r|�tj�|D]}��|j	|��qdS)
NrMrj�spawnrcr�csg|]}�j�jdd��qS))�{�G�z�?r�)r~r���.0r�r`rr
�
<listcomp>Cs�z4_TestProcess.test_many_processes.<locals>.<listcomp>rcsg|]}�j�jd��qS)r{)r~r�r�r`rr
r�Ls����MbP?r��darwin)rkrlrmr�get_start_methodr�r�rrWrxr@r�r�r4r!r�r�r��platformr�r�r�)r>�sm�N�procsr�Z	exitcodesrr`r
�test_many_processes;s:

�


�




z _TestProcess.test_many_processescCsft�}t�|�}|��}|j|||fd�}~|��|��|�|�d�|�|�	�d�t
|�dS)Nr�rc)rar�r�rr~r�r�r�rWr�r)r>rgr�rfr�rrr
�test_lose_target_ref^s
z!_TestProcess.test_lose_target_refcCs|�tj���|��dSr)re�testrZfd_countr')r>�evtrfrrr
�_test_child_fd_inflationjsz%_TestProcess._test_child_fd_inflationc	s��jdkr��d��j��t��}|dkr<��d�|��d}�����������fdd�t|�D�}|D]}|��qnz0�fdd�t|�D�}��t
t	|��d|�W5��	�|D]}|�
�q�t��XdS)	NrMrj�forkrccs g|]}�j�j��fd��qS�r�)r~rr��rrfr>rr
r�s�z8_TestProcess.test_child_fd_inflation.<locals>.<listcomp>csg|]}����qSr�r�r��rfrr
r��srO)rkrlrmrr�r�rr�r�r�r�rrWru)r>r�r�r�r�Z	fd_countsrrr
�test_child_fd_inflationos(
�

z$_TestProcess.test_child_fd_inflationcs>�fdd�}�fdd�}tj|d���tj|dd���dS)Ncst�d����dS)N��?�r@r�r�r�rrr
�func1�s
z2_TestProcess._test_wait_for_threads.<locals>.func1cst�d����dS)N�)r@r��clearrr
rr
�func2�s
z2_TestProcess._test_wait_for_threads.<locals>.func2r{Tr})r��Threadr�)r>rrrrr
r
�_test_wait_for_threads�sz#_TestProcess._test_wait_for_threadscCsX|jdkr|�d�|j��|��}|j|j|fd�}|��|��|�|�	��dS)NrMrjr�)
rkrlrmr�r~rr�r�rp�is_set)r>r�procrrr
�test_wait_for_threads�s
z"_TestProcess.test_wait_for_threadscCsT|��D]>\}}|dkr*t��}|��n|dks6t�d}tt|d�q|��dS)Nr�remove)�items�io�StringIOrrd�setattrr�r�)r>rZbreak_std_streams�stream_name�action�streamrrr
�_test_error_on_stdio_flush�s
z'_TestProcess._test_error_on_stdio_flushcCs�t��dg}|d��dD]~}|D]t}tt|�}tt||�zJ|��}|j|j|fd�}|�	�|�
�|�|���|�
|jd�W5tt||�Xq$qdS)Nr��stdout�stderrr�)rrr�getattrr�rr�r~rr�r�rprrWrx)r>Zstreamsrr�
old_streamrrrrr
�test_error_on_stdio_flush_1�s 
�z(_TestProcess.test_error_on_stdio_flush_1cCs�dD]x}dD]n}tt|�}zP|��}|j|j|||ifd�}|��|��|�|�	��|�
|jd�W5tt||�XqqdS)Nr)rrr�r)r r�rr�r~rr�r�rprrWrx)r>rrr!rrrrr
�test_error_on_stdio_flush_2�s

�z(_TestProcess.test_error_on_stdio_flush_2r(cCst�|�|��dSrr	)r>rr�rrr
�_sleep_and_set_event�s
z!_TestProcess._sleep_and_set_eventc
Cs|jdkr|�d�|j��t��}|dkr<|�d�|��ddlm}|��d}|��}|j	|j
||fd�}|��|j}t
�||�t�|d�|��}|j	|j
|fd�}	|	��|	��|�|���|�|	jd�|��|�|���|�|jd	�dS)
NrMrj�
forkserverr)�_forkserverrr��@)r�)rkrlrmrr�Zmultiprocessing.forkserverr&�ensure_runningr�r~r$r�Z_forkserver_pidr4r�r@r�r�rprrWrxr�)
r>�signumr�r&r�rrr�Zevt2r�rrr
�check_forkserver_death�s.
z#_TestProcess.check_forkserver_deathcCs|�tj�dSr)r+r��SIGINTr`rrr
�test_forkserver_sigintsz#_TestProcess.test_forkserver_sigintcCstjdkr|�tj�dSr�)r4r!r+r�r�r`rrr
�test_forkserver_sigkills
z$_TestProcess.test_forkserver_sigkill)rN)r().rGrHrIr\rzr��classmethodrr�r�r�r�r�r�r8�
skipUnlessr��_HAVE_THREAD_NATIVE_IDr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr"r#r$r+r-r.rrrr
rh�sj
	


(



3



 #

&rhc@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�_UpperCasercCs tj�|�t��\|_|_dSr)rr~r?r��
child_conn�parent_connr`rrr
r?sz_UpperCaser.__init__cCs<|j��t|jjd�D]}|j�|���q|j��dSr)r4r�iterr3r�r��upper�r>rrrr
�runs
z_UpperCaser.runcCs&t|�tkst�|j�|�|j��Sr)r��strrdr4r�r�r7rrr
�submitsz_UpperCaser.submitcCs$|j�d�|j��|j��dSr)r4r�rr3r`rrr
�stop!s
z_UpperCaser.stopN)rGrHrIr?r8r:r;rrrr
r2sr2c@s@eZdZdZdd�Zdd�Zedd��Zedd	��Zd
d�Z	dS)
�_TestSubclassingProcess�rKcCsLt�}d|_|��|�|�d�d�|�|�d�d�|��|��dS)NTr�ZHELLOZworldZWORLD)r2rrr�rWr:r;r�)r>Z
uppercaserrrr
�test_subclassing*sz(_TestSubclassingProcess.test_subclassingc	Cs�|jdkr|�d�|j��tjj}|�tjj|�|j|j	|fd�}|�
�|��t|d��2}|�
�}|�d|�|�d|�|�d|�W5QRXdS)NrMrjr��r�ZeroDivisionErrorztest_multiprocessing.pyz1/0 # MARKER)rkrlrmr�r�TESTFNr��unlinkr~�_test_stderr_flushr�r��open�readr�)r>�testfnr�f�errrrr
�test_stderr_flush3s
z)_TestSubclassingProcess.test_stderr_flushcCs6t�|tjtjBtjB�}t|ddd�t_dddS)N�wF��closefdrOr)r4rD�O_WRONLY�O_CREAT�O_EXCLr�r)r�rF�fdrrr
rCDsz*_TestSubclassingProcess._test_stderr_flushcCs8t�|tjtjBtjB�}t|ddd�t_t�|�dS)NrJFrK)r4rDrMrNrOr�rr�)r��reasonrFrPrrr
�_test_sys_exitKsz&_TestSubclassingProcess._test_sys_exitc
Cs|jdkr|�d�|j��tjj}|�tjj|�dddgdfD]x}|j|j	||fd�}d|_
|��t|�|�
|jd�t|d	��}|��}W5QRX|�
|��t|��t�|�qBd
D]:}|jtj|fd�}d|_
|��t|�|�
|j|�q�dS)NrMrjrOr��zignore thisr�Tr?)TF�)rkrlrmr�rrAr�rBr~rRrrr�rrWrxrDrE�rstripr9r4r�r�)r>rFrQr�rGZcontentrrr
�
test_sys_exitQs,
�z%_TestSubclassingProcess.test_sys_exitN)
rGrHrIr\r>rIr/rCrRrVrrrr
r<&s	

r<cCs"t|d�r|��S|��dkSdS)N�emptyr)r�rW�qsizerrrr
�queue_emptyts
rYcCs"t|d�r|��S|��|kSdS)N�full)r�rZrX)rf�maxsizerrr
�
queue_fullzs
r\c@s�eZdZedd��Zdd�Zedd��Zdd�Zed	d
��Zdd�Z	d
d�Z
edd��Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�ZdS)�
_TestQueuecCs*|��td�D]}|��q|��dS)N�)r'r�r�r�)r�r�child_can_start�parent_can_continuer�rrr
�	_test_put�s
z_TestQueue._test_putcCs�d}|j|d�}|��}|��}|j|j|||fd�}d|_|��|�t|�d�|�t||�d�|�	d�|�	dd�|�	ddd�|�	d	d�|�	d
dd�|�
d�t�t
�|�t|�d�|�t||�d�t|j	�}t|j
�}|�tj|dd�|�|jd�|�tj|ddd�|�|jd�|�tj|d�|�|jd�|�tj|ddt�|�|jt�|�tj|ddt�|�|jd�|jtj|ddtd
�|�|jt�|��|��|�t|�d�|�t||�d�|��t|�dS)Nr^�r[r�TFrOr�rS�rc�rr)rr�r~rarrr�rWrYr\re�
put_nowaitr@r�r�r;r��pyqueue�FullrUr=�TIMEOUT1�TIMEOUT2�TIMEOUT3r�r'r�r)r>ZMAXSIZErr_r`rrererrr
�test_put�sR�




z_TestQueue.test_putcCs<|��|�d�|�d�|�d�|�d�|��dS)Nr�rSrcrc)r'rer��r�rr_r`rrr
�	_test_get�s



z_TestQueue._test_getcCs�|��}|��}|��}|j|j|||fd�}d|_|��|�t|�d�|��|�	�t
�t�|�t|�d�|�|�
dd�d�|�|�
d�d�|�|j
dd�d�|�|��d	�|�t|�d�t|j
�}t|j�}|�tj|d�|�|jd
�|�tj|dd�|�|jd
�|�tj|�|�|jd
�|�tj|dt�|�|jt�|�tj|dt�|�|jd
�|jtj|td�|�|jt�|��t|�dS)Nr�TFr�rSrOrrcrcr)rr�r~rmrrr�rWrYr�r'r@r�r�r��
get_nowaitr;r�rf�EmptyrUr=rhrirjr�r)r>rr_r`rr�rnrrr
�test_get�sF�


z_TestQueue.test_getcCstdd�D]}|�|�q
dS)Nr�r)r�re)r�rr�rrr
�
_test_forksz_TestQueue._test_forkcCs�|��}td�D]}|�|�qt�t�|j|j|fd�}d|_|�	�td�D]}|�
|��|�qR|�t
j|jd�|��t|�dS)Nr�r�TrF)rr�rer@r�r�r~rqrrr�rWr�r�rfror�r)r>rr�r�rrr
�	test_fork
s
z_TestQueue.test_forkcCs�|��}z|�|��d�Wntk
r:|�d�YnX|�d�|�|��d�|�d�|�|��d�|��|�|��d�|��|�|��d�t|�dS)Nrzqsize method not implementedrOrcr�)rrWrXrVrlrer�r�r>rfrrr
�
test_qsize)s

z_TestQueue.test_qsizecCs(t|jd�D]}t�t�|��qdSr)r5r�r@r�r��	task_done)r�rf�objrrr
�_test_task_done9s
z_TestQueue._test_task_donecs�������fdd�td�D�}|D]}d|_|��q$td�D]}��|�q@���|D]}��d�q\|D]}|��qpt��dS)Ncsg|]}�j�j�fd��qSr)r~rwr��rr>rr
r�Bs�z-_TestQueue.test_task_done.<locals>.<listcomp>rcTr�)�
JoinableQueuer�rrr�rer�r)r>�workersr�r�rrxr
�test_task_done?s�

z_TestQueue.test_task_donec
Cs�tj���xd}t|dd��}|�d�W5QRXtj�t����4zt|�Wn t	j
k
rr|�d�YnXW5QRXW5QRXdS)NZimported_by_an_imported_modulez.pyrJz�if 1:
                    import multiprocessing

                    q = multiprocessing.Queue()
                    q.put('knock knock')
                    q.get(timeout=3)
                    q.close()
                    del q
                z?Probable regression on import lock contention; see Issue #22853)r�rZtemp_cwdrD�writeZ
DirsOnSysPathr4�getcwd�
__import__rfro�fail)r>�module_namerGrrr
�test_no_import_lock_contentionUs
z)_TestQueue.test_no_import_lock_contentioncCsHt��}t��}|�tj|jdd�t��|}|�|d�t	|�dS)NTg�������?r$)
rrr@rAr�rfror��assertGreaterEqualr)r>rfr��deltarrr
�test_timeoutjsz_TestQueue.test_timeoutc	Cs|jdkr|�d�|j��Gdd�dt�}tj���>|��}|�|��|�d�|�	|j
td��t|�W5QRXtj���z|jdd�}|�|��|�d�z|�
|��d�Wntk
r�YnX|�	|j
d	d��|�	|���t|�W5QRXdS)
NrKrjc@seZdZdd�ZdS)zF_TestQueue.test_queue_feeder_donot_stop_onexc.<locals>.NotSerializablecSst�dSr)r6r`rrr
r[{szQ_TestQueue.test_queue_feeder_donot_stop_onexc.<locals>.NotSerializable.__reduce__N�rGrHrIr[rrrr
�NotSerializablezsr�TrrOrb��?)rkrlrm�objectr�r�captured_stderrrrerpr�rrrWrXrVrW)r>r�rfrrr
�"test_queue_feeder_donot_stop_onexcus(


z-_TestQueue.test_queue_feeder_donot_stop_onexcc	s�|jdkr|�d�|j��Gdd�dt��G�fdd�dtjj�}��}tj�	��:|t�
�d�}|�|�|�d�|�|j
d	d
��W5QRX|�|j�|�|j�dS)NrKrjc@s eZdZdZdd�Zdd�ZdS)zK_TestQueue.test_queue_feeder_on_queue_feeder_error.<locals>.NotSerializablezMock unserializable objectcSsd|_d|_dS�NF)�reduce_was_called� on_queue_feeder_error_was_calledr`rrr
r?�szT_TestQueue.test_queue_feeder_on_queue_feeder_error.<locals>.NotSerializable.__init__cSsd|_t�dS�NT)r�r6r`rrr
r[�szV_TestQueue.test_queue_feeder_on_queue_feeder_error.<locals>.NotSerializable.__reduce__N)rGrHrI�__doc__r?r[rrrr
r��sr�cs eZdZdZe�fdd��ZdS)zE_TestQueue.test_queue_feeder_on_queue_feeder_error.<locals>.SafeQueuez1Queue with overloaded _on_queue_feeder_error hookcst|t�rt|��rd|_dSr�)rr6r�)r�rv�r�rr
�_on_queue_feeder_error�s
�z\_TestQueue.test_queue_feeder_on_queue_feeder_error.<locals>.SafeQueue._on_queue_feeder_errorN)rGrHrIr��staticmethodr�rr�rr
�	SafeQueue�sr�)�ctxTr�r)rkrlrmr�rrrr�rr��get_contextrerpr�r�r�)r>r�Znot_serializable_objrfrr�r
�'test_queue_feeder_on_queue_feeder_error�s



z2_TestQueue.test_queue_feeder_on_queue_feeder_errorc
Csdt��t��fD]N}|��|�td��|�d�W5QRX|�td��|��W5QRXqdS)Nz	is closed�foo)rrryr�assertRaisesRegexr7rer�rsrrr
�$test_closed_queue_put_get_exceptions�sz/_TestQueue.test_closed_queue_put_get_exceptionsN)rGrHrIr/rarkrmrprqrrrtrwr{r�r�r�r�r�rrrr
r]�s$
;
	5

!&r]c@s$eZdZdd�Zdd�Zdd�ZdS)�	_TestLockcCsR|��}|�|��d�|�|�d�d�|�|��d�|�ttjf|j�dS)NTF)�LockrW�acquire�releaser�r7r��ThreadError�r>�lockrrr
�	test_lock�s
z_TestLock.test_lockcCs~|��}|�|��d�|�|��d�|�|��d�|�|��d�|�|��d�|�|��d�|�ttf|j�dSr�)�RLockrWr�r�r�rdr�r�rrr
�
test_rlock�sz_TestLock.test_rlockc	Cs|���W5QRXdSr)r�r`rrr
�test_lock_context�s
z_TestLock.test_lock_contextN)rGrHrIr�r�r�rrrr
r��s
r�c@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�_TestSemaphorecCs�|�dt|�|�|��d�|�dt|�|�|��d�|�dt|�|�|�d�d�|�dt|�|�|��d�|�dt|�|�|��d�|�dt|�dS)Nr�TrOrF)rZr^rWr�r��r>�semrrr
�_test_semaphore�sz_TestSemaphore._test_semaphorecCsT|�d�}|�|�|�|��d�|�dt|�|�|��d�|�dt|�dS)Nr�rSrc)�	Semaphorer�rWr�rZr^r�rrr
�test_semaphore�s

z_TestSemaphore.test_semaphorecCs|�d�}|�|�dS�Nr�)�BoundedSemaphorer�r�rrr
�test_bounded_semaphore�s
z%_TestSemaphore.test_bounded_semaphorecCs�|jdkr|�d�|j��|�d�}t|j�}|�|d�d�|�|jd�|�|dd�d�|�|jd�|�|dt	�d�|�|jd�|�|dt
�d�|�|jt
�|�|td�d�|�|jt�dS)NrKrjrFr(Tr)rkrlrmr�r;r�rWrUr=rhrirj)r>r�r�rrr
r��s


z_TestSemaphore.test_timeoutN)rGrHrIr�r�r�r�rrrr
r��s
r�c@s�eZdZeddd��Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
edd��Ze�
ed�dd��Zedd��Ze�
ed�dd��Zedd��Zdd�ZdS)�_TestConditionNcCs.|��|��|�|�|��|��dSr)r�r�r')r��cond�sleeping�wokenrrrr
rGs

z_TestCondition.fc	Csbtd�D]>}z|�|krWqHWntk
r:YqHYnXt�t�qt�t�|�||�dS�Nr�)r�rVr@r�r�rZ)r>r<rXr�rrr
�assertReachesEventuallys


z&_TestCondition.assertReachesEventuallycCsZ|jdkrVz6|j��|j��}|�|d�|�|j��d�Wntk
rTYnXdS)NrKr)rk�_sleeping_countr^�_woken_countrW�_wait_semaphorerV)r>r��sleepersrrr
�check_invariant*s
�z_TestCondition.check_invariantcCs|��}|�d�}|�d�}|j|j|||fd�}d|_|��|�|j�tj	|j|||fd�}d|_|��|�|j�|�
�|�
�t�t
�|�dt|�|�
�|��|��t�t
�|�dt|�|�
�|��|��t�t
�|�dt|�|�|�|��dS)Nrr�TrOr�)�	Conditionr�r~rGrrr�r�r�r�rr�r@r�r�rZr^�notifyr�r�)r>r�r�r�r�rrr
�test_notify5s6





z_TestCondition.test_notifycs�|��}|�d�}|�d��td�D]h}|j|j||�tfd�}d|_|��|�|j	�t
j|j||�tfd�}d|_|��|�|j	�q$td�D]}|��q�td�D]}���q�|�
dt��|�|�td�D]d}|j|j||�fd�}d|_|��|�|j	�t
j|j||�fd�}d|_|��|�|j	�q�td�D]}|���qHt�t�|�
dt��|��|��|��|��fdd�d�|�|�dS)NrrSr�Tr^cst��Sr�r^r�r�rr
�<lambda>��z0_TestCondition.test_notify_all.<locals>.<lambda>)r�r�r�r~rGrhrrr�r�r�r�rr�rZr^r�r@r�r��
notify_allr�r��r>r�r�r�r�rDrr�r
�test_notify_allbsP


�
�



z_TestCondition.test_notify_allcsP|��}|�d�}|�d��td�D]d}|j|j||�fd�}d|_|��|�|j�t	j
|j||�fd�}d|_|��|�|j�q$td�D]}|��q�t�
t�|�dt��|��|jdd�|��|��fdd	�d�|��|jd
d�|��|��fdd	�d�|��|jdd�|��|�dt��|�|�dS)NrrSr�Tr^r�)�ncst��Srr�rr�rr
r��r�z._TestCondition.test_notify_n.<locals>.<lambda>rccst��Srr�rr�rr
r��r�)r�r�r�r~rGrrr�r�r�r�rr�r@r�r�rZr^r�r�r�r�r�rr�r
�
test_notify_n�s:



z_TestCondition.test_notify_ncCsH|��}t|j�}|��|t�}|��|�|d�|�|jt�dSr�)	r�r;r'r�rhr�rWrUr=)r>r�r'rYrrr
r��s
z_TestCondition.test_timeoutc	sL|�>d�_|��|��fdd��}|r4�jdkr>t�d�W5QRXdS)Nrcs
�jdkS�Nrc�rXr��staterr
r��r�z0_TestCondition._test_waitfor_f.<locals>.<lambda>rcrO)rXr��wait_forr�r�)r�r�r�r�rr�r
�_test_waitfor_f�sz_TestCondition._test_waitfor_fzneeds sharedctypesc
s�|��}|�dd��|j|j|�fd�}d|_|��|�0|��fdd��}|�|�|��j	d�W5QRXt
d�D]4}t�d	�|��j	d
7_	|�
�W5QRXqxt|�|�|jd�dS)Nr�r3r�Tcs
�jdkS�Nrr�rr�rr
r��r�z-_TestCondition.test_waitfor.<locals>.<lambda>rrcr�rO)r�rr~r�rrr�r�rprWrXr�r@r�r�rrx)r>r�r�r�r�rr�r
�test_waitfor�s 

z_TestCondition.test_waitforc	st|��|�^d}t��}|j�fdd�|d�}t��|}|sf|d|kr\|dkrfnnd|_W5QRXdS)Nr$cs
�jdkSr�r�rr�rr
r�r�z8_TestCondition._test_waitfor_timeout_f.<locals>.<lambda>rg333333�?r�T)r�r@rAr�rX)r�r�r��successr�r��dtr�rr�r
�_test_waitfor_timeout_f�s$z&_TestCondition._test_waitfor_timeout_fc
Cs�|��}|�dd�}|�dd�}|�d�}|j|j||||fd�}d|_|��|�|jt	d��t
d�D]4}t�d�|�|j
d	7_
|��W5QRXqjt|�|�|j
�dS)
Nr�rFr�TrrSr�rO)r�rr�r~r�rrr�rpr�rr�r@r�rXr�r)r>r�r�r�r�r�r�rrr
�test_waitfor_timeouts"

�
z#_TestCondition.test_waitfor_timeoutc	Cs<|�|��W5QRXt�d�|dk	r8t�|tj�dSrN)r�r@r�r4r�r�r,)r�rgr�rrr
�_test_wait_result s

z _TestCondition._test_wait_resultc	Cs�t|t�rtjdkrt��}nd}|��}|�r|�|�d��|�|�d��|j	|j
||fd�}|��|�|�d��|dk	r�|�
t|jd�|��W5QRXdS)Nr%rr$r�r�)r�ProcessesMixinr�r�r4rwr�r�r'r~r�r�rpr��KeyboardInterruptr�)r>r�rgr�rrr
�test_wait_result(s
z_TestCondition.test_wait_result)N)rGrHrIr/rGr�r�r�r�r�r�r�r8r0�HAS_SHAREDCTYPESr�r�r�r�r�rrrr
r�s&->2	






r�c@s eZdZedd��Zdd�ZdS)�
_TestEventcCst�t�|��dSr)r@r�rir�r�rrr
�_test_event?s
z_TestEvent._test_eventcCs�|��}t|j�}|�|��d�|�|d�d�|�|jd�|�|t�d�|�|jt�|��|�|��d�|�|�d�|�|jd�|�|t�d�|�|jd�|�	�|j
|j|fd�}d|_|�
�|�|�d�|��dS)NFr(Tr�)r�r;r'rWrrUr=rhr�r
r~r�rrr�r�)r>r�r'r�rrr
�
test_eventDs&
z_TestEvent.test_eventN)rGrHrIr/r�r�rrrr
r�=s
r�c@s4eZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�
_DummyListcCs6tj�t�d��}t��}|�||f�d|jd<dS)Nr�r)r�heap�
BufferWrapper�struct�calcsizer��__setstate__�
_lengthbuf)r>�wrapperr�rrr
r?rsz_DummyList.__init__cCs"|\|_|_|j���d�|_dS)Nr�)�_wrapper�_lock�create_memoryview�castr�)r>r�rrr
r�xsz_DummyList.__setstate__cCs|j|jfSr)r�r�r`rrr
�__getstate__|sz_DummyList.__getstate__c	Cs(|j�|jdd7<W5QRXdS�NrrO�r�r�)r>�_rrr
r�sz_DummyList.appendc
Cs(|j�|jdW5QR�SQRXdSr�r�r`rrr
�__len__�sz_DummyList.__len__N)rGrHrIr?r�r�r�r�rrrr
r�ps
r�cCst�d�dS)Nr�r�rrrr
�_wait�sr�c@sBeZdZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS)�Bunchz
    A bunch of threads.
    Fc
Cs�||_||_||_|��|_|��|_|��|_|s>|j��g}t	|�D]*}|j
|jd�}d|_|�
�|�|�qJdd�}	t�||	|�|_dS)z�
        Construct a bunch of `n` threads running the same function `f`.
        If `wait_before_exit` is True, the threads won't terminate until
        do_finish() is called.
        r{TcSs|D]}|��qdSr)r�)rMr�rrr
�finalize�sz Bunch.__init__.<locals>.finalizeN)rGrBr��	DummyList�started�finishedr��	_can_exitr�r�r~�taskrrr�r�r�r��
_finalizer)
r>�	namespacerGrBr�Zwait_before_exitrMr�r�r�rrr
r?�s 



zBunch.__init__c	CsRt��}|j�|�z|j	|j
�W5|j�|�|j�d�|j��sLt�XdS)N�)r4rwr�r�r�r�r'rrdrGrB�r>r�rrr
r��sz
Bunch.taskcCst|j�|jkrt�qdSr)rur�r�r�r`rrr
�wait_for_started�szBunch.wait_for_startedcCst|j�|jkrt�qdSr)rur�r�r�r`rrr
�wait_for_finished�szBunch.wait_for_finishedcCs|j��dSr)r�r�r`rrr
�	do_finish�szBunch.do_finishcCs|��dSr)r�r`rrr
r�szBunch.closeN)F)
rGrHrIr�r?r�r�r�r�rrrrr
r��s

r�c@seZdZdd�Zdd�ZdS)�
AppendTruecCs
||_dSr)rv)r>rvrrr
r?�szAppendTrue.__init__cCs|j�d�dSr�)rvr�r`rrr
rE�szAppendTrue.__call__NrFrrrr
r��sr�c@s�eZdZdZdZdZdd�Zdd�Zdd	�Zd
d�Z	e
dd
��Zd6dd�Zdd�Z
e
dd��Zdd�Ze
dd��Zdd�Ze
dd��Zdd�Ze
dd ��Zd!d"�Ze
d#d$��Zd%d&�Ze
d'd(��Zd)d*�Ze
d+d,��Zd-d.�Zd/d0�Ze
d1d2��Zd3d4�Zd5S)7�_TestBarrierz$
    Tests for Barrier objects.
    rcg>@cCs|j|j|jd�|_dSr)�Barrierr��defaultTimeout�barrierr`rrr
�setUp�sz_TestBarrier.setUpcCs|j��d|_dSr)r��abortr`rrr
�tearDown�s
z_TestBarrier.tearDowncCs,|jdkrgS|jdkr"|j��St�SdS)NrMrL)rkrLr�r�r`rrr
r��s



z_TestBarrier.DummyListcCs8t||||jd�}z||�|��W5|��XdSrN)r�r�rr�)r>rGrBrTrrr
�run_threads�s
z_TestBarrier.run_threadscCs�|j}||jkst�t|�D]d}|d�d�t|d�||ksFt�|��|d�d�t|d�|d|ksxt�|��qz|jdks�t�Wntk
r�YnX|j	r�t�dS)NrTrO)
�partiesr�rdr�r�rur'�	n_waitingrV�broken)r�r��resultsr��mr�rrr
�	multipass�s
z_TestBarrier.multipassrOcCs*|��|��g}|�|j|j||f�dS)z;
        Test that a barrier is passed in lockstep
        N)r�rrr�)r>�passesrrrr
�test_barrier�sz_TestBarrier.test_barriercCs
|�d�S)zC
        Test that a barrier works for 10 consecutive runs
        r�)r	r`rrr
�test_barrier_10sz_TestBarrier.test_barrier_10cCs|��}|�|�dSr)r're)r�r�rrYrrr
�_test_wait_return_fsz _TestBarrier._test_wait_return_fcsR|���|�|j|j�f��fdd�t|j�D�}|�|�d�d�t��dS)z9
        test the return value from barrier.wait
        csg|]}����qSrrr�rrr
r�sz1_TestBarrier.test_wait_return.<locals>.<listcomp>rrON)	rrrr�r�r�rW�countr�r>rrrr
�test_wait_return
s
z_TestBarrier.test_wait_returncCs|��t|�dkrt�dSrN)r'rur�)r�r�rrrr
�_test_action_fsz_TestBarrier._test_action_fcCsB|��}|j|jt|�d�}|�|j||f�|�t|�d�dS)z,
        Test the 'action' callback
        )rrON)r�r�r�r�rrrWru)r>rr�rrr
�test_actionsz_TestBarrier.test_actioncCspz0|��}||jdkrt�|��|�d�Wn:tjk
rP|�d�Yntk
rj|��YnXdS�Nr�T)r'r�r�r�r��BrokenBarrierErrorr�)r�r��results1�results2r�rrr
�
_test_abort_f&sz_TestBarrier._test_abort_fcCs^|��}|��}|�|j|j||f�|�t|�d�|�t|�|jd�|�|jj�dS)zK
        Test that an abort will put the barrier in a broken state
        rrON)	r�rrr�rWrur�rpr)r>rrrrr
�
test_abort3s
�z_TestBarrier.test_abortcCs�|��}||jdkr<|j|jdkr2t�d�q|��n8z|��|�d�Wn tjk
rr|�d�YnX|��|�d�dS)Nr�rOr�T)	r'r�rr@r��resetr�r�r)r�r�rr�results3r�rrr
�
_test_reset_f?s
z_TestBarrier._test_reset_fcCsl|��}|��}|��}|�|j|j|||f�|�t|�d�|�t|�|jd�|�t|�|j�dS)zL
        Test that a 'reset' on a barrier frees the waiting threads
        rrON)r�rrr�rWrur�)r>rrrrrr
�
test_resetQs�z_TestBarrier.test_resetcCs�z0|��}||jdkrt�|��|�d�Wn:tjk
rP|�d�Yntk
rj|��YnX|��|jdkr�|��|��|��|�d�dSr)r'r�r�r�r�rr�r)r�r��barrier2rrrr�rrr
�_test_abort_and_reset_f^sz$_TestBarrier._test_abort_and_reset_fcCsz|��}|��}|��}|�|j�}|�|j|j||||f�|�t|�d�|�t|�|jd�|�t|�|j�dS)zF
        Test that a barrier can be reset after being broken.
        rrON)r�r�r�rrr�rWru)r>rrrrrrr
�test_abort_and_resetts�z!_TestBarrier.test_abort_and_resetcCsT|��}||jdkr t�d�z|�d�Wn tjk
rN|�d�YnXdS)Nr�r�rT)r'r�r@r�r�rr��r�r�rr�rrr
�_test_timeout_f�s
z_TestBarrier._test_timeout_fcCs4|��}|�|j|j|f�|�t|�|jj�dS)z$
        Test wait(timeout)
        N)r�rrr�rWrurr
rrr
r��sz_TestBarrier.test_timeoutcCsV|�|j�}||jdkr$t�d�z|��Wn tjk
rP|�d�YnXdS)Nr�r�T)r'r�r�r@r�r�rr�rrrr
�_test_default_timeout_f�s
z$_TestBarrier._test_default_timeout_fcCs@|j|jdd�}|��}|�|j||f�|�t|�|j�dS)z4
        Test the barrier's default timeout
        rrN)r�r�r�rr rWrur)r>r�rrrr
�test_default_timeout�sz!_TestBarrier.test_default_timeoutcCs|�d�}|��|��dSrN)r�r')r>rTrrr
�test_single_thread�s
z_TestBarrier.test_single_threadc
Cs4t|�D]&}|��|�|�|�W5QRXqdSr)r�r'r�)r�r�r�connr�r�rrr
�_test_thousand_f�sz_TestBarrier._test_thousand_fcCs�|jdkr|�d�|j��d}|��}|�d�\}}t|j�D]2}|j|j|j	|||fd�}|�
�|�|j�q@t|�D]$}t|j�D]}|�
|��|�q�q|dS)NrLrj��Fr�)rkrlrmr�r�r�r�r~r$r�r�r�r�rWr�)r>rr�r#r3�jr�r�rrr
�
test_thousand�s
�z_TestBarrier.test_thousandN)rO)rGrHrIr�r�r�r�rr�rr/rr	r
rrrrrrrrrrrr�r r!r"r$r'rrrr
r��sH




	







	
r�c@sZeZdZdZddddded�ed�fgZd	d
�Zedd��Zddd�Z	dd�Z
dd�ZdS)�
_TestValuer=)r�i�i�^)�dg
@g�)�hi�����)rf��rg�x�ycCsts|�d�dS�Nz%requires multiprocessing.sharedctypes�r�rlr`rrr
r��sz_TestValue.setUpcCs$t||j�D]\}}|d|_qdSr�)�zip�codes_valuesrX)r��values�sv�cvrrr
r�sz_TestValue._testFcs�|r�fdd��jD�}n�fdd��jD�}t|�j�D]\}}��|j|d�q:�j�j|fd�}d|_|��|��t|�j�D]\}}��|j|d�q�dS)Ncsg|]\}}}��||��qSr)�RawValue�r��coderXr�r`rr
r��s�z)_TestValue.test_value.<locals>.<listcomp>csg|]\}}}��||��qSr)rr8r`rr
r��s�rOr�Tr�)	r3r2rWrXr~rrrr�r�)r>�rawr4r5r6rrr`r
�
test_value�s
�
�z_TestValue.test_valuecCs|jdd�dS�NT)r:)r;r`rrr
�
test_rawvalue�sz_TestValue.test_rawvaluec
Cs�|�dd�}|��}|��}|jdddd�}|��}|��}|��}|jdd|d�}|��}	|��}
|�||	�|jdddd�}|�t|d��|�t|d��|jt|jdddd�|�	dd�}|�t|d��|�t|d��dS)Nr�rc�r�F�get_lock�get_objZnavalue)
rr?r@r�rWr�r�r�r6r7)
r>Zval1�lock1�obj1Zval2�lock2�obj2r�Zval3�lock3�obj3�arr4�arr5rrr
�test_getobj_getlock�s$z_TestValue.test_getobj_getlockN)F)rGrHrIr\r	r3r�r/rr;r=rIrrrr
r(�s�

r(c@s~eZdZdZedd��Ze�edkd�ddd��Z	e�edkd�d	d
��Z
e�edkd�dd��Ze�edkd�d
d��ZdS)�
_TestArrayr=cCs0tdt|��D]}||||d7<qdSrN)r�ru)r��seqr�rrr
rGsz_TestArray.fNzrequires _ctypesFc
Csddddddddd	d
g
}|r*|�d|�}n|�d|�}|�t|�t|��|�|d|d�|�t|d
d��t|d
d���t�ddd
ddg�|dd�<|dd�<|�t|dd��|�|�|�|j|j|fd�}d|_|�	�|�
�|�t|dd��|�dS)Ni�iri�i5���i$i�i�i?r�rSr�rdrOrcrTr�T)�RawArray�ArrayrWrur��arrayrGr~rrr�r�)r>r:rK�arrr�rrr
�
test_arrays$(
z_TestArray.test_arraycCsrd}td�D]`}|�d|�}|�t|�|�|�t|�dg|�td�|dd�<|�t|�ttd���~qdS)Nr�rSr�r)r�rOrWrur�)r>�sizer�rQrrr
�test_array_from_size2sz_TestArray.test_array_from_sizecCs|jdd�dSr<)rRr`rrr
�
test_rawarrayAsz_TestArray.test_rawarrayc
Cs
|�dttd���}|��}|��}|jdttd��dd�}|��}|��}|��}|jdttd��|d�}|��}	|��}
|�||	�|jdtd�dd�}|�t|d��|�t|d��|j	t
|jdtd�dd�|�dtd��}|�t|d��|�t|d��dS)Nr�r�r>Fr?r@Znotalock)rOr�r�r?r@r�rWr�r�r�r6rN)
r>Zarr1rArBZarr2rCrDr�Zarr3rErFrGrHrrr
�test_getobj_getlock_objEs.�z"_TestArray.test_getobj_getlock_obj)F)
rGrHrIr\r/rGr8�skipIfr/rRrTrUrVrrrr
rJs


rJc@sHeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dS)�_TestContainers�rLcCs�|�ttd���}|�|dd�ttd���|��}|�|dd�g�|�ttd���|�|dd�ttd���|�|dd�|�|dd�dddg�|d9}|�|dd�ddddddddddg
�|�|ddgddddddddddddg�|�|dd�ttd���||g}|�|�}|�d	d
�|D�dddddddddd
g
ddddddddddg
g�|�|g�}|�d�|�|ddd�dddddddddd
dg�dS)Nr�rcr�rSrcrrOr^cSsg|]}|dd��qSrr)r��elementrrr
r�~sz-_TestContainers.test_list.<locals>.<listcomp>rdrT�	r�)r�r�rW�extendr�)r>rSrTr)r�rGrrr
�	test_listgs*(,
.�
z_TestContainers.test_listcCsf|�ttd���}t|�}|�t|�ttd���|�t|�g�t|�}d|d<|�t|�d�dS)Nr�r�r)r�r�r5rW�next)r>rS�itrrr
�test_list_iter�sz_TestContainers.test_list_itercs����fdd�td�D��}��dd�|D�dddggd�d|dd	<��|ddd�dddg�tdd�D]"}��||dd�dddg�qr��|d��d���t|d�d�tddd�D]}��t||�d�q�~���}|�|�~dS)
Ncsg|]}��td���qS)rS)r�r�)r�Z_ir`rr
r��sz;_TestContainers.test_list_proxy_in_list.<locals>.<listcomp>rScSsg|]}|dd��qSrr)r��innerrrr
r��srrOr��7r3)r�r�rW�poprur�)r>rSr�rTrr`r
�test_list_proxy_in_list�s" 
z'_TestContainers.test_list_proxy_in_listcCs�|��}ttdd��}|D]}t|�||<q|�|��tdd�|D���|�t|���|�|�t|���dd�|D��|�t|�	��dd�|D��dS)N�A�Fcss|]}|t|�fVqdSr��chrr�rrr
�	<genexpr>�sz,_TestContainers.test_dict.<locals>.<genexpr>cSsg|]}t|��qSrrgr�rrr
r��sz-_TestContainers.test_dict.<locals>.<listcomp>cSsg|]}|t|�f�qSrrgr�rrr
r��s)
�dictr�r�rhrWr�sorted�keysr4r)r>r)�indicesr�rrr
�	test_dict�sz_TestContainers.test_dictcCsv|��}ttdd��}|D]}t|�||<qt|�}|�t|�|�|�t|�g�t|�}|��|�tt	|�dS)Nrerf)
rjr�r�rhr5rWr
r�r�r^)r>r)rmr�r_rrr
�test_dict_iter�sz_TestContainers.test_dict_itercCs�|jddd�}|jddd�}|j||d�}|�|dd�|�|d	dd�d
|d	d<|�|dd
�|�|d	dd
�d|d	d<|�|dd�|�|d	dd�~~|�|d
dd�d|d	d<|�|d	dd�|d
}|d	}d|d<|�|dd�|�|d	dd�|��|�t|�d�|�|dd�|�|dd�|�||g�}d|dd<|�|dd�|�|ddd�~~|�|ddd�|�ddg|g�}|�|dt�|�|dddd�dS)Nr�rc)�ferrets�hamstersr�rS)�water�feed)�pets�suppliesrrrurcZblanketsrdrtrp�rrqrOZmarmots�X�cr3rs)rjrWr
rur�rs)r>rtrur)�lZouterrrr
�test_dict_proxy_nested�sFz&_TestContainers.test_dict_proxy_nestedcCsh|��}d|_d|_d|_|�|j|jfd�|`|�t|�d�|�t|d��|�t|d��dS)N�Bob�BuilderZhidden)r{r|zNamespace(name='Bob')r!�job)�	Namespacer!r}Z_hiddenrWr9rpr�)r>r�rrr
�test_namespace�sz_TestContainers.test_namespaceN)rGrHrIr\r]r`rdrnrorzrrrrr
rXcs


.rXr(cCst�|�||Srr�)r.r'rrr
�sqr�s
r�cCs||Srr)r.r/rrr
�mul�sr�cCst�|�tdd��dS)Nr.i)r@r�r7r&rrr
�raise_large_valuerror�s
r�cCs|Srr�r.rrr
�identity	sr�c@s eZdZdZdd�Zdd�ZdS)�
CountedObjectrcCs|jd7_t�|�SrN)�n_instancesr��__new__r�rrr
r�		szCountedObject.__new__cCst|�jd8_dSrN)r�r�r`rrr
�__del__
	szCountedObject.__del__N)rGrHrIr�r�r�rrrr
r�	sr�c@seZdZdS)�SayWhenErrorN�rGrHrIrrrr
r�	sr�ccs8|dkrtd��t|�D]}||kr,td��|VqdS)Nr3zSomebody said when)r�r�)�totalZwhenr�rrr
�exception_throwing_generator	sr�cseZdZe�fdd��Ze�fdd��Zdd�Zdd�Zd	d
�Zdd�Z	d
d�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zed+d,��Zd-d.�Zed/d0��Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Z �Z!S);�	_TestPoolcst���|�d�|_dSr�)�super�
setUpClass�Pool�poolr���	__class__rr
r�	s
z_TestPool.setUpClasscs(|j��|j��d|_t���dSr)r�r�r�r��
tearDownClassr�r�rr
r�"	s

z_TestPool.tearDownClasscCs@|jj}|�|td�td��|�|tdddi�tdd��dS)N)rcrcrr.rSr�)r��applyrWr�)r>Zpapplyrrr
�
test_apply)	sz_TestPool.test_applyc	Csh|jj}|�|tttd���tttttd�����|�|tttd��dd�tttttd�����dS)Nr�r�r��	chunksize)r��maprWr�r�r�)r>Zpmaprrr
�test_map.	s
,�z_TestPool.test_mapcCs�|jj}tttd�tddd���}|�|t|�tt�t|���tttd�tddd���}|�|t|dd�tt�t|���dS)Nr�r[r3r�rxrr�)r��starmapr�r2r�rWr��	itertools)r>Zpsmap�tuplesrrr
�test_starmap4	s��z_TestPool.test_starmapcCsDtttd�tddd���}|�|j�t|���tt�	t|���dS)Nr�rxr3)
r�r2r�rWr�Z
starmap_asyncr�r�r�r�)r>r�rrr
�test_starmap_async=	s�z_TestPool.test_starmap_asyncc	Cs8|�|j�tttd�����tttttd�����dSr�)rWr��	map_asyncr�r�r�r�r�r`rrr
�test_map_asyncB	s�z_TestPool.test_map_asynccCs�|jdkr|j��ng}|jjtdg|j|jd���|�dt	|��|�dg|d�|jjtdg|j|jd���|�dt	|��|�
|dt�dS)NrL�1)�callback�error_callbackrOrrSr�)rkrLr�r�r�r�r�r'rWrursr7)r>Z	call_argsrrr
�test_map_async_callbacksF	s�
�
z"_TestPool.test_map_async_callbacksc	Cs\|jdkr|�d�|j��Gdd�dt�}|�t��|j�t|�gd�W5QRXdS)NrMrjc@seZdZdd�ZdS)z*_TestPool.test_map_unplicklable.<locals>.AcSstd��dS)Nz
cannot pickler�r`rrr
r[X	sz5_TestPool.test_map_unplicklable.<locals>.A.__reduce__Nr�rrrr
�AW	sr�r�)	rkrlrmr�r�r�r�r�r�)r>r�rrr
�test_map_unplicklableS	s

z_TestPool.test_map_unplicklablecCsDz|jjtgdd�jtd�Wn tjk
r>|�d�YnXdS)NrOr�rz2pool.map_async with chunksize stalled on null list)r�r�r�r�rhr�TimeoutErrorrr`rrr
�test_map_chunksize]	sz_TestPool.test_map_chunksizec	Cs|jdkr|�d�|j��|�t��|j�ttdd�d�W5QRX|�t��|j�ttdd�d�W5QRX|�t��|j�ttdd�d�W5QRXGdd�d�}|�t��|j�t|�d�W5QRX|�t��|j�t|�d�W5QRXdS)	NrLrjrOr3r�rSc@s$eZdZdd�Zdd�Zdd�ZdS)zE_TestPool.test_map_handle_iterable_exception.<locals>.SpecialIterablecSs|Srrr`rrr
�__iter__r	szN_TestPool.test_map_handle_iterable_exception.<locals>.SpecialIterable.__iter__cSst�dSr)r�r`rrr
�__next__t	szN_TestPool.test_map_handle_iterable_exception.<locals>.SpecialIterable.__next__cSsdSrNrr`rrr
r�v	szM_TestPool.test_map_handle_iterable_exception.<locals>.SpecialIterable.__len__N)rGrHrIr�r�r�rrrr
�SpecialIterableq	sr�)	rkrlrmr�r�r�r�r�r�)r>r�rrr
�"test_map_handle_iterable_exceptionc	s
   z,_TestPool.test_map_handle_iterable_exceptioncCs<|j�tdtf�}t|j�}|�|�d�|�|jt�dS)Nrd�1)	r��apply_asyncr�rhr;r�rWrUr=�r>rYr�rrr
�
test_async}	s
z_TestPool.test_asynccCsD|j�tdtdf�}t|j�}|jtj|td�|�	|j
t�dS)Nr^r�r)r�r�r�rir;r�r�rr�rUr=r�rrr
�test_async_timeout�	s
z_TestPool.test_async_timeoutc	Cs�|j�tttd���}|�t|�tttttd�����|j�tttd���}td�D]}|�t|�||�qV|�t	|j
�|jjtttd��dd�}td�D]}|�t|�||�q�|�t	|j
�dS�Nr�r%r�r�)r��imapr�r�r�rWr�r^r��
StopIterationr��r>r_r�rrr
�	test_imap�	s"z_TestPool.test_imapcCs<|jdkr|�d�|j��|j�ttdd�d�}|�t|j	�|j�ttdd�d�}|�t|j	�|j�ttdd�d�}t
d�D]}|�t|�||�q�|�t|j	�|j�ttdd�d	�}t
d
�D]}|�t|�||�q�|�t|j	�|j�ttdd�d�}t
d�D]}|�t|�||��q|�t|j	�dS)NrLrjrOr3r�rSrrdr�r^rc)
rkrlrmr�r�r�r�r�r�r�r�rWr^r�rrr
�#test_imap_handle_iterable_exception�	s$
z-_TestPool.test_imap_handle_iterable_exceptionc	Csx|j�tttd���}|�t|�tttttd�����|jjtttd��dd�}|�t|�tttttd�����dSr�)r��imap_unorderedr�r�r�rWrkr�)r>r_rrr
�test_imap_unordered�	s"z_TestPool.test_imap_unorderedc	CsF|jdkr|�d�|j��|j�ttdd�d�}|�t|j	�|j�ttdd�d�}|�t|j	�|j�ttdd�d�}t
ttt
td����}|�t��2td�D]"}t
|�}|�||�|�|�q�W5QRX|j�ttdd�d	�}t
ttt
td����}|�t��4td�D]$}t
|�}|�||�|�|��qW5QRXdS)
NrLrjrOr3r�rSrrdr�)rkrlrmr�r�r�r�r�r�r�r�r�r�r^r�r)r>r_Zexpected_valuesr�rXrrr
�-test_imap_unordered_handle_iterable_exception�	s@
����z7_TestPool.test_imap_unordered_handle_iterable_exceptioncCst|jdkrtnt}|�||jd�|�||jd�|jdkrp|�d�}z|�dt|j	��W5|��|��XdS)NrLr3rrS)
rk�RemoteErrorr7r�r�rr�rWru�_pool)r>Zexpected_errorr�rrr
�test_make_pool�	s�

z_TestPool.test_make_poolcCsP|jjtjdd�td�D�dd�}|j��t|jj�}|�|�|j	d�dS)NcSsg|]}d�qS)r$rr�rrr
r��	sz,_TestPool.test_terminate.<locals>.<listcomp>i'rOr�r')
r�r�r@r�r�r�r;r��
assertLessr=)r>r�r�rrr
r��	s�
z_TestPool.test_terminatecCsz|�d�}|�|�tg�g�|�t|�tg��g�|�t|�tg��g�|�|�tg���g�|�	�|�
�dSrN)r�rWr�r�r�r�r�r�r�rr�r�rrr
�test_empty_iterable�	s
z_TestPool.test_empty_iterablec	Cst|jdkrpttd��}dd�|D�}|�d��"}|�t|�}|�|��|�W5QRX|��|�	t
|jt|�dS)NrKr�cSsg|]}t|��qSr)r�r�rrr
r�
sz*_TestPool.test_context.<locals>.<listcomp>r�)rkr�r�r�r�r�rWr�r�r�r7)r>�Lr�r�r?rrr
�test_context
s
z_TestPool.test_contextcCstd��dS)N�{r�r�rrr
�_test_traceback
sz_TestPool._test_tracebackcCs�|jdk�r�|�d��H}z|�|j�Wn&tk
rN}z|}W5d}~XYnX|�d�W5QRX|��|�t|�t	�|�
|jd�|j}|�t|�t
jj�|�d|j�tj���2}z|�Wn"t	k
r�tjt���YnXW5QRX|�d|���|�d��p}z|�ttdd�d�Wn(tk
�rP}z|}W5d}~XYnX|�d�|�t|�t�|�|jd�W5QRX|��dS)NrKrOzexpected RuntimeError)r�z&raise RuntimeError(123) # some commentr3zexpected SayWhenError)rkr�r�r��	Exceptionrr�r�r�r�rWrB�	__cause__rr�ZRemoteTracebackr��tbr�rr�r��
excepthook�exc_info�getvaluer�r�r�r�)r>r�r��exc�cause�f1rrr
�test_traceback
s<�
z_TestPool.test_tracebackcCstd��dS)Nr�r�r�rrr
�_test_wrapped_exception5
sz!_TestPool._test_wrapped_exceptionc
CsD|�d��(}|�t��|�|j�W5QRXW5QRX|��dSrN)r�r�r�r�r�r�r�rrr
�test_wrapped_exception9
s z _TestPool.test_wrapped_exceptioncCs~t��}|�t��N|�d��8}z|�t	ddg�W5t�d�|��|��XW5QRXW5QRX|�
t��|d�dS)Nr�rrrOg�������?)r@rAr�r7r�r�rr�r�r��
assertGreater)r>Zt_startr�rrr
�test_map_no_failfast@
s
z_TestPool.test_map_no_failfastcCshdd�td�D�}dd�|D�}|j�t|�~t�t�|�tdd�|D��dh�|�t	j
d�dS)NcSsg|]
}t��qSr)r�r�rrr
r�W
sz4_TestPool.test_release_task_refs.<locals>.<listcomp>r�cSsg|]}t�|��qSr)r�r�)r��orrr
r�X
scss|]}|�VqdSrr)r�r�rrr
ri]
sz3_TestPool.test_release_task_refs.<locals>.<genexpr>r)r�r�r�r�r@r�r�rWr�r�r�)r>ZobjsZrefsrrr
�test_release_task_refsT
s
z _TestPool.test_release_task_refsc
Cs`|jdkr|�d�|�d�}|�W5QRX|�t��|�W5QRXW5QRX|��dS)NrL�test not applicable to managerrO)rkrlr�r�r7r��r>r�rrr
�
test_enterb
s



z_TestPool.test_enterc	Csb|jdkr|�d�|�d�}|��|��tjj|_t	�
dtf��d}t	��W5QRXdS)NrLr�rOz%unclosed running multiprocessing pool)
rkrlr�r�r�rr�ZRUN�_staterZcheck_warnings�ResourceWarning�
gc_collectr�rrr
�test_resource_warningr
s



�z_TestPool.test_resource_warning)"rGrHrIr/r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��
__classcell__rrr�r
r�	sB	

$


&
r�cCstd��dS)N�key)�KeyErrorrrrr
�raising�
sr�cCsdd�S)NcSsdS)N�*rrrrr
r��
r�z%unpickleable_result.<locals>.<lambda>rrrrr
�unpickleable_result�
sr�c@s eZdZdZdd�Zdd�ZdS)�_TestPoolWorkerErrorsr=csjt�d�}dg��fdd�}|jt|d�}|�t|j�|��d�|��dt�|�	�|�
�dS)Nr�cs|�d<dSr�r�r��Z
scratchpadrr
�errback�
sz@_TestPoolWorkerErrors.test_async_error_callback.<locals>.errback�r�r)rr�r�r�r�r�r�rprsrr�)r>r�r�rYrr�r
�test_async_error_callback�
s
z/_TestPoolWorkerErrors.test_async_error_callbackcs�ddlm}t�d�}td�D]l}dg��fdd�}|jt|d�}|�||j��d}|�	|�|�
�d|�|�|j�|�|j
�q|��|��dS)Nr)�MaybeEncodingErrorr�rcs|�d<dSr�rr�r�rr
r��
sz?_TestPoolWorkerErrors.test_unpickleable_result.<locals>.errbackr�)�multiprocessing.poolr�rr�r�r�r�r�r�rprsZassertIsNotNoner�rXrr�)r>r�r�Z	iterationr�rY�wrappedrr�r
�test_unpickleable_result�
s

z._TestPoolWorkerErrors.test_unpickleable_resultN)rGrHrIr\r�r�rrrr
r��
sr�c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�_TestPoolWorkerLifetimer=c	Cstjddd�}|�dt|j��dd�|jD�}g}td�D]}|�|�t|f��q<t	|�D]\}}|�|�
�t|��q^|��d}|r�tdd	�|jD��s�|d
8}t
�t�q�dd�|jD�}|�d|�|�d|�|�t|�t|��|��|��dS)NrSr���maxtasksperchildcSsg|]
}|j�qSr�r��r�rJrrr
r��
szE_TestPoolWorkerLifetime.test_pool_worker_lifetime.<locals>.<listcomp>r��2css|]}|��VqdSr�rqr�rrr
ri�
szD_TestPoolWorkerLifetime.test_pool_worker_lifetime.<locals>.<genexpr>rOcSsg|]
}|j�qSrr�r�rrr
r��
s)rr�rWrur�r�r�r�r��	enumerater�Z_repopulate_pool�allr@r�r�r�r�rkrr�)	r>r�Zorigworkerpidsrr�r&rYZ	countdownZfinalworkerpidsrrr
�test_pool_worker_lifetime�
s&z1_TestPoolWorkerLifetime.test_pool_worker_lifetimecCsptjddd�}g}td�D]}|�|�t|df��q|��|��t|�D]\}}|�	|�
�t|��qNdS)NrSrOr�r^g333333�?)rr�r�r�r�r�rr�r�rWr�)r>r�rr�r&rYrrr
�%test_pool_worker_lifetime_early_close�
sz=_TestPoolWorkerLifetime.test_pool_worker_lifetime_early_closecCs*d}tjj�d|�\}}}|�|d�dS)Na�if 1:
            from multiprocessing import Pool
            problem = None
            class A:
                def __init__(self):
                    self.pool = Pool(processes=1)
            def test():
                global problem
                problem = A()
                problem.pool.map(float, tuple(range(10)))
            if __name__ == "__main__":
                test()
        �-cr)r�r�
script_helper�assert_python_okrW�r>�cmdr��outrHrrr
�>test_worker_finalization_via_atexit_handler_of_multiprocessing�
s
zV_TestPoolWorkerLifetime.test_worker_finalization_via_atexit_handler_of_multiprocessingN)rGrHrIr\r�r�r�rrrr
r��
s
r�)�BaseManager�	BaseProxyr�c@s$eZdZdd�Zdd�Zdd�ZdS)�FooBarcCsdS)N�f()rr`rrr
rG�
szFooBar.fcCst�dSr)r7r`rrr
�g�
szFooBar.gcCsdS)N�_h()rr`rrr
�_h�
sz	FooBar._hN)rGrHrIrGrrrrrr
r�
srccstd�D]}||VqdSr�)r�)r�rrr
�baz�
src@s eZdZdZdd�Zdd�ZdS)�
IteratorProxy)r�cCs|Srrr`rrr
r�szIteratorProxy.__iter__cCs
|�d�S)Nr�)�_callmethodr`rrr
r�szIteratorProxy.__next__N)rGrHrIZ	_exposed_r�r�rrrr
rsrc@seZdZdS)�	MyManagerNr�rrrr
rsr�Foo)�callable�Bar)rGr)r
Zexposed)r
Z	proxytypec@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�_TestMyManagerrYcCs<t�}|��|�|�|��|�|jjdtjf�dSr�)	rr��common�shutdownr��_processrxr�r��r>rLrrr
�test_mymanagers

z_TestMyManager.test_mymanagerc	Cs8t��}|�|�W5QRX|�|jjdtjf�dSr�)rr
r�rrxr�r�rrrr
�test_mymanager_contextsz%_TestMyManager.test_mymanager_contextc	Cs<t�}|��|�|�|�W5QRX|�|jjd�dSr�)rr�r
rWrrxrrrr
�!test_mymanager_context_prestarted's
z0_TestMyManager.test_mymanager_context_prestartedcs|���|���|��}�fdd�dD�}�fdd�dD�}|�|ddg�|�|ddg�|����d�|�t�j�|���d�d�|�t	�jd�|����d�|���
�d	�|���d�d�|���d�d	�|�t|�d
d�td�D��dS)Ncsg|]}t�|�r|�qSr�r��r�r!)r�rr
r�3s
z)_TestMyManager.common.<locals>.<listcomp>)rGrrcsg|]}t�|�r|�qSrrr)�barrr
r�4s
rGrrrrcSsg|]}||�qSrrr�rrr
r�Csr�)
r	rrrWrGr�r7rrr�rr�r�)r>rLrZfoo_methodsZbar_methodsr)rr�r
r
.s z_TestMyManager.commonN)rGrHrIr\rrrr
rrrr
rs
rcCstSr)�_queuerrrr
�	get_queueKsrc@seZdZdZdS)�QueueManagerz$manager class used by server processN�rGrHrIr�rrrr
rNsrc@seZdZdZdS)�
QueueManager2z@manager class which specifies the same interface as QueueManagerNrrrrr
rRsr�	xmlrpclibc@sBeZdZdZdddddddgZedd�Zed	d
��Zdd�ZdS)
�_TestRemoteManagerrY�hello worldNT�@uhallå världenuпривіт світs
hall� v�rldencCs2t||td�}|��|��}|�t|j��dS)N��addressroZ
serializer)r�
SERIALIZER�connectrre�tupler4�r�r!rorLrrrr
�_puttercs�z_TestRemoteManager._puttercCs�t�d�}ttjjdf|td�}|��|�|j	�|j
|j|j|fd�}d|_
|��t|j|td�}|��|��}|�|��|j�|�t|jtj�~dS)N� rr r�T)r4�urandomrr�r�HOSTr"r�r�rr~r&r!rrrr#rrWr�r�r�r�rer@r�)r>rorLr�Zmanager2rrrr
�test_remotems*

��z_TestRemoteManager.test_remote)	rGrHrIr\r4r�r/r&r*rrrr
rYs�
	rc@s eZdZedd��Zdd�ZdS)�_TestManagerRestartcCs,t||td�}|��|��}|�d�dS)Nr r)rr"r#rrer%rrr
r&�s�z_TestManagerRestart._putterc
Cs(t�d�}ttjjdf|td�}zd|�	�}|j
}|j��|�
�|j|j|j
|fd�}|�
�|��|��}|�|��d�~W5t|d�r�|��Xt||td�}z|�
�|�|j�Wnbtk
�r"}zB|jtjkr�t�d�t||td�}t|d��r|�|j�W5d}~XYnXdS)Nr'rr rr�rr�)r4r(rr�rr)r"r�rZ
get_serverr!�listenerrr�r~r&r�rrWr�r��OSError�errnoZ
EADDRINUSEr@r�)r>rorLZsrvr�addrr�rr�rrr
�test_rapid_restart�sL

�


�
�z&_TestManagerRestart.test_rapid_restartN)rGrHrIr/r&r0rrrr
r+�s
r+�c@s�eZdZdZedd��Zdd�Zdd�Zdd	�Zd
d�Z	edd
��Z
ed$dd��Ze�
ed�dd��Ze�
ed�e�ejdkd�e�edkd�e�
eed�d�dd�����Zedd��Ze�
ed�e�ejdkd�dd ���Zd!d"�Zd#S)%�_TestConnectionricCs(t|jt�D]}|�|�q|��dSr)r5�
recv_bytes�SENTINEL�
send_bytesr)r�r#�msgrrr
�_echo�sz_TestConnection._echoc
CsL|��\}}|j|j|fd�}d|_|��dddg}td�}|d}t�dttd���}|j	d	krx|�
t|���t
�|�
|�|�d�|�
|��|�|�
|�|�d�|�
|��|�|j	d	k�r t�dd
gd�}t|�d
gdt|�}	|�
|�|�d�|�
|�|�t|�|j�|�
t|�|	�t�dd
gd�}d
gdt|�d
gdt|�}	|�
|�|�d�|�
|�|d|j�t|�|j�|�
t|�|	�ttd
��}|�
|�|�d�z|�|�}
Wn6tjk
�r}z|�
|j|f�W5d}~XYnX|�d|
�t|j�}|�
|�d�|�|jd
�|�
|d�d�|�|jd
�|�
|t�d�|�|jt�|�d�t� d�|�
|t�d�|�|jd
�|�
|��d�td�d}
|�|
�|�
|��|
�|�t!�|�"�|j	d	k�r@|�
|j#d�|�
|j$d�|�%t&|j�|�%t&|j�|�'�dS)Nr�TrOrrr�r�rcrKrrSrdz(                                        zexpected BufferTooShort, got %sFr3r$�Xi)(r�r~r7rrr�r	rPr�r�rkrWr��filenor�r�r�r5r3ru�recv_bytes_into�itemsize�	bytearrayr�BufferTooShortrBrr;r�rUr=rhr@r�r4r�readable�writabler��EOFErrorr�)r>r#r3r�rKr6ZlongmsgrQ�bufferr�rYr�r�Zreally_big_msgrrr
�test_connection�sv

�$�"




z_TestConnection.test_connectioncCs�|jdd�\}}|�|�d�d�|�|��d�|jdkr�|�|jd�|�|jd�|�|jd�|�|jd�|�t|jd�|�t|j�|�t|j	�dS)NFr�rOrKTr�)
r�rWr�r�rkr>r?r�r-r�)r>�reader�writerrrr
�test_duplex_falses
z!_TestConnection.test_duplex_falsecCst|��\}}|j|j|fd�}d|_|��|��td�}|�|�|�|�	�|�|�t
�|��|��dS)Nr�Tr�)r�r~r7rrr�rr	r5rWr3r4r�)r>r#r3r�r6rrr
�test_spawn_close%s

z _TestConnection.test_spawn_closecCs:|jdkr|�d�|j��td�}|��\}}|�|�|�|��|�|�|d�|�|��|dd��|�|dd�|�|��|dd��|�|d�|�|��td	��|�|dd
�|�|��td	��|�t	|j|d�|�t	|j|dd�|�t	|j|dd
�|�t	|j|d�|�t	|j|dd�dS)NrKrj�abcdefghijklmnopqrstuvwxyzrcrdrT��r1r��rOr3rc)
rkrlrmr	r�r5rWr3r�r7)r>r6rSrTrrr
�test_sendbytes:s&

z_TestConnection.test_sendbytesc
CsRzt�|�Wn:tk
rH}z|jtjkr6WY�
dS�W5d}~XYnXdSdS)NFT)r4�fstatr-r.�EBADF)r�rPr�rrr
�_is_fd_assignedZs
z_TestConnection._is_fd_assignedFcCsd|r.tdd�D]}|�|�st�|��|�qt�|�}trJt�|tj	�}t�
||�t�|�dS)Nrr,)r�rOr4�dup2r9r�recv_handle�msvcrt�open_osfhandlerMr|r)r�r#�dataZcreate_dummy_fdsr�rPrrr
�_writefdes

z_TestConnection._writefd�$test needs multiprocessing.reductionc	Cs�|jdkr|�d�|jdd�\}}|j|j|dfd�}d|_|��|�tj	j
tj	j�ttj	jd��,}|�
�}tr�t�|�}t�|||j�W5QRX|��ttj	jd��}|�|��d�W5QRXdS)	NrK�only makes sense with processesTr�sfoor��wb�rb)rkrlr�r~rUrrr�r�r�rrBrArDr9rRZ
get_osfhandler�send_handler�r�rWrE)r>r#r3r�rGrPrrr
�test_fd_transferqs


z _TestConnection.test_fd_transferr%�*test semantics don't make sense on Windowsr,z)largest assignable fd number is too smallrPztest needs os.dup2()c
Cs
|jdkr|�d�|jdd�\}}|j|j|ddfd�}d|_|��|�tj	j
tj	j�ttj	jd��d}|�
�}tdt�D]}|�|�s~q�q~|�d	�t�||�zt�|||j�W5t�|�XW5QRX|��ttj	jd
��}|�|��d�W5QRXdS)NrKrWTr�sbarr�rXr,z2could not find an unassigned large file descriptorrY)rkrlr�r~rUrrr�r�r�rrBrArDr9r��MAXFDrOrr4rPrrrZr�r�rWrE)r>r#r3r�rGrPZnewfdrrr
�test_large_fd_transfer�s(	



z&_TestConnection.test_large_fd_transfercCst�|��d�dS)N�)r4r|r9�r>r#rrr
�_send_data_without_fd�sz%_TestConnection._send_data_without_fdzdoesn't make sense on WindowscCs`|jdkr|�d�|jdd�\}}|j|j|fd�}d|_|��|�tt	j
|�|��dS)NrKrWTr�r�)rkrlr�r~rarrr�r�r�rrQr��r>r#r3r�rrr
�test_missing_fd_transfer�s

z(_TestConnection.test_missing_fd_transferc
Cs�|��\}}|�R|�B|�d�|�|��d�|jdkrT|�|j�|�|j�W5QRXW5QRX|jdkr�|�|j�|�|j�|�t	|j�|�t	|j�dS�N�rK)
r�r�rWr�rkr��closedrpr�r-rRrrr
r��s

 
z_TestConnection.test_contextN)F)rGrHrIr\r/r7rBrErFrLrOrUr8r0�
HAS_REDUCTIONr[rWr�r�r]r�r4r^rarcr�rrrr
r2�s<
O
 




�
��


r2c@s6eZdZdZdd�Zdd�Ze�ej	d�dd��Z
d	S)
�
_TestListenerr=cCsB|jjD]4}|jj|d�}|�|j�|�t|jj|j|�qdS)N��family)�
connection�families�Listenerr�rr�r-r!)r>rjryrrr
�test_multiple_bind�s�z _TestListener.test_multiple_bindcCsz|j���N}|j�|j��4}|��� }|�d�|�|��d�W5QRXW5QRXW5QRX|jdkrv|�	t
|j�dSrd�rkrm�Clientr!�acceptr�rWr�rkr�r-)r>ryrgr)rrr
r��s

.
z_TestListener.test_contextz"test needs abstract socket supportcCs||j�d��N}|j�|j��4}|��� }|�d�|�|��d�W5QRXW5QRXW5QRX|jdkrx|�	t
|j�dS)Nz
somethingrerKro)r>r,�clientr)rrr
�test_abstract_socket�s

.
z"_TestListener.test_abstract_socketN)rGrHrIr\rnr�r8r0r�abstract_sockets_supportedrsrrrr
rh�s
�rhc@s4eZdZdZedd��Zdd�Zdd�Zdd	�Zd
S)�_TestListenerClientricCs"|j�|�}|�d�|��dS)Nr�)rkrpr�r)r�r!r#rrr
r�s
z_TestListenerClient._testcCsj|jjD]\}|jj|d�}|j|j|jfd�}d|_|��|��}|�	|�
�d�|��|��qdS)Nrir�Tr�)
rkrlrmr~rr!rrr�rqrWr�r�r)r>rjryr�r#rrr
�test_listener_client�sz(_TestListenerClient.test_listener_clientcCsj|j��}|j|j|jfd�}d|_|��t�d�|�	�}|�
|��d�|��|�
�|��dS)Nr�TrOr�)rkrmr~rr!rrr�r@r�rqrWr�rr�)r>ryr�r#rrr
�test_issue14725�s

z#_TestListenerClient.test_issue14725cCsh|jjD]Z}|jj|d�}|j�|j�}|��}|�d�|�|�d��|�	�|�	�|�	�qdS)Nri�hellorO)
rkrlrmrpr!rqr5rpr�r)r>�famryrgrSrrr
�test_issue16955
s
z#_TestListenerClient.test_issue16955N)	rGrHrIr\r/rrvrwrzrrrr
ru�s
ruc@sTeZdZdZdd�Zedd��Zdd�Zedd	��Zd
d�Z	edd
��Z
dd�ZdS)�	_TestPollricCsJ|��\}}|�|��d�|�d�|�|��d�|�|��d�dS)NFr�T)r�rWr�r5rRrrr
�test_empty_string
s

z_TestPoll.test_empty_stringcCs*|D]}t�d�|�|�q|��dS�Nr$)r@r�r5r)r�r#�stringsrrrr
�_child_strings%
s
z_TestPoll._child_stringscCsrd}|��\}}|j|j||fd�}|��|D]4}td�D]}|�d�r<qPq<|��}|�||�q0|��dS)N)rxr��a�br�sbyer�slopr���r�)	r�r~rr�r�r�r3rWr�)r>r~rSrTr�rr�r.rrr
�test_strings,
s
z_TestPoll.test_stringscCs|�d�dSrb)r�)r�r?rrr
�_child_boundaries;
sz_TestPoll._child_boundariescCsr|�d�\}}|j|j|fd�}|��t�d�ddg}|D]}|�|�q>|��|��|�	|�
�|�dS)NFr�r�sfirstssecond)r�r~r�r�r@r�r5rr�r�r3)r>r?rJr�r�rvrrr
�test_boundariesC
s
z_TestPoll.test_boundariescCs"|�d�|�d�|�d�dS)Nr�r��cd)r5)r�rTrrr
�_child_dont_mergeO
s

z_TestPoll._child_dont_mergecCs�|��\}}|�|�d�d�|�|�d�d�|j|j|fd�}|��|�|��d�|�|�d�d�|�|�d�d�|�|��d�|�|�d�d�|�|�d�d�|�|�d�d�|�|��d	�|��dS)
Nr(Fr$r�r�r�Tr�r�)r�rWr�r~r�r�r3r�)r>rSrTr�rrr
�test_dont_mergeU
sz_TestPoll.test_dont_mergeN)rGrHrIr\r|r/rr�r�r�r�r�rrrr
r{
s


r{rVc@sPeZdZdZedd��Zedd��Zedd��Zdd	�Zed
d��Z	dd
�Z
dS)�_TestPicklingConnectionsr=cCsddlm}|jtd�dS)Nr)�resource_sharerr)rr�r;r)r�r�rrr
r�q
sz&_TestPicklingConnections.tearDownClasscCs�|D]@}|jj|d�}|�|j�|��}|�|�|��|��qt�tj	j
df�}|�|���|��\}}|�|�|��|��|��dS)Nrir)
rkrmr�r!rqr�socket�
create_serverr�rr)�getsocknamer�)r�r#rlryry�new_connr/rrr
�	_listenerv
s


z"_TestPicklingConnections._listenercCsxt|jd�D]*\}}|j�|�}|�|���|��q|��\}}t��}|�|�|�	|���|��|��dSr)
r5r�rkrpr�r6rr�r#�sendall)r�r#r!r6rrrrr
�_remote�
s

z _TestPicklingConnections._remotecCs`|jj}|��\}}|j|j||fd�}d|_|��|��|��\}}|j|j|fd�}d|_|��|��|D]D}d|�	d�}	|�
�}
|�|
|	f�|�
�}|�|�
�|	�
��qv|�d�td�}	|�
�}
|�|
|	f�|�
�}g}|�
d�}
|
�s�q|�|
�q�d�|�}|�||	�
��|��|�d�|��|��|��|��dS)Nr�TzThis connection uses family %s�asciiz$This connection uses a normal socketr�r�)rkrlr�r~r�rrr�rr�r
r�r�rWr6r	r�r�)r>rlZlconnZlconn0Zlpr�Zrconn0Zrpryr6r!r��bufrrrr
�
test_pickling�
sF



z&_TestPicklingConnections.test_picklingcCsD|��}|�d�|��|��}|��}|�|d�|��dS)N�all is wellr�)r�r�r)r�r#rJr?r6rrr
�child_access�
s
z%_TestPicklingConnections.child_accesscCs�|��\}}|j|j|fd�}d|_|��|��|jdd�\}}|�|�|��|�|��d�|��|jdd�\}}|�|�|��|�d�|��|�|��d�|�	�dS)Nr�TFr�r�ZfoobarZfoobarfoobar)
r�r~r�rrr�rr�rWr�r�)r>r#r3r�r?rJrrr
�test_access�
s"


z$_TestPicklingConnections.test_accessN)rGrHrIr\r/r�r�r�r�r�r�rrrr
r�l
s


.
r�cs<eZdZdZ�fdd�Z�fdd�Zdd�Zdd	�Z�ZS)
�	_TestHeapr=cs*t���tjjj|_tj��tjj_dSr)r�r�rr�r��_heap�old_heapZHeapr`r�rr
r��
s
z_TestHeap.setUpcs|jtjj_t���dSr)r�rr�r�r�r�rr`r�rr
r�
sz_TestHeap.tearDownc
CsTd}d}g}tjjj}d|_t|�D]L}tt�dd�d�}tj�|�}|�	|�t
|�|krnt�|�}||=~q$|j��Xg}d}	d}
t
|j���D]@}|D]6\}}
}|�	|j�|�|
|||
df�|	||
7}	q�q�|j��D]B\}}|D]4\}
}|�	|j�|�|
|||
df�|
||
7}
q�q�|�|	|
tdd	�|jD���|��tt
|�d�D]n}||dd
�\}}
}||ddd
�\}}}||k�r�|�||j|j�|�|d�n|�||��q^W5QRXt�|�|�r�|���q�|�|j|j�|�t
|j�d�|�t
|j�d�|�t
|j�d|j�|�t
|j�d�dS)N�r�rrOr%�free�occupiedcss|]}|jVqdSr�rS)r��arenarrr
ri'sz&_TestHeap.test_heap.<locals>.<genexpr>rS)rr�r�r�Z_DISCARD_FREE_SPACE_LARGER_THANr�r��random�lognormvariater�ru�	randranger�r�Z_len_to_seqr4Z_arenas�indexZ_allocated_blocksrrW�sum�sortrS�shufflercZ_n_freesZ
_n_mallocsZ_pending_free_blocks)r>Z
iterationsZ	maxblocksZblocksr�r�rSrTr�r�r�r�r�r�r;Zarena_blocksZnarenaZnstartZnstoprrr
�	test_heapsd



��
�

z_TestHeap.test_heapcCsvt��st��|�tj�t��}|jtjf|��t�d�td�D](}tj	�
d�}tj	�
d�}||_||_qHdS)Nr�r�rO)r��	isenabled�enabler��disable�
get_threshold�
set_thresholdr�rr�r�Zbuddy)r>Z
thresholdsr�rSrTrrr
�test_free_from_gcAs
z_TestHeap.test_free_from_gc)	rGrHrIr\r�rr�r�r�rrr�r
r��
s
@r�c@s"eZdZdefdefdefgZdS)�_Foor.r/�zN)rGrHrIr/r0r1Z_fields_rrrr
r�[s�r�c@s>eZdZdZdd�Zedd��Zddd�Zd	d
�Zdd�Z	d
S)�_TestSharedCTypesr=cCsts|�d�dSr0r1r`rrr
r�fsz_TestSharedCTypes.setUpcCsz|jd9_|jd9_|jd9_|jd9_|jd9_|jd9_tt|��D]}||d9<q`dSr�)rXr.r/r�ru)r�r.r/r�r�rQ�stringr�rrr
�_doublejsz_TestSharedCTypes._doubleFc
Cstdd|d�}ttd|d�}ttd|d�}ttdd|d�}|jdttd	��|d�}|jd
d|d�}td�|_|j	|j
||||||fd
�}d|_|��|�
�|�|jd�|�|jd�|�|jd�|�|jd�|�|jd�td	�D]}	|�||	|	d�q�|�|jtd��dS)Nr�rdr>gUUUUUU�?r,rSr�r)r�rgrr�r�T�gUUUUUU�?r-r^�@Z
hellohello)rr0r1r�rOr�r�r	rXr~r�rrr�r�rWrQr.r/)
r>r�r.r/r�r�rQr�r�r�rrr
�test_sharedctypesus&
z#_TestSharedCTypes.test_sharedctypescCs|jdd�dS)NTr>)r�r`rrr
�test_synchronize�sz"_TestSharedCTypes.test_synchronizecCsTtddd�}t|�}d|_d|_d|_|�|jd�|�|jd�|�|jd�dS)Nr��@r,r)r�rr.r/r�rWrQ)r>r�rrrr
�	test_copy�sz_TestSharedCTypes.test_copyN)F)
rGrHrIr\r�r/r�r�r�r�rrrr
r�bs


r�z&requires multiprocessing.shared_memoryc@s�eZdZdZedd��Zdd�Zdd�Zdd	�Ze	�
ejd
kd�dd
��Z
e	�
ejd
kd�dd��Zdd�Zdd�Zdd�Zdd�ZdS)�_TestSharedMemoryr=cCs8t|t�rt�|�}n|}||jdt|��<|��dSr)rr9r�SharedMemoryr�rur)Zshmem_name_or_objZbinary_dataZ	local_smsrrr
�!_attach_existing_shmem_then_write�s

z3_TestSharedMemory._attach_existing_shmem_then_writecCs|tt���Sr)r9r4rw)r>�prefixrrr
�
_new_shm_name�sz_TestSharedMemory._new_shm_namec
	Cs<|�d�}tj|ddd�}|�|j�|�|j|�|�|jd�|�t	|j
�|j�d|j
d<|�|j
dd�t�|�}|�|j
dd�|��tj|d|jd�}|�|jd|j�|��tj
�r>|�d	�}tj|dd
d�}|�t��Fz4|�|jd
�t�|�}|��|��|��W5|��XW5QRX|�t��tj|ddd�}W5QRXtj
�r�Gdd�dtj�}	|	|�}
|�|
j|j�|
��|�t��t�d
�}|��W5QRX|��|�t��tjddd�}W5QRX|�t��tjddd�}W5QRX|�t��tjdd�}W5QRXdS)NZtest01_tsmbT���createrSr�rrr�Ztest01_dblunlinkr�c@seZdZejejBZdS)zO_TestSharedMemory.test_shared_memory_basics.<locals>.OptionalAttachSharedMemoryN)rGrHrIr4rN�O_RDWRZ_flagsrrrr
�OptionalAttachSharedMemory�sr�Ztest01_nottherer3�r�)r�rr�r�rBrWr!r�rSrur�rr�Z
_USE_POSIXr��FileNotFoundError�FileExistsErrorr7)
r>Z	name_tsmb�smsZalso_smsZsame_smsZname_dblunlinkZsms_unoZsms_duoZthere_can_only_be_one_smsr�Zok_if_exists_smsZnonexisting_smsZsms_invalidrrr
�test_shared_memory_basics�sd



�
�
z+_TestSharedMemory.test_shared_memory_basicscCs�tjddd�}|�|j�|j|j|jdfd�}d|_|��|�	�|�
t|jdd��d�|j|j|dfd�}d|_|��|�	�|�
t|jdd��d�|�
�dS)NTr�r�showdyr�rcsHELLO)rr�r�rBr~r�r!rrr�r�rWrtr�r)r>r�r�rrr
�#test_shared_memory_across_processes	s&��z5_TestSharedMemory.test_shared_memory_across_processesrz#not feasible in non-posix platformsc	Csttj��}|��|�td��}t�|jj	t
j�|�td��}|�t
��t�t��t
j�W5QRX|��dSr�)r�managers�SharedMemoryManagerr��
ShareableListr�r4r�rr�r�r,r�r�rwr)r>�smm�slZsl2rrr
�4test_shared_memory_SharedMemoryServer_ignores_sigint%s
zF_TestSharedMemory.test_shared_memory_SharedMemoryServer_ignores_sigintzresource_tracker is posix onlycCs(d}tjj�d|�\}}}|�|�dS)Nz�if 1:
            from multiprocessing.managers import SharedMemoryManager


            smm = SharedMemoryManager()
            smm.start()
            sl = smm.ShareableList(range(10))
            smm.shutdown()
        r�)r�rr�r�r�r�rrr
�>test_shared_memory_SharedMemoryManager_reuses_resource_tracker=s	zP_TestSharedMemory.test_shared_memory_SharedMemoryManager_reuses_resource_trackerc	sRtj���|�t���jdd�W5QRX����fdd�tdd�D�}�fdd�tdd	d
�D�}tj	|dj
jd�}|�t
|�d�tj|djd�}|�t
|j�d�|dj}���tjd
kr�|�t��tj|d�}W5QRXtj���$}|�	d�}|jd	d�}	|j
j}W5QRXtjd
k�rN|�t��tj	|d�}
W5QRXdS)Nr[r�csg|]}��t|���qSr)r�r�r��Zsmm1rr
r�WszS_TestSharedMemory.test_shared_memory_SharedMemoryManager_basics.<locals>.<listcomp>rcr�csg|]}�j|d��qS)r�)r�)r�r&r�rr
r�Xsr'��r�r!r%�howdy)rr�r�r�r7r�r�r�rr��shmr!rWrur�r�rr�r�r�)r>ZlolZlomZdoppleganger_list0Zdoppleganger_shm0Z	held_nameZ
absent_shmZsmm2r�r�Z	absent_slrr�r
�-test_shared_memory_SharedMemoryManager_basicsRs,



z?_TestSharedMemory.test_shared_memory_SharedMemoryManager_basicsc
Cszt�dddddddg�}|�|jj�|�|jd�|�t|�d�t�	��Bt�
d	�|�t��|�
d
�W5QRX|�|�
d�d�W5QRX|�|dd�|�|d
d�|�t|�d�d|d<|�|dd�d|d<|�|dd�|�|jd�|�td��d|d<W5QRX|�|dd�d|d<|�|dd�|�|dd�|�td��d|d<W5QRX|�|dd�|�td��d|d<W5QRX|�|dd�t�	��Ft�
d	�|�|�d�d�|�|�d�d�|�|�d�d�W5QRX|�d�}tj||d�}z~|�|jj|jj�|�||jj�|�t|�t|��|�|j|j�d|d<|�|dd�|�|dd�|j��W5|j��Xtj|jjd�}|�|jj|jj�d|d<|�|dd�|j��|j��t��}z^|�t|�d�|�|jd�|�|�d �d�|�t��|�
d�W5QRX|j��W5|j��XdS)!Nr��HoWdY�X9��vq�r�Tr�z8s8sdqxxxxxx?xxxxxxxx?qrd�ignoreZ100rSr���)r�r�r�r�NTr�Zsomercz8s8sdq8sxxxxxxx?qzexceeds available storagezfar too manyuencodésrOu	encodéess	123456789r�sadiosZtest03_duplicater��Mr3ipr1�any)rr�r�r�rBrWrmru�warnings�catch_warnings�simplefilterr�r7r�r$r�rr�r�r!r�r)r>r�Zname_duplicateZsl_copyZsl_tetheredZempty_slrrr
�'test_shared_memory_ShareableList_basicsps��

����




z9_TestSharedMemory.test_shared_memory_ShareableList_basicscCs�t�td��}|�|jj�t�|�}t�|�}|�	t
|tj��|�	|dd�|�||k�d|d<|�|dd�dt
|jj�}t�td��}|�|jj�t�|�}|�	t
|�t
|�k�|j��|j��|j��dS)Nr�r3r[�changedrcrSi�)rr�r�r�r�rB�pickle�dumps�loadsrprr�rWrur!r)r>r�Z
serialized_slZdeserialized_slr!Z	larger_slZserialized_larger_slrrr
�)test_shared_memory_ShareableList_pickling�s&


�


z;_TestSharedMemory.test_shared_memory_ShareableList_picklingc	Cs�d}tjtjdd|gtjtjd���}|j������}|�	�|�
�t��d}d}t��|kr�t�
|�t|dd�}ztj|d	d
�}WqVtk
r�Yq�YqVXqVtd��tjdkr�|j����}|�d
|�W5QRXdS)NaXif 1:
            import os, time, sys
            from multiprocessing import shared_memory

            # Create a shared_memory segment, and send the segment name
            sm = shared_memory.SharedMemory(create=True, size=10)
            sys.stdout.write(sm.name + '\n')
            sys.stdout.flush()
            time.sleep(100)
        �-Er�rr�r$r�rcFr�zJA SharedMemory segment was leaked after a process was abruptly terminated.rz[resource_tracker: There appear to be 1 leaked shared_memory objects to clean up at shutdown)�
subprocess�Popenr��
executable�PIPEr�readline�strip�decoder�r'r@rAr��minrr�r�rdr4r!rrEr�)r>r�r�r!�deadlinerDr�rHrrr
�4test_shared_memory_cleaned_after_process_termination�s2
�

�zF_TestSharedMemory.test_shared_memory_cleaned_after_process_terminationN)rGrHrIr\r�r�r�r�r�r8rWr4r!r�r�r�r�r�r�rrrr
r��s
[

`r�c@s<eZdZdZdd�Zdd�Zedd��Zdd	�Zd
d�Z	dS)
�
_TestFinalizer=cCstj��|_tj��dSr)r�_finalizer_registryr�registry_backupr
r`rrr
r�sz_TestFinalize.setUpcCs|�tj�tj�|j�dSr)r�rr��updater�r`rrr
r sz_TestFinalize.tearDowncCsGdd�dt�}|�}tj||jdd�~|�}tj||jdd�}|�|�~|�}tj||jdd�|�}tj||jddd	�|�}tj||jd
dd	�|�}	tj|	|jddd	�|�}
tj|
|jd
dd	�tjd|jddd	�tjd|jddd	�t��|��t�d�dS)Nc@seZdZdS)z)_TestFinalize._test_finalize.<locals>.FooNr�rrrr
r	&sr	)rSr�)rT)rg)�d10rO)rB�exitpriority)�d01r)�d02)�d03�r�i����)�STOPi����)r�r�Finalizer��_exit_functionrr4�_exit)r�r#r	rSrTZclose_brgr�r�r�r�rrr
�_test_finalize$s0z_TestFinalize._test_finalizec
Csh|��\}}|j|j|fd�}d|_|��|��dd�t|jd�D�}|�|dddd	d
ddg�dS)
Nr�TcSsg|]}|�qSrr)r�rvrrr
r�Rsz/_TestFinalize.test_finalize.<locals>.<listcomp>r�rSrTr�r�r�r�r�)	r�r~r�rrr�r�r5r�rW)r>r#r3r�r�rrr
�
test_finalizeJsz_TestFinalize.test_finalizec	s�dd��G�fdd�dt��d�d���fdd�}���fdd	�}t��}t��}zft�d
�t�ddd�tj	|d�tj	|d�g}t
j�|��t
�d
�d�W5QRX�dk	r���W5t�|�tj|�t��XdS)NcSsdSrrrrrr
�cbWsz,_TestFinalize.test_thread_safety.<locals>.cbcseZdZ�fdd�ZdS)z-_TestFinalize.test_thread_safety.<locals>.Foocs"||_tj|�t�dd�d�dS)NrOr�)r�)r�rr�r��randintr`�rrr
r?[sz6_TestFinalize.test_thread_safety.<locals>.Foo.__init__N)rGrHrIr?rrrr
r	Zsr	Fc
sP�sLt�t��d�zt��Wqtk
rH}z|�W5d}~XYqXqdSr})r@r�r�r�_run_finalizersr�r�)r��finishrr
�run_finalizerscsz8_TestFinalize.test_thread_safety.<locals>.run_finalizersc
sbi}�s^z$�fdd�td�D�|t�d�<Wqtk
rZ}z|�|��W5d}~XYqXqdS)Ncsh|]
}���qSrrr�)r	rr
�	<setcomp>uszL_TestFinalize.test_thread_safety.<locals>.make_finalizers.<locals>.<setcomp>r�rc)r�r��getrandbitsr�r
)r)r�)r	r�rrr
�make_finalizersns$z9_TestFinalize.test_thread_safety.<locals>.make_finalizersg���ư>rcr{r�T)r�r��getswitchintervalr�r��setswitchintervalr�r�r�rr�rZ
start_threadsr@r�)r>rr	Zold_intervalZ
old_thresholdrMr)r	rr�rr
�test_thread_safetyUs,


�


z _TestFinalize.test_thread_safetyN)
rGrHrIr\r�rr/r�rrrrrr
r�s
%r�c@seZdZdd�Zdd�ZdS)�_TestImportStarcCshddl}tj�tj�}tj�|�|�d�}|�|�}dd�|D�}dd�|D�}|�d�|�	d�|S)Nrz*.pycSs(g|] }tj�tj�|�d�d�qS)rOr)r4�path�splitext�split)r�rGrrr
r��sz4_TestImportStar.get_module_names.<locals>.<listcomp>cSsg|]}d|�qS)zmultiprocessing.r)r�rrrr
r��szmultiprocessing.__init__r)
�globr4r�dirnamer�__file__r��escaperr�)r>rZfolder�pattern�files�modulesrrr
�get_module_names�s


z _TestImportStar.get_module_namescCs�|��}tjdkr2|�d�|�d�|�d�n|�d�tsJ|�d�tdkr\|�d�|D]N}t|�tj|}|�t	|d�|�|j
D]}|�t	||�d||f�q�q`dS)	Nr%zmultiprocessing.popen_forkz multiprocessing.popen_forkserverz!multiprocessing.popen_spawn_posixz!multiprocessing.popen_spawn_win32zmultiprocessing.sharedctypes�__all__z%r does not have attribute %r)rr�r�rrgr/r~rrpr�r)r>rr!�mod�attrrrr
�test_import�s&








�z_TestImportStar.test_importN)rGrHrIrrrrrr
r
�sr
c@s,eZdZdZdd�Zedd��Zdd�ZdS)	�_TestLoggingr=cCsDt��}|�tj�|�|dk	�|�d�|�d�|�t�dS)Nzthis will not be printedz
nor will this)	r�
get_logger�setLevelr�
SUBWARNINGrp�debug�info�	LOG_LEVEL)r>�loggerrrr
�test_enable_logging�s

z _TestLogging.test_enable_loggingcCst��}|�|���dSr)rrr��getEffectiveLevel)r�r#r$rrr
�_test_level�sz_TestLogging._test_levelc	Cs�d}d}t��}t��}|j}tjdd�\}}|�|�|j|j|fd�}|�	�|�
||���|��|�
�|�tj�|�|�|j|j|fd�}|�	�|�
||���|��|�
�|�|�|jtd�dS)Nr'�%Fr�r�)�level)rr�logging�	getLoggerr)r�rr~r'r�rWr�r�r�NOTSETr#)	r>ZLEVEL1ZLEVEL2r$Zroot_loggerZ
root_levelrCrDr�rrr
�
test_level�s*


z_TestLogging.test_levelN)rGrHrIr\r%r/r'r-rrrr
r�s

rc@s6eZdZdZedd��Ze�ee	d�d�dd��Z
dS)	�_TestPollEintrr=cCst�d�t�|tj�dSr})r@r�r4r�r��SIGUSR1)r�r�rrr
�_killers
z_TestPollEintr._killerr/�requires SIGUSR1c
s�dg��fdd�}t��}t�tj|�}zj|j|j|fd�}|��z$|jtj	dd�}|��|��W5|��X|�
�d�|�|jd�W5t�tj|�XdS)NFcsd�d<dS)NTrrr��Z
got_signalrr
�recordsz._TestPollEintr.test_poll_eintr.<locals>.recordr�)r�r)
r4rwr�r/r~r0r�r�r@r�rprWrx)r>r3r�Z
oldhandlerZkillerr�rr2r
�test_poll_eintr	s
z_TestPollEintr.test_poll_eintrN)rGrHrIr\r/r0r8r0r�r�r4rrrr
r.s

r.c@s eZdZe�ed�dd��ZdS)�TestInvalidHandle�skipped on Windowsc	CsZtj�d�}z*z|��Wnttfk
r2YnXW5d|_X|�ttftjjd�dS)Ni�M�r3)rrk�
Connection�_handler�r7r-r�r`rrr
�test_invalid_handles$s

�z&TestInvalidHandle.test_invalid_handlesN)rGrHrIr8rW�WIN32r9rrrr
r5"s
r5c@seZdZdd�Zdd�ZdS)�	OtherTestcCs,Gdd�dt�}|�tjtjj|�d�dS)Nc@seZdZdd�Zdd�ZdS)zFOtherTest.test_deliver_challenge_auth_failure.<locals>._FakeConnectioncSsdS)N�something bogusr�r>rSrrr
r39szQOtherTest.test_deliver_challenge_auth_failure.<locals>._FakeConnection.recv_bytescSsdSrr�r>rTrrr
r5;szQOtherTest.test_deliver_challenge_auth_failure.<locals>._FakeConnection.send_bytesN)rGrHrIr3r5rrrr
�_FakeConnection8sr?�abc)r�r�r�AuthenticationErrorrk�deliver_challenge�r>r?rrr
�#test_deliver_challenge_auth_failure7s�z-OtherTest.test_deliver_challenge_auth_failurecCs,Gdd�dt�}|�tjtjj|�d�dS)Nc@s$eZdZdd�Zdd�Zdd�ZdS)zEOtherTest.test_answer_challenge_auth_failure.<locals>._FakeConnectioncSs
d|_dSr�)rr`rrr
r?CszNOtherTest.test_answer_challenge_auth_failure.<locals>._FakeConnection.__init__cSs2|jd7_|jdkr tjjS|jdkr.dSdS)NrOr�r<r�)rrrk�	CHALLENGEr=rrr
r3Es

zPOtherTest.test_answer_challenge_auth_failure.<locals>._FakeConnection.recv_bytescSsdSrrr>rrr
r5LszPOtherTest.test_answer_challenge_auth_failure.<locals>._FakeConnection.send_bytesN)rGrHrIr?r3r5rrrr
r?Bsr?r@)r�r�rrArk�answer_challengerCrrr
�"test_answer_challenge_auth_failureAs�z,OtherTest.test_answer_challenge_auth_failureN)rGrHrIrDrGrrrr
r;5s
r;cCs|jd7_dSrN)r�)�nsrrr
�initializerVsrIc@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�TestInitializerscCs"t��|_|j��|_d|j_dSr�)r�Manager�mgrr~rHr�r`rrr
r�Zs
zTestInitializers.setUpcCs|j��|j��dSr)rLrr�r`rrr
r_s
zTestInitializers.tearDowncCsNtj��}|�t|jd�|�t|jf�|�|jj	d�|�
�|��dSrN)rr��SyncManagerr��	TypeErrorr�rIrHrWr�rr�)r>rrrr
�test_manager_initializercs
z)TestInitializers.test_manager_initializercCsH|jttjdd�t�dt|jf�}|��|��|�|jj	d�dS)NrO)rI)
r�rNrr�rIrHrr�rWr�r�rrr
�test_pool_initializerks
z&TestInitializers.test_pool_initializerN)rGrHrIr�rrOrPrrrr
rJYsrJcCs,z|jdd�}Wntjk
r&YnXdS)NF)�block)r�rfro)rf�itemrrr
�_this_sub_processwsrScCs2t��}tjt|fd�}d|_|��|��dSr�)rrr~rSrrr�r�)rZsubProcrrr
�
_test_process}s
rTcCs||Srrr�rrr
�_afunc�srUc
Cs:tjdd�}|�tdddddddg�}|��|��dS)	Nrcr=rOr�rSrcr^rd)rr�r�rUrr�)r�r.rrr
�pool_in_process�srVc@s0eZdZdd�Zedd��Zdd�Zdd�Zd	S)
�
_file_likecCs||_d|_dSr)�	_delegate�_pid)r>Zdelegaterrr
r?�sz_file_like.__init__cCs$t��}||jkr||_g|_|jSr)r4rwrY�_cacher�rrr
�cache�s

z_file_like.cachecCs|j�|�dSr)r[r�r>rrr
r|�sz_file_like.writecCs|j�d�|j��g|_dS)Nr1)rXr|r�r[rZr`rrr
�flush�sz_file_like.flushN)rGrHrIr?�propertyr[r|r\rrrr
rW�s

rWc@s$eZdZdd�Zdd�Zdd�ZdS)�TestStdinBadfiledescriptorcCs tjtd�}|��|��dS�Nr{)rr~rTr�r�)r>rrrr
�test_queue_in_process�sz0TestStdinBadfiledescriptor.test_queue_in_processcCs tjtd�}|��|��dSr_)rr~rVr�r�r�rrr
�test_pool_in_process�sz/TestStdinBadfiledescriptor.test_pool_in_processcsJt��}t|����d�tj�fdd�d�}���|��dksFt�dS)Nr�cs���Sr)r\r�Zflikerr
r��r�z:TestStdinBadfiledescriptor.test_flushing.<locals>.<lambda>r{)	rrrWr|rr~r\r�rd)r>�siorrrbr
�
test_flushing�s
z(TestStdinBadfiledescriptor.test_flushingN)rGrHrIr`rardrrrr
r^�sr^c@sleZdZedd��Zddd�Zedd��Zddd	�Zd
d�Zdd
�Z	dd�Z
edd��Zdd�Zdd�Z
dS)�TestWaitcCsBtd�D],}|r"t�t��d�|�|t��f�q|��dS)Nr�r$)r�r@r�r�r�r4rwr)r�rJ�slowr�rrr
�_child_test_wait�s
zTestWait._child_test_waitFc	sddlm}g}g�g}td�D]^}tjdd�\}}tj|j||fd�}d|_|��|�	�|�
|���
|�|�|j�q |r�||�D]B}z|�
�}	Wn&tk
r�|�|�|�	�Yq�X|�
|	�q�q�|��t�fdd	�td
�D��}
|�||
�dS)Nrr&rcFr�r�Tc3s"|]}�D]}||jfVq
qdSrr�)r�r�r��r�rr
ri�sz%TestWait.test_wait.<locals>.<genexpr>r�)�multiprocessing.connectionr'r�rr�r~rgrrr�rr�r�r�r�r@rr�rkrW)r>rfr'�readers�messagesr�r?rJr�r6r�rrhr
�	test_wait�s0


zTestWait.test_waitcCsVt��}|�|�td�D].}|r4t�t��d�|�d|�d��q|��dS)Nr�r$�%s
r�)	r�r#r�r@r�r�r�r
r)r�r!rfrr�rrr
�_child_test_wait_socket�s
z TestWait._child_test_wait_socketcCs4ddlm}t�tjjdf�}|��}g}g}i}td�D]<}t	j
|j||fd�}	d|	_|	�
�|�|	�|�|	j�q:td�D]"}|��\}
}|�|
�g||
<q�|��|r�||�D]4}
|
�d�}|s�|�|
�|
��q�||
�|�q�q�d�dd	�td
�D���d�}
|��D]}|�d�|�|
��qdS)
Nrr&rcr�Tr'r1css|]}d|VqdS)rmNrr�rrr
risz,TestWait.test_wait_socket.<locals>.<genexpr>r�r�r�)rir'r�r�r�rr)r�r�rr~rnrrr�r�r�r�rqrr�rr
r4rW)r>rfr'ryr/rjr�Zdicr�r�r?r�r6r��vrrr
�test_wait_socket�s:�





zTestWait.test_wait_socketcCs|�d�dSr�)rlr`rrr
�test_wait_slowszTestWait.test_wait_slowcCs|�d�dSr�)rpr`rrr
�test_wait_socket_slowszTestWait.test_wait_socket_slowcCs�ddlm}d}t��\}}t��}|||g|�}t��|}|�|g�|�||d�|�||d�|�	d�t��}|||gd�}t��|}|�||g�|�|d�dS)Nrr&rcr�rr皙�����?)
rir'rr�r@rArWr�r�r�)r>r'r�rSrTr�rYr�rrr
�test_wait_timeouts
zTestWait.test_wait_timeoutcCs|��t�|�dSr)r�r@r�)r�r�Zperiodrrr
�signal_and_sleep)szTestWait.signal_and_sleepcCs�ddlm}d}dd�}t�d�}t��\}}tj|j||fd�}|��|�|j	t
�|�|jdd��t
��}|||j	|g|d�}	t
��|}
|�|	|j	g�|�|
|d	�|�|
|d	�|�d�t
��}|||j	|gd�}	t
��|}
|�||	�||j	|g��|�|
d
�|�d�t
��}|||j	|gd�}	t
��|}
|�||	�|||j	|g��|�|
d
�|��|��dS)Nrr&rScSst|dd�d�S)NcSst|�Sr)r�r�rrr
r�2r�z>TestWait.test_wait_integer.<locals>.<lambda>.<locals>.<lambda>)r�)rk)ryrrr
r�2r�z,TestWait.test_wait_integer.<locals>.<lambda>r�rrr�rs)rir'rr�r�r~rur�rsr�r�rpr�r@rArWr�r�r�r�r�)r>r'r�Zsorted_r�rSrTr�r�rYr�rrr
�test_wait_integer.s>
�

zTestWait.test_wait_integercCsfddlm}t��\}}t��}||gdd�}t��|}|�|g�|�|d�|��|��dS)Nrr&r3rrO)	rir'rr�r@rArWr�r)r>r'rSrTrDrYrrr
�test_neg_timeoutYszTestWait.test_neg_timeoutN)F)F)rGrHrIr/rgrlrnrprqrrrtrurvrwrrrr
re�s


	
#
+rec@s4eZdZe�ed�dd��Ze�ed�dd��ZdS)�TestInvalidFamilyr6c	Cs&|�t��tj�d�W5QRXdS)Nz\\.\test�r�r7rrkrmr`rrr
�test_invalid_familyjsz%TestInvalidFamily.test_invalid_familyz skipped on non-Windows platformsc	Cs&|�t��tj�d�W5QRXdS)Nz/var/test.piperyr`rrr
�test_invalid_family_win32osz+TestInvalidFamily.test_invalid_family_win32N)	rGrHrIr8rWr:rzr0r{rrrr
rxhs


rxc@s,eZdZedd��Zedd��Zdd�ZdS)�	TestFlagscCs|�ttj��dSr)r�r$r��flags�r�r#rrr
�run_in_grandchildyszTestFlags.run_in_grandchildcCsrddl}tjdd�\}}tj|j|fd�}|��|��}|��|��|��t	t
j�|f}t|�
|��dS)NrFr�r�)�jsonrr�r~rr�r�r�rr$r�r}�printr�)r�r�r?rJr��grandchild_flagsr}rrr
�run_in_child}szTestFlags.run_in_childcCsHddl}d}t�tjdddd|g�}|�|�d��\}}|�||�dS)NrzJfrom test._test_multiprocessing import TestFlags; TestFlags.run_in_child()r�z-Sz-Or�r�)r�r��check_outputr�r�r�r�rW)r>r��progrTZchild_flagsr�rrr
�
test_flags�s�zTestFlags.test_flagsN)rGrHrIr/rr�r�rrrr
r|xs


r|c@s eZdZedd��Zdd�ZdS)�TestTimeoutscCs>t�d�|�d�|��tj�|�}|�d�|��dS)NrOr���)r@r�r�rrrkrp)r��childr!r#rrr
�
_test_timeout�s


zTestTimeouts._test_timeoutc	Cs�t��}z�t�d�tjdd�\}}tjjdd�}tj|j||j	fd�}|�
�|��|�|�
�d�|��|��}|�|�
�d�|��|��t|�W5t�|�XdS)	Nr$Tr��AF_INETrir�r�r�)r��getdefaulttimeout�setdefaulttimeoutrr�rkrmr~r�r!r�rrWr�rqr)r>Zold_timeout�parentr�ryr�r#rrr
r��s$
�zTestTimeouts.test_timeoutN)rGrHrIr/r�r�rrrr
r��s
r�c@seZdZdd�ZdS)�TestNoForkBombcCs�t��}tj�tj�t�d�}|dkrVtjj	�
||�\}}}|�|d�|�d|�n2tjj	�
||�\}}}|�|��d�|�|d�dS)Nzmp_fork_bomb.pyrr�sRuntimeErrors123)rr�r4rr�rrr�rr�Zassert_python_failurerWr�r�rU)r>r�r!r�r�rHrrr
�test_noforkbomb�szTestNoForkBomb.test_noforkbombN)rGrHrIr�rrrr
r��sr�c@s eZdZedd��Zdd�ZdS)�TestForkAwareThreadLockcCsV|dkr:tj|j|d|fd�}|��|��t|�n|�ttj	��|��dS)NrOr�)
rr~r�r�rrr�rur�_afterfork_registry)r�r�r#r�rrr
r��s
zTestForkAwareThreadLock.childcCsdt�d�\}}t��}ttj�}tj|jd|fd�}|��|�	�|�
�}t|�|�||�dS)NFrcr�)
rr�r�ForkAwareThreadLockrur�r~r�r�rr�rZassertLessEqual)r>r?rJryZold_sizer�Znew_sizerrr
r��s
z!TestForkAwareThreadLock.test_lockN)rGrHrIr/r�r�rrrr
r��s

r�c@s0eZdZdd�Zdd�Zedd��Zdd�Zd	S)
�TestCloseFdscCsZtrt����St����}g}|dkr>|�|�t�|�}q |D]}t�|�qB|SdS)Nr�)r:r��detachr�r4�dupr)r>rP�to_closer.rrr
�get_high_socket_fd�s
zTestCloseFds.get_high_socket_fdcCs,trtjtjtj|d���n
t�|�dS)N)r9)r:r�r��SOCK_STREAMrr4)r>rPrrr
r�szTestCloseFds.closec
CsZzt�|tjtj�}Wn,tk
rB}z|�|�W5d}~XYnX|��|�d�dSr)r��fromfdr�r�r�r�r)r�r#rPrr�rrr
�_test_closefdsszTestCloseFds._test_closefdsc	Cs�tst�d��t��\}}|��}z8tj|j||fd�}|�	�|��|�
�}t|�W5|�|�|��|��Xt��dkr�|�
|d�n.d}|�|t�|�|jtjkp�|j|k|�dS)Nzrequires fd picklingr�ri6')rgr8r9rr�r�rr~r�r�r�rr�r�rsr-rpr.rN�winerror)r>rCrDrPr�r�ZWSAENOTSOCKrrr
�test_closefds.
�

�zTestCloseFds.test_closefdN)rGrHrIr�rr/r�r�rrrr
r��s

	r�c@sfeZdZeejej�Zedd��Z	e
�ee
d�d�dd��Zedd��Ze
�ee
d�d�d	d
��ZdS)�TestIgnoreEINTRcCsFdd�}t�tj|�|�d�|��}|�|�|�d|j�dS)NcSsdSrr�r*�framerrr
r�3sz-TestIgnoreEINTR._test_ignore.<locals>.handler�ready�x)r�r/r�r�r5�
CONN_MAX_SIZE)r�r#r�r.rrr
�_test_ignore1s

zTestIgnoreEINTR._test_ignorer/r1cCs�t��\}}z�tj|j|fd�}d|_|��|��|�|��d�t	�
d�t�|j
tj�t	�
d�|�d�|�|��d�t	�
d�t�|j
tj�|�|��d|j�t	�
d�|��W5|��XdS)Nr�Tr�r$i�r�)rr�rr~r�rrr�rWr�r@r�r4r�r�r�r/r�r3r�r�rbrrr
�test_ignore;s(�




zTestIgnoreEINTR.test_ignorec	CsNdd�}t�tj|�tj���$}|�|j�|��}|�d�W5QRXdS)NcSsdSrrr�rrr
r�Tsz6TestIgnoreEINTR._test_ignore_listener.<locals>.handler�welcome)r�r/rrkrmr�r!rq)r�r#r�ryrSrrr
�_test_ignore_listenerRsz%TestIgnoreEINTR._test_ignore_listenercCs�t��\}}z|tj|j|fd�}d|_|��|��|��}t�	d�t
�|jt
j�t�	d�tj�|�}|�|��d�|��W5|��XdS)Nr�Tr$r�)rr�rr~r�rrr�r�r@r�r4r�r�r�r/rkrprWr�)r>r#r3r�r!rrrrr
�test_ignore_listener\s �

z$TestIgnoreEINTR.test_ignore_listenerN)rGrHrI�maxrZ
PIPE_MAX_SIZEZ
SOCK_MAX_SIZEr�r/r�r8r0r�r�r�r�r�rrrr
r�,s
	

	r�c@s@eZdZedd��Zdd�Zdd�Zdd�Zd	d
�Zdd�Z	d
S)�TestStartMethodcCs|�t���dSr)r�rr�r~rrr
�_check_contextpszTestStartMethod._check_contextcCs^|jdd�\}}|j|j|fd�}|��|��|��}|��|��|�||���dS)NFr�r�)	r�r~r�r�rr�r�rWr�)r>r�r?rJr�Zchild_methodrrr
�
check_contexttszTestStartMethod.check_contextc	Cs�dD]v}zt�|�}Wntk
r.YqYnX|�|��|�|�|��|�|�t|jd�|�t|jd�|�|�qdS)N�rr�r%r�)	rr�r7rWr�r�r��set_start_methodr�)r>�methodr�rrr
r�~s
zTestStartMethod.test_contextc
Cs�t�t�d}t��}z�dD]�}ztj|dd�Wntk
rJYqYnX|�t��|�t��}|�|��|�|�t	|�j
���|��|�|j
j
���|��|�t�|d7}qW5tj|dd�X|�|d�dS)NrT��forcer�rO)r�set_forkserver_preload�PRELOADr�r�r7rWr�rpr�rG�lower�
startswithr~r�r�)r>rZ
old_methodr�r�rrr
�test_set_get�s(

�
zTestStartMethod.test_set_getcCs`t��}tjdkr"|�|dg�n:|�|ddgkpX|ddgkpX|dddgkpX|dddgk�dS)Nr%r�rr%)r�get_all_start_methodsr�r�rWrp)r>�methodsrrr
�test_get_all�s

���zTestStartMethod.test_get_allcCs�t��dkr|�d�tj�tj�t�d�}tj	j
�|�\}}}|��}|��}|�
�dksd|dkr~t|�t|�|�d�dS)Nr%z*test only relevant for 'forkserver' methodz
mp_preload.py�okr1z(failed spawning forkserver or grandchild)rr�rlr4rr�rrr�rr�r�r�rUr�r)r>r!r�r�rHrrr
�test_preload_resources�s
z&TestStartMethod.test_preload_resourcesN)
rGrHrIr/r�r�r�r�r�r�rrrr
r�os


r�r\c@sHeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zedd��Z	d
d�Z
dS)�TestResourceTrackerc
Cs�d}tjD�]�}|j|d���z|dkr4W5QR�q
t��\}}tjtjdd|j	||d�g|gtj
d�}t�|�t|dd	d
��*}|�
����d�}|�
����d�}W5QRXt||�|��|��t��d}	t��|	k�rDt�d
�zt||�Wq�tk
�r@}
z$|�|
jtjtjf�WY��qTW5d}
~
XYq�Xq�td|�d���|j���d�}|j��d�	|�}|�||�|�|d|�W5QRXq
dS)Na+if 1:
            import time, os, tempfile
            import multiprocessing as mp
            from multiprocessing import resource_tracker
            from multiprocessing.shared_memory import SharedMemory

            mp.set_start_method("spawn")
            rand = tempfile._RandomNameSequence()


            def create_and_register_resource(rtype):
                if rtype == "semaphore":
                    lock = mp.Lock()
                    return lock, lock._semlock.name
                elif rtype == "shared_memory":
                    sm = SharedMemory(create=True, size=10)
                    return sm, sm._name
                else:
                    raise ValueError(
                        "Resource type {{}} not understood".format(rtype))


            resource1, rname1 = create_and_register_resource("{rtype}")
            resource2, rname2 = create_and_register_resource("{rtype}")

            os.write({w}, rname1.encode("ascii") + b"\n")
            os.write({w}, rname2.encode("ascii") + b"\n")

            time.sleep(10)
        )r"Znoopr�r�)rJr")�pass_fdsrrYTrKr�r�rzA z= resource was leaked after a process was abruptly terminated.zutf-8z8resource_tracker: There appear to be 2 leaked {} objectszresource_tracker: %r: \[Errno)rr ZsubTestr4�piper�r�r�r�rmr�rrDr�rUr�r#r�r'r@rAr�r-r�r.�ENOENT�EINVALrdrrEZassertRegex)
r>r�r"r?rJr�rGZname1Zname2r�r�rHr�rrr
�test_resource_tracker�sN��



�
�z)TestResourceTracker.test_resource_trackerc
	Cs4ddlm}|j}|dk	r4t�|tj�t�|d�t�	��t�
d�|��W5QRX|j}t�||�t�
d�t�d�}tj	dd���}t�
d�|��}|��|��t�|�}~t��|�|��|�r|�t|�d	�|d}	|�t|	jt��|�d
t|	j�k�n|�t|�d�W5QRXdS)Nr��_resource_trackerr�r�r�T)r3�alwaysrOzresource_tracker: process died) � multiprocessing.resource_trackerr�rYr4r�r�r��waitpidr�r�r�r)r@r�rr�r�r�r�r�r�r�r�r�rWrurp�
issubclass�category�UserWarningr9�message)
r>r*Z
should_dier�r�r�Zall_warnr�r�Zthe_warnrrr
�check_resource_tracker_deaths:





�z0TestResourceTracker.check_resource_tracker_deathcCs|�tjd�dSr�)r�r�r,r`rrr
�test_resource_tracker_sigint*sz0TestResourceTracker.test_resource_tracker_sigintcCs|�tjd�dSr�)r�r�r�r`rrr
�test_resource_tracker_sigterm.sz1TestResourceTracker.test_resource_tracker_sigtermcCs|�tjd�dSr�)r�r�r�r`rrr
�test_resource_tracker_sigkill2sz1TestResourceTracker.test_resource_tracker_sigkillcCs<ddlm}|��|jd|fk}||��M}|�|�dS)Nrr�)r�r�r)rYZ_check_aliver�)r#r�r�Zreusedrrr
�_is_resource_tracker_reused6s
z/TestResourceTracker._is_resource_tracker_reusedcCstddlm}|��|j}tjdd�\}}tj|j||fd�}|��|�	�}|�
�|��|��|�|�dS)Nrr�Fr�r�)
r�r�r)rYrr�r~r�r�r�r�rrp)r>r�r�r?rJr�Zis_resource_tracker_reusedrrr
�test_resource_tracker_reused@s�z0TestResourceTracker.test_resource_tracker_reusedN)rGrHrIr�r�r�r�r�r�r�r�rrrr
r��sJ%
	r�c@s eZdZedd��Zdd�ZdS)�TestSimpleQueuecCs8|��z |�|���|�|���W5|��XdSr)r'r�rerWrlrrr
�_test_emptyUs
zTestSimpleQueue._test_emptycCs�t��}t��}t��}tj|j|||fd�}d|_|��|�|���|�	�|�
�|�|���|�|�
�d�|�|�
�d�|�|���|��dS)Nr�TF)r�SimpleQueuer�r~r�rrr�rprWr�r'r�rWr�r�)r>rr_r`rrrr
�
test_empty_s"�zTestSimpleQueue.test_emptyN)rGrHrIr/r�r�rrrr
r�Ss
	r�c@seZdZdd�ZdS)�TestPoolNotLeakOnFailurec	szd�g�G��fdd�d�}|�td��0tjjdtjj|d�d�}|��|�	�W5QRX|�
tdd	��D���dS)
NrScs<eZdZ�fdd�Z�fdd�Zdd�Zdd�Zd	d
�ZdS)zRTestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.FailingForkProcesscs d|_d|_d|_��|�dS)NzFake Process)r!rxr�r�)r>r�)�forked_processesrr
r?�sz[TestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.FailingForkProcess.__init__cs"�dkrtd���d8�d|_dS)Nr�Manually induced OSErrorrOr�)r-r�r`)�will_fail_inrr
r��szXTestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.FailingForkProcess.startcSs
d|_dS)N�stoppingr�r`rrr
r��sz\TestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.FailingForkProcess.terminatecSs|jdkrd|_dS)Nr��stoppedr�r`rrr
r��s
zWTestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.FailingForkProcess.joincSs|jdkp|jdkS)Nr�r�r�r`rrr
rq�sz[TestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.FailingForkProcess.is_aliveN)rGrHrIr?r�r�r�rqr�r�r�rr
�FailingForkProcess�s
r�r�rc)r~)�contextcss|]}|��VqdSrr�)r�rrrr
ri�szITestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.<genexpr>)r�r-rr�r�r8ZmockZ	MagicMockrr�r�r�)r>r�r�rr�r
�test_release_unused_processeszs�
�z6TestPoolNotLeakOnFailure.test_release_unused_processesN)rGrHrIr�rrrr
r�xsr�c@sdeZdZdZejjZdd�Zdd�Z	e
dd��ZeZdd	�Z
d
d�Ze
dd
��Zdd�Ze
dd��ZdHdd�Ze
dd��ZdIdd�Ze
dd��ZdJdd�Zdd�Ze
d d!��Zd"d#�Ze
d$d%��Zd&d'�Ze
d(d)��Zd*d+�Ze
d,d-��ZdKd/d0�Zd1d2�Z e
d3d4��Z!d5d6�Z"e
d7d8��Z#d9d:�Z$e
d;d<��Z%d=d>�Z&e
d?d@��Z'dAdB�Z(e
dCdD��Z)dEdF�Z*dGS)L�TestSyncManagerTypesa}Test all the types which can be shared between a parent and a
    child process by using a manager which acts as an intermediary
    between them.

    In the following unit-tests the base type is created in the parent
    process, the @classmethod represents the worker process and the
    shared object is readable and editable between the two.

    # The child.
    @classmethod
    def _test_list(cls, obj):
        assert obj[0] == 5
        assert obj.append(6)

    # The parent.
    def test_list(self):
        o = self.manager.list()
        o.append(5)
        self.run_worker(self._test_list, o)
        assert o[1] == 6
    cCs|��|_|j��d|_dSr)�
manager_classrLr�rr`rrr
r��s

zTestSyncManagerTypes.setUpcCsB|jdk	r(|j��r(|j��|j��|j��d|_d|_dSr)rrqr�r�rLrr`rrr
r�s


zTestSyncManagerTypes.tearDowncCst��dSr)r�
reap_childrenr�rrr
r��szTestSyncManagerTypes.setUpClasscCsxt|j�t��}d}tt���dkrtt�|�|d9}t��|}|dkrdtj	_
t	�dt���d|�d��qtqdS)	Nr�rOr�r�T�"multiprocessing.Manager still has � active children after � seconds)rrr@rArurr�r�r�r�environment_altered�
print_warning)r>�
start_timerDr�rrr
�wait_proc_exit�s

z#TestSyncManagerTypes.wait_proc_exitcCs@tj||fd�|_d|j_|j��|��|�|jjd�dS)Nr�Tr)rr~rrrr�r�rWrx)r>Zworkerrvrrr
�
run_worker�s

zTestSyncManagerTypes.run_workercCs*|��st�|��|��|�d�dS�Nr�)rrdr'r
�r�rvrrr
r��sz TestSyncManagerTypes._test_eventcCs:|j��}|��|�|j|�|��r,t�|�d�dSr�)rLr�r�r�r�rrdr'�r>r�rrr
r��s

zTestSyncManagerTypes.test_eventcCs|��dSr�r�r�rrr
�
_test_lock�szTestSyncManagerTypes._test_lockr�cCs6t|j|��}|�|j|�|��|�t|j�dSr)r rLr�r�r�r�r��r>Zlnamer�rrr
r��szTestSyncManagerTypes.test_lockcCs|��|��dSr�r�r�r�rrr
�_test_rlock�sz TestSyncManagerTypes._test_rlockcCs t|j|��}|�|j|�dSr)r rLr�r�r�rrr
r�szTestSyncManagerTypes.test_rlockcCs|��dSrr�r�rrr
r�sz$TestSyncManagerTypes._test_semaphorer�cCs(t|j|��}|�|j|�|��dSr)r rLr�r�r�)r>�snamer�rrr
r�
sz#TestSyncManagerTypes.test_semaphorecCs|jdd�dS)Nr�)r�)r�r`rrr
r�sz+TestSyncManagerTypes.test_bounded_semaphorecCs|��|��dSrr�r�rrr
�_test_conditionsz$TestSyncManagerTypes._test_conditioncCs|j��}|�|j|�dSr)rLr�r�r�r�rrr
�test_conditions
z#TestSyncManagerTypes.test_conditioncCs|jdkst�|��dSrb)rrdrr�rrr
�
_test_barriersz"TestSyncManagerTypes._test_barriercCs|j�d�}|�|j|�dSrb)rLr�r�r�r�rrr
r	 sz!TestSyncManagerTypes.test_barrierc	Cs|�W5QRXdSrrr�rrr
�
_test_pool$szTestSyncManagerTypes._test_poolcCs |jjdd�}|�|j|�dS)Nrcr=)rLr�r�r�r�rrr
�	test_pool*szTestSyncManagerTypes.test_poolcCsd|��dkst�|��st�|��r(t�|��dks8t�|��rDt�|��dksTt�|��s`t�dS�Nr�rcr^)rXrdrZrWr�r�rrr
�_test_queue.sz TestSyncManagerTypes._test_queuercCsNt|j|�d�}|�d�|�d�|�|j|�|��s>t�|��rJt�dSr�)r rLrer�r�rWrdrZ)r>Zqnamer�rrr
�
test_queue8s

zTestSyncManagerTypes.test_queuecCs|�d�dS)Nry)r�r`rrr
�test_joinable_queue@sz(TestSyncManagerTypes.test_joinable_queuecCst|ddkst�|�d�dks"t�|�d�dks4t�|��|��|D]}qHt|�dks^t�|�d�dkspt�dS)NrrcrO)rdrr�r��reverserurc)r�rvr.rrr
�
_test_listCszTestSyncManagerTypes._test_listcCs>|j��}|�d�|�|j|�|r*t�|�t|�d�dS)Nrcr)rLr�r�r�r�rdrWrur�rrr
r]Os


zTestSyncManagerTypes.test_listcCs�t|�dkst�|ddks t�|�d�dks2t�t|���dgksHt�t|���dgks^t�t|���dgkstt�|��ddiks�t�|��dks�t�dS)NrOr�rc)r�rc)	rurdr�r�rrlr4r�popitemr�rrr
�
_test_dictVszTestSyncManagerTypes._test_dictcCs<|j��}d|d<|�|j|�|r(t�|�t|�d�dS)Nrcr�r)rLrjr�r�rdrWrur�rrr
rnas

zTestSyncManagerTypes.test_dictcCs,|jdkst�|��dkst�|�d�dS)NrOr�)rXrdr�r�r�rrr
�_test_valuehsz TestSyncManagerTypes._test_valuecCs>|j�dd�}|�|j|�|�|jd�|�|��d�dS)Nr�rOr�)rLrr�rrWrXr�r�rrr
r;nszTestSyncManagerTypes.test_valuecCsH|ddkst�|ddks t�t|�dks0t�t|�ddgksDt�dS)NrrOr�)rdrur�r�rrr
�_test_arraytsz TestSyncManagerTypes._test_arraycCs$|j�dddg�}|�|j|�dS)Nr�rrO)rLrOr�rr�rrr
rR{szTestSyncManagerTypes.test_arraycCs |jdkst�|jdkst�dSr�)r.rdr/r�rrr
�_test_namespacesz$TestSyncManagerTypes._test_namespacecCs(|j��}d|_d|_|�|j|�dSr�)rLr~r.r/r�rr�rrr
r�s
z#TestSyncManagerTypes.test_namespaceN)r�)r�)r�)r)+rGrHrIr�rr�rMr�r�rr/r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r	r�r�r�r�r�r�r]r�rnrr;rrRrrrrrr
r��sd











	






r�c@seZdZdd�ZdS)�MiscTestCasecCstj|ttjddgd�dS)N�SUBDEBUGr )�extraZ	blacklist)rZcheck__all__rrr`rrr
�test__all__�s�zMiscTestCase.test__all__N)rGrHrIrrrrr
r�src@s$eZdZedd��Zedd��ZdS)�	BaseMixincCstjj��tj��f|_dSr)rr�	_danglingrr��danglingr�rrr
r��s
�zBaseMixin.setUpClasscCs�tj��ttjj�t|jd�}|r@dtj_t�	d|���d}tt
j�t|jd�}|rxdtj_t�	d|���d}dS)NrT�Dangling processes: rO�Dangling threads: )r�rr�r�rrrr	r�r�r�)r�rKrMrrr
r��s
zBaseMixin.tearDownClassN)rGrHrIr/r�r�rrrr
r�s
rc@s�eZdZdZejZejZeej�Zeej	�Z	eej
�Z
eej�Zeej�Zeej
�Z
eej�Zeej�Zeej�Zeej�Zeej�Zeej�Zeej�Zeej�Zeej�Zeej�Zeej�Zeej�ZdS)r�rKN)rGrHrIrkrr~rkr�rnr�r�r�r�rryr�r�r�r�r�r�r�rrOr7rNrrrr
r��s*
















r�cs
eZdZdZejZee�d��Z	ee�d��Z
ee�d��Zee�d��Zee�d��Z
ee�d��Zee�d��Zee�d	��Zee�d
��Zee�d��Zee�d��Zee�d
��Zee�d��Zee�d��Zedd��Ze�fdd��Ze�fdd��Z�ZS)�ManagerMixinrLz
manager.Queuezmanager.JoinableQueuezmanager.Lockz
manager.RLockzmanager.Semaphorezmanager.BoundedSemaphorezmanager.Conditionz
manager.Eventzmanager.Barrierz
manager.Valuez
manager.Arrayzmanager.listzmanager.dictzmanager.NamespacecOs|jj||�Sr)rLr�)r�rBrCrrr
r��szManagerMixin.Poolcst���t��|_dSr)r�r�rrKrLr�r�rr
r��s
zManagerMixin.setUpClasscs�t��}d}tt���dkrjt�|�|d9}t��|}|dkrdtj_t�	dt���d|�d��qjqt
��|j�
�d	kr�dtj_t�	d
�t�	|j���|j��|j��d|_t���dS)Nr�rOr�r�Tr�r�r�rz5Shared objects which still exist at manager shutdown:)r@rArurr�r�r�rr�r�r�r�rLZ_number_of_objectsZ_debug_inforr�r�r�)r�r�rDr�r�rr
r��s&



zManagerMixin.tearDownClass)rGrHrIrkrr~r]�operator�
attrgetterrryr�r�r�r�r�r�r�rrOr�rjr~r/r�r�r�r�rrr�r
r�s,
rc@s�eZdZdZejjZejjZeejj	�Z	eejj
�Z
eejj�Zeejj�Zeejj
�Z
eejj�Zeejj�Zeejj�Zeejj�Zeejj�Zeejj�Zeejj�Zeejj�Zeejj�Zeejj�ZdS)�ThreadsMixinrMN)rGrHrIrkr�dummyr~rkr�rnr�r�r�rryr�r�r�r�r�r�r�rrOrrrr
rs$rc
s@|d}t�}dddh}|��D]�\}}t|t�s4q t|t�r�|tkrHq t|j�|ks`t|j��|jD]\}d|�	�|dd�}||�	�d}	Gdd	�d	||	t
j�}
||
_|
_
||
_|
||<qfq t|t
j�r Gd
d	�d	|t�}
||
_|
_
||
_|
||<q ddg�dg����fdd�}��fd
d�}||d<||d<dS)NrGrKrMrLZWithrO�Mixinc@seZdZdS�z*install_tests_in_module_dict.<locals>.TempNr�rrrr
�Temp)src@seZdZdSrr�rrrr
r/scs�t�t�tj��tjj���d<tj���d<tjdd��d<ztj	�dd�Wn"t
k
rvt��d��YnXt
j�d�r�zt��}Wntk
r�t�d��YnXt�t��t���t�dS)	NrrOT)�
allow_noner�z start method not supported�linuxz1OSError raises on RLock creation, see issue 3111!)rr�r�r�_cleanuprrr�r�r�r7r8r9r�r�r�r�r-r:r�get_temp_dirrrr#r>�r	�old_start_method�start_methodrr
�setUpModule8s&

�z1install_tests_in_module_dict.<locals>.setUpModulecs�d}tj��tj�ddd�ttjj�t�d�}|rXd}dtj_t�	d|���d}tt
j�t�d�}|r�d}dtj_t�	d|���d}|r�t�d�tj
��dS)	NFrTr�r
rOrr)r�rr�rr�r�rrr�r�r�r@r�r�_cleanup_tests)Z
need_sleeprKrM)r	rrr
�tearDownModuleNs$

z4install_tests_in_module_dict.<locals>.tearDownModulerr)�globalsrrr�r�rJr�r\rd�
capitalizer8�TestCaserGrIrHr�)
Zremote_globsrrHZlocal_globsZ	ALL_TYPESr!�baseZtype_Znewnamerrrrrrr
�install_tests_in_module_dicts8




r")r()�r8Z
unittest.mockrrfr@rr�r�r4r�r.r�rPr�r�r*r�r�r
r�r�r�Ztest.supportr�Ztest.support.script_helperr�
import_modulerZ*skip_if_broken_multiprocessing_synchronizer�rirZmultiprocessing.dummyZmultiprocessing.heapZmultiprocessing.managersr��multiprocessing.queuesrr�HAVE_SEND_HANDLErg�ImportErrorZmultiprocessing.sharedctypesrrr�rZ	HAS_SHMEMrRrr	rrr!rr#r r#r�rPrhrirjr Z
HAVE_GETVALUEr�r:r'r*r5r]r�Zctypesr.r/r0r1r�r:r;rJr^rarhr~r2r<rYr\r]r�r�r�r�r�r�r�r�r�r(rJrXr�r�r�r�r�r7r�r�r�r�r�r�r�r�r�r�rrrr�registerrrrrrrr"rr+r4r2rhrur{r0r�r�r�r�r�r�r r
rr.r5r;rIrJrSrTrUrVrWr^rerxr|r�r�r�r�r�r�rWr�r�r�r�rrr�rrr"rrrr
�<module>s�





�

,NH6*39FS

	i(C:
04"0R
h8
x+E"!2 "BCH�%)k	=