Your IP : 216.73.216.213


Current Path : /opt/alt/python38/lib64/python3.8/test/__pycache__/
Upload File :
Current File : //opt/alt/python38/lib64/python3.8/test/__pycache__/_test_multiprocessing.cpython-38.pyc

U

i�f���@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�?/opt/alt/python38/lib64/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&)Zhandlerr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�r9c@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>rDr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;rA�resrrr
�assertReturnsIfImplemented�s
z'BaseTestCase.assertReturnsIfImplementedcGstd��dS)Nz#shouldn't try to pickle a test case)rU)r=rArrr
�
__reduce__�szBaseTestCase.__reduce__N)rFrGrH�
ALLOWED_TYPESrTrYrZ�
__reduce_ex__rrrr
rI�s

rIcCspz
|��WStk
rjz|jWYStk
rdz|jWYYStk
r^t�YnXYnXYnXdSr)�	get_valuer5Z_Semaphore__valueZ_valuerU�r=rrr
r]�s
r]c@seZdZdd�ZdS)�
DummyCallablecCst|t�st�|�d�dS�N�)rr_�AssertionError�put)r=�q�crrr
rD�szDummyCallable.__call__N)rFrGrHrDrrrr
r_�sr_c@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�rJrLcCs�|jdkr|�d�|j��|��}|j}|�|���|�|j�|�|t	�|�t
|�dk�|�|jt
���|�|jd�dS)NrL�test not appropriate for {}r)�TYPE�skipTest�format�current_process�authkey�
assertTrue�is_alive�daemon�assertIsInstance�bytes�lenrVZidentr3�getpid�exitcode)r=�currentrmrrr
�test_current�s
z_TestProcess.test_currentcCsz|jdkr|�d�|j��|j|jd�}|�|j|��j�|j|jdd�}|�|j�|j|jdd�}|�	|j�dS)NrLrh��targetT�ryrpF)
rirjrk�Process�_testrVrprlrn�assertFalse)r=Zproc0Zproc1�proc2rrr
�test_daemon_argument�s
z!_TestProcess.test_daemon_argumentcOsR|��}|�|�|�|�|�|j�|jdkrN|�t|j��|�|j�dS)NrL)rlrcr!rirrrm�pid)�clsrdrArBrvrrr
r|s


z_TestProcess._testcCs�|jdkr|�d�|j��|�|���|jdd�\}}|j|j|fd�}|��|�	�|�
�\}}|�||��j
�|�|t���|�||��j�dS)NrLrhF�Zduplex�ryrA)rirjrk�assertIsNone�parent_process�Piper{�_test_send_parent_process�start�join�recvrVrlr�r3rtr!)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)NrLrhFr�r��<rz(Could not communicate with child process�alive�	not alive)
rirjrkr�r{�_test_create_grandchild_processr��pollrbr�rV�	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�rar)r�r�r�ror�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)NrN��gR���Q@)�helloZbyeZSomeProcess)ryrA�kwargsr!TrLFr)r�Eventr{r|rprlrirVrmro�assertNotIn�active_childrenrn�type�listrur��assertIn�getr!r�r�r)r=rd�erAr�r!r�rvrrr
�test_processJsF


�
z_TestProcess.test_processzneeds native_idcCsr|jdkr|�d�|j��t��j}|�d�}|j|j|fd�}|�	�|�
�}|��t|�|�
||�dS)NrLrhrNr�)rirjrk�	threading�main_thread�	native_idrr{�"_test_process_mainthread_native_idr�r�r�r�assertNotEqual)r=Zcurrent_mainthread_native_idrdr�Zchild_mainthread_native_idrrr
�!test_process_mainthread_native_idrs


z._TestProcess.test_process_mainthread_native_idcCst��j}|�|�dSr)r�r�r�rc)r�rdZmainthread_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)NrLrhrxTrr(r2rN�alarmcstd���dS)Nzjoin took too long: %s��RuntimeError�rA�r�rr
�handler�sz+_TestProcess._kill_process.<locals>.handler�
F)rirjrkr{r�rpr�rVror�r�rur:r�rTr<r?r��hasattr�signal�SIGALRMr�r�)r=Zmethr�r�Zold_handlerrr�r
�
_kill_process�s>




z_TestProcess._kill_processcCs,|�tjj�}tjdkr(|�|tj�dS�N�nt)	r�rr{r�r3r!rVr��SIGTERM�r=rurrr
�test_terminate�s
z_TestProcess.test_terminatecCs,|�tjj�}tjdkr(|�|tj�dSr�)	r�rr{�killr3r!rVr��SIGKILLr�rrr
�	test_kill�s
z_TestProcess.test_killcCsJzt��}Wntk
r$d}YnX|�t|�tk�|�|dk�dSrM)r�	cpu_countrUrnr��int)r=Zcpusrrr
�test_cpu_count�s
z_TestProcess.test_cpu_countcCsp|�t|���t�|jtjtfd�}|�||���d|_	|�
�|�||���|��|�||���dS�Nr�T)
rVr�r�r�r{r?r��DELTAr�rpr�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�rs�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�rrN)	r�r�r?r�r�r��appendr�rV)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)NrLrhr�r(rrN)rirjrkr�r{r��assertRaisesr6�sentinelr��
addCleanupr�rqr�r}r)�setrn)r=r�r�r�rrr
�
test_sentinels
z_TestProcess.test_sentinelrNcCs|dk	r|��t�|�dSr)r��sys�exit)r��rcrdr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)NrLrhrd)ryr�TFr)rirjrkrr{r�rpr�rVror�r6rrcr�rur��weakref�ref�gc�collect�assertIsr)r=rdr��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)
NrLrh�spawnrar�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)rx)r{r�r�r^rr
r�Ls����MbP?r��darwin)rirjrkr�get_start_methodr�r�rrVrur?r�r�r3r!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�ra)r_r�r�rr{r�r�r�rVr�r)r=rer�rdr�rrr
�test_lose_target_ref^s
z!_TestProcess.test_lose_target_refcCs|�tj���|��dSr)rc�testrZfd_countr')r=�evtrdr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)	NrLrh�forkracs g|]}�j�j��fd��qS�r�)r{r�r��r�rdr=rr
r�s�z8_TestProcess.test_child_fd_inflation.<locals>.<listcomp>csg|]}����qSr�r�r��rdrr
r��srN)rirjrkrr�r�rr�r�r�r�rrVrs)r=r�r�r�r�Z	fd_countsrr�r
�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�r�rr
�func1�s
z2_TestProcess._test_wait_for_threads.<locals>.func1cst�d����dS)N�)r?r��clearrrrr
�func2�s
z2_TestProcess._test_wait_for_threads.<locals>.func2rxTrz)r��Threadr�)r=r�rr	rrr
�_test_wait_for_threads�sz#_TestProcess._test_wait_for_threadscCsX|jdkr|�d�|j��|��}|j|j|fd�}|��|��|�|�	��dS)NrLrhr�)
rirjrkr�r{rr�r�rn�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�StringIOrrb�setattrr�r�)r=r�Zbreak_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�rnrrVru)r=Zstreamsrr�
old_streamr�r
r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)rr�rr�r{rr�r�rnrrVru)r=rrrr�r
rrr
�test_error_on_stdio_flush_2�s

�z(_TestProcess.test_error_on_stdio_flush_2r(cCst�|�|��dSrr)r=r�r�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)
NrLrh�
forkserverr)�_forkserverrr��@)r�)rirjrkrr�Zmultiprocessing.forkserverr!�ensure_runningr�r{rr�Z_forkserver_pidr3r�r?r�r�rnrrVrur�)
r=�signumr�r!r�r�r
r�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�)r3r!r&r�r�r^rrr
�test_forkserver_sigkills
z$_TestProcess.test_forkserver_sigkill)rN)r().rFrGrHr[rwr�classmethodr|r�r�r�r�r�r�r7�
skipUnlessr�Z_HAVE_THREAD_NATIVE_IDr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrrrr&r(r)rrrr
rf�sj
	


(



3



 #

&rfc@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)r.r�iterr-r�r��upper�r=rrrr
�runs
z_UpperCaser.runcCs&t|�tkst�|j�|�|j��Sr)r��strrbr.r�r�r1rrr
�submitsz_UpperCaser.submitcCs$|j�d�|j��|j��dSr)r.r�rr-r^rrr
�stop!s
z_UpperCaser.stopN)rFrGrHr>r2r4r5rrrr
r,sr,c@s@eZdZdZdd�Zdd�Zedd��Zedd	��Zd
d�Z	dS)
�_TestSubclassingProcess�rJcCsLt�}d|_|��|�|�d�d�|�|�d�d�|��|��dS)NTr�ZHELLOZworldZWORLD)r,rpr�rVr4r5r�)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)NrLrhr��r�ZeroDivisionErrorztest_multiprocessing.pyz1/0 # MARKER)rirjrkr�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��closefdrNr)r3r>�O_WRONLY�O_CREAT�O_EXCLr�r)r�r@�fdrrr
r=Dsz*_TestSubclassingProcess._test_stderr_flushcCs8t�|tjtjBtjB�}t|ddd�t_t�|�dS)NrDFrE)r3r>rGrHrIr�rr�)r��reasonr@rJr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)NrLrhrNr��zignore thisr�Tr9)TF�)rirjrkr�rr;r�r<r{rLrpr�rrVrur>r?�rstripr3r3r�r�)r=r@rKr�rAZcontentrrr
�
test_sys_exitQs,
�z%_TestSubclassingProcess.test_sys_exitN)
rFrGrHr[r8rCr*r=rLrPrrrr
r6&s	

r6cCs"t|d�r|��S|��dkSdS)N�emptyr)r�rQ�qsizerrrr
�queue_emptyts
rScCs"t|d�r|��S|��|kSdS)N�full)r�rTrR)rd�maxsizerrr
�
queue_fullzs
rVc@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)NrX�rUr�TFrNr�rM�ra�rr)rr�r{r[rpr�rVrSrVrc�
put_nowaitr?r�r�r:r��pyqueueZFullrTr<�TIMEOUT1�TIMEOUT2�TIMEOUT3r�r'r�r)r=ZMAXSIZErrYrZr
rcr_rrr
�test_put�sR�




z_TestQueue.test_putcCs<|��|�d�|�d�|�d�|�d�|��dS)Nr�rMr]ra)r'rcr��r�rrYrZr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�rMrNrr]rar)rr�r{rfrpr�rVrSr�r'r?r�r�r��
get_nowaitr:r�r`�EmptyrTr<rarbrcr�r)r=rrYrZr
r�rgrrr
�test_get�sF�


z_TestQueue.test_getcCstdd�D]}|�|�q
dS)Nr�r)r�rc)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�TrF)rr�rcr?r�r�r{rjrpr�rVr�r�r`rhr�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 implementedrNrar�)rrVrRrUrjrcr�r�r=rdrrr
�
test_qsize)s

z_TestQueue.test_qsizecCs(t|jd�D]}t�t�|��qdSr)r/r�r?r�r�Z	task_done)r�rd�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{ror��rr=rr
r�Bs�z-_TestQueue.test_task_done.<locals>.<listcomp>r]Tr�)�
JoinableQueuer�rpr�rcr�r)r=Zworkersr�r�rrpr
�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.pyrDz�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_cwdr>�writeZ
DirsOnSysPathr3�getcwd�
__import__r`rh�fail)r=Zmodule_namerArrr
�test_no_import_lock_contentionUs
z)_TestQueue.test_no_import_lock_contentioncCsHt��}t��}|�tj|jdd�t��|}|�|d�t	|�dS)NTg�������?r$)
rrr?r@r�r`rhr��assertGreaterEqualr)r=rdr��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)
NrJrhc@seZdZdd�ZdS)zF_TestQueue.test_queue_feeder_donot_stop_onexc.<locals>.NotSerializablecSst�dSr)r5r^rrr
rZ{szQ_TestQueue.test_queue_feeder_donot_stop_onexc.<locals>.NotSerializable.__reduce__N�rFrGrHrZrrrr
�NotSerializablezsr|TrrNr\��?)rirjrk�objectr�r�captured_stderrrrcrnr�rrrVrRrUrQ)r=r|rdr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)NrJrhc@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�r5r^rrr
rZ�szV_TestQueue.test_queue_feeder_on_queue_feeder_error.<locals>.NotSerializable.__reduce__N)rFrGrH�__doc__r>rZr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�)rr5r�)r�rn�r|rr
�_on_queue_feeder_error�s
�z\_TestQueue.test_queue_feeder_on_queue_feeder_error.<locals>.SafeQueue._on_queue_feeder_errorN)rFrGrHr��staticmethodr�rr�rr
�	SafeQueue�sr�)�ctxTr}r)rirjrkr~rrrr�rr�get_contextrcrnr�r�r�)r=r�Znot_serializable_objrdr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)rrrqr�assertRaisesRegexr6rcr�rlrrr
�$test_closed_queue_put_get_exceptions�sz/_TestQueue.test_closed_queue_put_get_exceptionsN)rFrGrHr*r[rdrfrirjrkrmrorrrwrzr�r�r�rrrr
rW�s$
;
	5

!&rWc@s$eZdZdd�Zdd�Zdd�ZdS)�	_TestLockcCsR|��}|�|��d�|�|�d�d�|�|��d�|�ttjf|j�dS)NTF)�LockrV�acquire�releaser�r6r�ZThreadError�r=�lockrrr
�	test_lock�s
z_TestLock.test_lockcCs~|��}|�|��d�|�|��d�|�|��d�|�|��d�|�|��d�|�|��d�|�ttf|j�dSr�)�RLockrVr�r�r�rbr�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)rFrGrHr�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�TrNrF)rYr]rVr�r��r=�semrrr
�_test_semaphore�sz_TestSemaphore._test_semaphorecCsT|�d�}|�|�|�|��d�|�dt|�|�|��d�|�dt|�dS)Nr�rMr])�	Semaphorer�rVr�rYr]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)NrJrhrFr(Tr)rirjrkr�r:r�rVrTr<rarbrc)r=r�r�rrr
rz�s


z_TestSemaphore.test_timeoutN)rFrGrHr�r�r�rzr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
rAs

z_TestCondition.fc	Csbtd�D]>}z|�|krWqHWntk
r:YqHYnXt�t�qt�t�|�||�dS�Nr�)r�rUr?r�r�rY)r=r;rWr�rrr
�assertReachesEventuallys


z&_TestCondition.assertReachesEventuallycCsZ|jdkrVz6|j��|j��}|�|d�|�|j��d�Wntk
rTYnXdS)NrJr)riZ_sleeping_countr]Z_woken_countrVZ_wait_semaphorerU)r=r�Zsleepersr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�TrNr�)�	Conditionr�r{rArpr�r�r�r�r
r�r?r�r�rYr]�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)NrrMr�TrXcst��Sr�r]r�r�rr
�<lambda>��z0_TestCondition.test_notify_all.<locals>.<lambda>)r�r�r�r{rArarpr�r�r�r�r
r�rYr]r�r?r�r�Z
notify_allr�r��r=r�r�r�r�rCr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)NrrMr�TrXr�)�ncst��Srr�rr�rr
r��r�z._TestCondition.test_notify_n.<locals>.<lambda>r]cst��Srr�rr�rr
r��r�)r�r�r�r{rArpr�r�r�r�r
r�r?r�r�rYr]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�rar�rVrTr<)r=r�r'rXrrr
rz�s
z_TestCondition.test_timeoutc	sL|�>d�_|��|��fdd��}|r4�jdkr>t�d�W5QRXdS)Nrcs
�jdkS�Nr]�rWr��staterr
r��r�z0_TestCondition._test_waitfor_f.<locals>.<lambda>r]rN)rWr��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�r2r�Tcs
�jdkS�Nrr�rr�rr
r��r�z-_TestCondition.test_waitfor.<locals>.<lambda>rr]r�rN)r�rr{r�rpr�r�rnrVrWr�r?r�r�rru)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?r@r�rW)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�TrrMr�rN)r�rr�r{r�rpr�rnr�rr�r?r�rWr�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�dSrM)r�r?r�r3r�r�r')r�rer�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�r3rtr�r}r'r{r�r�rnr��KeyboardInterruptr�)r=r�rer�rrr
�test_wait_result(s
z_TestCondition.test_wait_result)N)rFrGrHr*rAr�r�r�r�r�rzr�r7r+�HAS_SHAREDCTYPESr�r�r�r�r�rrrr
r�s&->2	






r�c@s eZdZedd��Zdd�ZdS)�
_TestEventcCst�t�|��dSr)r?r�rbr�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'rVrrTr<rar�rr{r�rpr�r�)r=r�r'r�rrr
�
test_eventDs&
z_TestEvent.test_eventN)rFrGrHr*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�structZcalcsizer��__setstate__�
_lengthbuf)r=�wrapperr�rrr
r>rsz_DummyList.__init__cCs"|\|_|_|j���d�|_dS)Nr�)�_wrapper�_lockZcreate_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�NrrN�r�r�)r=�_rrr
r�sz_DummyList.appendc
Cs(|j�|jdW5QR�SQRXdSr�r�r^rrr
�__len__�sz_DummyList.__len__N)rFrGrHr>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.
        rxTcSs|D]}|��qdSr)r�)rLr�rrr
�finalize�sz Bunch.__init__.<locals>.finalizeN)rArAr��	DummyList�started�finishedr��	_can_exitr�r�r{�taskrpr�r�r�r��
_finalizer)
r=�	namespacerArAr�Zwait_before_exitrLr�r�r�rrr
r>�s 



zBunch.__init__c	CsRt��}|j�|�z|j	|j
�W5|j�|�|j�d�|j��sLt�XdS)N�)r3rtr�r�r�r�r'rrbrArA�r=r�rrr
r��sz
Bunch.taskcCst|j�|jkrt�qdSr)rsr�r�r�r^rrr
�wait_for_started�szBunch.wait_for_startedcCst|j�|jkrt�qdSr)rsr�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)
rFrGrHr�r>r�r�r�r�rrrrr
r��s

r�c@seZdZdd�Zdd�ZdS)�
AppendTruecCs
||_dSr)rn)r=rnrrr
r>�szAppendTrue.__init__cCs|j�d�dSr�)rnr�r^rrr
rD�szAppendTrue.__call__NrEr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.
    rag>@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)NrLrK)rirKr�r�r^rrr
r��s



z_TestBarrier.DummyListcCs8t||||jd�}z||�|��W5|��XdSrM)r�r�rr�)r=rArArSr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)NrTrN)
�partiesr�rbr�r�rsr'�	n_waitingrU�broken)r�r��resultsr��mr�rrr
�	multipass�s
z_TestBarrier.multipassrNcCs*|��|��g}|�|j|j||f�dS)z;
        Test that a barrier is passed in lockstep
        N)r�r�r�r�)r=�passesr�r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'rc)r�r�rrXr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>rrNN)	rr�r�r�r�r�rV�countr�r=r�rrr
�test_wait_return
s
z_TestBarrier.test_wait_returncCs|��t|�dkrt�dSrM)r'rsr�)r�r�r�rrr
�_test_action_fsz_TestBarrier._test_action_fcCsB|��}|j|jt|�d�}|�|j||f�|�t|�d�dS)z,
        Test the 'action' callback
        )rrNN)r�r�r�r�r�r�rVrs)r=r�r�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
        rrNN)	r�r�rr�rVrsr�rnr�)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�rNr�T)	r'r�r�r?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
        rrNN)r�r�rr�rVrsr�)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.
        rrNN)r�r�r�r�r
r�rVrs)r=rrrr	r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�r�r�rrr
�_test_timeout_f�s
z_TestBarrier._test_timeout_fcCs4|��}|�|j|j|f�|�t|�|jj�dS)z$
        Test wait(timeout)
        N)r�r�r
r�rVrsr�r�rrr
rz�sz_TestBarrier.test_timeoutcCsV|�|j�}||jdkr$t�d�z|��Wn tjk
rP|�d�YnXdS)Nr�r}T)r'r�r�r?r�r�rr�rr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�r�rrVrsr�)r=r�r�rrr
�test_default_timeout�sz!_TestBarrier.test_default_timeoutcCs|�d�}|��|��dSrM)r�r')r=rSr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)NrKrh��Fr�)rirjrkr�r�r�r�r{rr�r�r�r�rVr�)r=r�r�rr-�jr�r�rrr
�
test_thousand�s
�z_TestBarrier.test_thousandN)rN)rFrGrHr�r�r�r�r�r�r�r*r�r�r�r�r�r�r�rrrrr
rr
rzrrrrrrrrr
r��sH




	







	
r�c@sZeZdZdZddddded�ed�fgZd	d
�Zedd��Zddd�Z	dd�Z
dd�ZdS)�
_TestValuer7)r�i�i�^)�dg
@g�)�hi�����)rd��re�x�ycCsts|�d�dS�Nz%requires multiprocessing.sharedctypes�r�rjr^rrr
r��sz_TestValue.setUpcCs$t||j�D]\}}|d|_qdSr�)�zip�codes_valuesrW)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��coderWr�r^rr
r��s�z)_TestValue.test_value.<locals>.<listcomp>csg|]\}}}��||��qSr)rr&r^rr
r��s�rNr�Tr�)	r!r rVrWr{r|rpr�r�)r=�rawr"r#r$r
r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�ra�r�F�get_lock�get_objZnavalue)
rr-r.r�rVr}r�r�r5r%)
r=Zval1�lock1�obj1Zval2�lock2�obj2r�Zval3�lock3�obj3�arr4�arr5rrr
�test_getobj_getlock�s$z_TestValue.test_getobj_getlockN)F)rFrGrHr[r	r!r�r*r|r)r+r7rrrr
r�s�

rc@s~eZdZdZedd��Ze�edkd�ddd��Z	e�edkd�d	d
��Z
e�edkd�dd��Ze�edkd�d
d��ZdS)�
_TestArrayr7cCs0tdt|��D]}||||d7<qdSrM)r�rs)r��seqr�rrr
rAsz_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�rMr�r^rNr]rNr�T)�RawArray�ArrayrVrsr��arrayrAr{rpr�r�)r=r(r9�arrr�rrr
�
test_arrays$(
z_TestArray.test_arraycCsrd}td�D]`}|�d|�}|�t|�|�|�t|�dg|�td�|dd�<|�t|�ttd���~qdS)Nr�rMr�r)r�r=rVrsr�)r=�sizer�r?rrr
�test_array_from_size2sz_TestArray.test_array_from_sizecCs|jdd�dSr*)r@r^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)r=r�r�r-r.r�rVr}r�r�r5r<)
r=Zarr1r/r0Zarr2r1r2r�Zarr3r3r4r5r6rrr
�test_getobj_getlock_objEs.�z"_TestArray.test_getobj_getlock_obj)F)
rFrGrHr[r*rAr7�skipIfr.r@rBrCrDrrrr
r8s


r8c@sHeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dS)�_TestContainers�rKcCs�|�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�rar�rMr]rrNrXcSsg|]}|dd��qSrr)r�Zelementrrr
r�~sz-_TestContainers.test_list.<locals>.<listcomp>r^rN�	r�)r�r�rV�extendr�)r=rRrSrr�rAr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�r/rV�next)r=rR�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)rM)r�r�)r�Z_ir^rr
r��sz;_TestContainers.test_list_proxy_in_list.<locals>.<listcomp>rMcSsg|]}|dd��qSrr)r��innerrrr
r��srrNr��7r2)r�r�rV�poprsr�)r=rRr�rSr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rTr�rrr
r��sz-_TestContainers.test_dict.<locals>.<listcomp>cSsg|]}|t|�f�qSrrTr�rrr
r��s)
�dictr�r�rUrVr�sorted�keysr"r)r=r�indicesr�rrr
�	test_dict�sz_TestContainers.test_dictcCsv|��}ttdd��}|D]}t|�||<qt|�}|�t|�|�|�t|�g�t|�}|��|�tt	|�dS)NrRrS)
rWr�r�rUr/rVrr�r�rK)r=rrZr�rLr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�r])�ferrets�hamstersr�rM)�water�feed)�pets�suppliesr_rbraZblanketsr^rar]�rr^rNZmarmots�X�cr2r`)rWrVrrsr�rq)r=rarbr�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)rhrizNamespace(name='Bob')r!�job)�	Namespacer!rjZ_hiddenrVr3rnr�)r=r�rrr
�test_namespace�sz_TestContainers.test_namespaceN)rFrGrHr[rJrMrQr[r\rgrlrrrr
rFcs


.rFr(cCst�|�||Srr�)rr'rrr
�sqr�s
rmcCs||Srr)rrrrr
�mul�srncCst�|�tdd��dS)Nri)r?r�r6r&rrr
�raise_large_valuerror�s
rocCs|Srr�rrrr
�identity	srqc@s eZdZdZdd�Zdd�ZdS)�
CountedObjectrcCs|jd7_t�|�SrM)�n_instancesr~�__new__r�rrr
rt		szCountedObject.__new__cCst|�jd8_dSrM)r�rsr^rrr
�__del__
	szCountedObject.__del__N)rFrGrHrsrtrurrrr
rr	srrc@seZdZdS)�SayWhenErrorN�rFrGrHrrrr
rv	srvccs8|dkrtd��t|�D]}||kr,td��|VqdS)Nr2zSomebody said when)rvr�)ZtotalZwhenr�rrr
�exception_throwing_generator	srxcseZdZe�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�rz�
tearDownClassr�r~rr
r�"	s

z_TestPool.tearDownClasscCs@|jj}|�|td�td��|�|tdddi�tdd��dS)N)rararrrMrp)r}�applyrVrm)r=Zpapplyrrr
�
test_apply)	sz_TestPool.test_applyc	Csh|jj}|�|tttd���tttttd�����|�|tttd��dd�tttttd�����dS)Nr�r�r�Z	chunksize)r}�maprVrmr�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�rHr2r�rerr�)r}�starmapr�r r�rVrn�	itertools)r=Zpsmap�tuplesrrr
�test_starmap4	s��z_TestPool.test_starmapcCsDtttd�tddd���}|�|j�t|���tt�	t|���dS)Nr�rer2)
r�r r�rVr}Z
starmap_asyncrnr�r�r�)r=r�rrr
�test_starmap_async=	s�z_TestPool.test_starmap_asyncc	Cs8|�|j�tttd�����tttttd�����dSr�)rVr}�	map_asyncrmr�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)NrK�1)�callback�error_callbackrNrrRr�)rirKr�r}r�r�r�r'rVrsrqr6)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)NrLrhc@seZdZdd�ZdS)z*_TestPool.test_map_unplicklable.<locals>.AcSstd��dS)Nz
cannot pickler�r^rrr
rZX	sz5_TestPool.test_map_unplicklable.<locals>.A.__reduce__Nr{rrrr
�AW	sr�r�)	rirjrkr~r�r�r}r�rm)r=r�rrr
�test_map_unplicklableS	s

z_TestPool.test_map_unplicklablecCsDz|jjtgdd�jtd�Wn tjk
r>|�d�YnXdS)NrNr�rz2pool.map_async with chunksize stalled on null list)r}r�rmr�rar�TimeoutErrorrvr^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)	NrKrhrNr2r�rMc@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)rvr^rrr
�__next__t	szN_TestPool.test_map_handle_iterable_exception.<locals>.SpecialIterable.__next__cSsdSrMrr^rrr
r�v	szM_TestPool.test_map_handle_iterable_exception.<locals>.SpecialIterable.__len__N)rFrGrHr�r�r�rrrr
�SpecialIterableq	sr�)	rirjrkr�rvr}r�rmrx)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)Nr^�1)	r}�apply_asyncrmrar:r�rVrTr<�r=rXr�rrr
�
test_async}	s
z_TestPool.test_asynccCsD|j�tdtdf�}t|j�}|jtj|td�|�	|j
t�dS)NrXr}r)r}r�rmrbr:r�r�rr�rTr<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�rr�r�)r}�imaprmr�r�rVr�rKr��
StopIterationr��r=rLr�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)NrKrhrNr2r�rMrr^r�rXr])
rirjrkr}r�rmrxr�rvr�r�rVrKr�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_unorderedrmr�r�rVrXr�)r=rLr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)
NrKrhrNr2r�rMrr^r�)rirjrkr}r�rmrxr�rvr�r�r�r�rKr�r)r=rLZexpected_valuesr�rWr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)NrKr2rrM)
ri�RemoteErrorr6r�r|rr�rVrs�_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'rNr�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�|�	�|�
�dSrM)r|rVr�rmr�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)NrJr�cSsg|]}t|��qSr)rmr�rrr
r�
sz*_TestPool.test_context.<locals>.<listcomp>r�)rir�r�r|r�rmrVr�r�r�r6)r=�Lr�r�r9r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)NrJrNzexpected RuntimeError)r�z&raise RuntimeError(123) # some commentr2zexpected SayWhenError)rir|r�r��	Exceptionrvr�r�r�r�rVrA�	__cause__rr}ZRemoteTracebackr��tbr�rrr��
excepthook�exc_info�getvaluer�rmrxrv)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|��dSrM)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�rrrNg�������?)r?r@r�r6r|r�rr�r�ro�
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)rrr�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
rV]
sz3_TestPool.test_release_task_refs.<locals>.<genexpr>r)r�r}r�rqr?r�r�rVr�rrrs)r=ZobjsZrefsrrr
�test_release_task_refsT
s
z _TestPool.test_release_task_refsc
Cs`|jdkr|�d�|�d�}|�W5QRX|�t��|�W5QRXW5QRX|��dS)NrK�test not applicable to managerrN)rirjr|r�r6r��r=r}rrr
�
test_enterb
s



z_TestPool.test_enterc	Csb|jdkr|�d�|�d�}|��|��tjj|_t	�
dtf��d}t	��W5QRXdS)NrKr�rNz%unclosed running multiprocessing pool)
rirjr|r�r�rr}ZRUNZ_staterZcheck_warnings�ResourceWarning�
gc_collectr�rrr
�test_resource_warningr
s



�z_TestPool.test_resource_warning)"rFrGrHr*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
ry	sB	

$


&
rycCs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)�_TestPoolWorkerErrorsr7csjt�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�rnrqrr�)r=r�r�rXr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�rcs|�d<dSr�rr�r�rr
r��
sz?_TestPoolWorkerErrors.test_unpickleable_result.<locals>.errbackr�)�multiprocessing.poolr�rr|r�r�r�r�r�rnrqZassertIsNotNoner�rWrr�)r=r�r�Z	iterationr�rX�wrappedrr�r
�test_unpickleable_result�
s

z._TestPoolWorkerErrors.test_unpickleable_resultN)rFrGrHr[r�r�rrrr
r��
sr�c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�_TestPoolWorkerLifetimer7c	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)NrMr��ZmaxtasksperchildcSsg|]
}|j�qSr�r��r�rDrrr
r��
szE_TestPoolWorkerLifetime.test_pool_worker_lifetime.<locals>.<listcomp>r��2css|]}|��VqdSr�ror�rrr
rV�
szD_TestPoolWorkerLifetime.test_pool_worker_lifetime.<locals>.<genexpr>rNcSsg|]
}|j�qSrr�r�rrr
r��
s)rr|rVrsr�r�r�r�rm�	enumerater�Z_repopulate_pool�allr?r�r�r�r�rXrr�)	r=r�Zorigworkerpidsr�r�rrXZ	countdownZfinalworkerpidsrrr
�test_pool_worker_lifetime�
s&z1_TestPoolWorkerLifetime.test_pool_worker_lifetimecCsptjddd�}g}td�D]}|�|�t|df��q|��|��t|�D]\}}|�	|�
�t|��qNdS)NrMrNr�rXg333333�?)rr|r�r�r�rmrr�r�rVr�)r=r�r�r�rrXr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_okrV�r=�cmdr��outrBrrr
�>test_worker_finalization_via_atexit_handler_of_multiprocessing�
s
zV_TestPoolWorkerLifetime.test_worker_finalization_via_atexit_handler_of_multiprocessingN)rFrGrHr[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
rA�
szFooBar.fcCst�dSr)r6r^rrr
�g�
szFooBar.gcCsdS)N�_h()rr^rrr
�_h�
sz	FooBar._hN)rFrGrHrAr�r�rrrr
r��
sr�ccstd�D]}||VqdSr�)r�)r�rrr
�baz�
sr�c@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)rFrGrHZ	_exposed_r�r�rrrr
r�sr�c@seZdZdS)�	MyManagerNrwrrrr
r�sr��Foo)�callable�Bar)rAr�)r�Zexposed)r�Z	proxytypec@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�_TestMyManagerrGcCs<t�}|��|�|�|��|�|jjdtjf�dSr�)	r�r��common�shutdownr��_processrur�r��r=rKrrr
�test_mymanagers

z_TestMyManager.test_mymanagerc	Cs8t��}|�|�W5QRX|�|jjdtjf�dSr�)r�r�r�r�rur�r�r�rrr
�test_mymanager_contextsz%_TestMyManager.test_mymanager_contextc	Cs<t�}|��|�|�|�W5QRX|�|jjd�dSr�)r�r�r�rVr�rur�r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>)rAr�r�csg|]}t�|�r|�qSrr�r�)�barrr
r�4s
rAr�r�r�r�cSsg|]}||�qSrrr�rrr
r�Csr�)
r�r�r�rVrAr�r6r�r�r�r�r�r�)r=rKr�Zfoo_methodsZbar_methodsr)r�r�r
r�.s z_TestMyManager.commonN)rFrGrHr[r�r�r�r�rrrr
r�s
r�cCstSr)�_queuerrrr
�	get_queueKsrc@seZdZdZdS)�QueueManagerz$manager class used by server processN�rFrGrHr�rrrr
rNsrc@seZdZdZdS)�
QueueManager2z@manager class which specifies the same interface as QueueManagerNrrrrr
rRsrZ	xmlrpclibc@sBeZdZdZdddddddgZedd�Zed	d
��Zdd�ZdS)
�_TestRemoteManagerrG�hello worldNT�@uhallå världenuпривіт світs
hall� v�rldencCs2t||td�}|��|��}|�t|j��dS)N��addressrmZ
serializer)r�
SERIALIZER�connectrrc�tupler"�r�r	rmrKrrrr
�_puttercs�z_TestRemoteManager._puttercCs�t�d�}ttjjdf|td�}|��|�|j	�|j
|j|j|fd�}d|_
|��t|j|td�}|��|��}|�|��|j�|�t|jtj�~dS)N� rrr�T)r3�urandomrr�r�HOSTr
r�r�r�r{rr	rprrrrVr�r�r�r�rcr?r�)r=rmrKr�Zmanager2rrrr
�test_remotems*

��z_TestRemoteManager.test_remote)	rFrGrHr[r"r�r*rrrrrr
rYs�
	rc@s eZdZedd��Zdd�ZdS)�_TestManagerRestartcCs,t||td�}|��|��}|�d�dS)Nrr)rr
rrrcr
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)Nrrrr�r�rr})r3rrr�rrr
r�r�Z
get_serverr	�listenerrr�r{rr�rrVr�r��OSError�errnoZ
EADDRINUSEr?r�)r=rmrKZsrvr�addrr�rr�rrr
�test_rapid_restart�sL

�


�
�z&_TestManagerRestart.test_rapid_restartN)rFrGrHr*rrr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)%�_TestConnectionrgcCs(t|jt�D]}|�|�q|��dSr)r/�
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�TrNrrr�r�r]rJrrMr^z(                                        zexpected BufferTooShort, got %sFr2r$�Xi)(r�r{rrpr�r	r>r�r�rirVr��filenor�r�r�rrrsZrecv_bytes_into�itemsize�	bytearrayrZBufferTooShortrArvr:r�rTr<rar?r�rr�readable�writabler��EOFErrorr�)r=rr-r�r9rZlongmsgr?�bufferr�rXr�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�rNrJTr�)
r�rVr�r�rir$r%r�rr�)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{rrpr�rr	rrVrrr�)r=rr-r�rr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)NrJrhZabcdefghijklmnopqrstuvwxyzrar^rN��rr��rNr2r])
rirjrkr	r�rrVrr�r6)r=rrRrSrrr
�test_sendbytes:s&

z_TestConnection.test_sendbytesc
CsRzt�|�Wn:tk
rH}z|jtjkr6WY�
dS�W5d}~XYnXdSdS)NFT)r3�fstatrr�EBADF)r�rJr�rrr
�_is_fd_assignedZs
z_TestConnection._is_fd_assignedFcCsd|r.tdd�D]}|�|�st�|��|�qt�|�}trJt�|tj	�}t�
||�t�|�dS)Nrr+)r�r4r3�dup2r!r�recv_handle�msvcrtZopen_osfhandlerGrsr)r�r�dataZcreate_dummy_fdsr�rJr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)	NrJ�only makes sense with processesTr�sfoor��wb�rb)rirjr�r{r9rpr�r�r�rr<r;r>r!r7Z
get_osfhandler�send_handler�r�rVr?)r=rr-r�rArJr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 smallr5ztest 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)NrJr;Tr�sbarr�r<r+z2could not find an unassigned large file descriptorr=)rirjr�r{r9rpr�r�r�rr<r;r>r!r��MAXFDr4rvr3r5rrr>r�r�rVr?)r=rr-r�rArJZnewfdrrr
�test_large_fd_transfer�s(	



z&_TestConnection.test_large_fd_transfercCst�|��d�dS)N�)r3rsr!�r=rr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)NrJr;Tr�r�)rirjr�r{rErpr�r�r�rr6r��r=rr-r�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�rJ)
r�r�rVr�rir}�closedrnr�rrQrrr
r��s

 
z_TestConnection.test_contextN)F)rFrGrHr[r*rr(r+r,r1r4r9r7r+�
HAS_REDUCTIONr?rEr�r�rAr�r3rBrErGr�rrrr
r�s<
O
 




�
��


rc@s6eZdZdZdd�Zdd�Ze�ej	d�dd��Z
d	S)
�
_TestListenerr7cCsB|jjD]4}|jj|d�}|�|j�|�t|jj|j|�qdS)N��family)�
connection�families�Listenerr�rr�rr	)r=rNrfrrr
�test_multiple_bind�s�z _TestListener.test_multiple_bindcCsz|j���N}|j�|j��4}|��� }|�d�|�|��d�W5QRXW5QRXW5QRX|jdkrv|�	t
|j�dSrH�rOrQ�Clientr	�acceptr�rVr�rir�r)r=rfrerr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
somethingrIrJrS)r=r�clientrrrr
�test_abstract_socket�s

.
z"_TestListener.test_abstract_socketN)rFrGrHr[rRr�r7r+rZabstract_sockets_supportedrWrrrr
rL�s
�rLc@s4eZdZdZedd��Zdd�Zdd�Zdd	�Zd
S)�_TestListenerClientrgcCs"|j�|�}|�d�|��dS)Nr�)rOrTr�r)r�r	rrrr
r|�s
z_TestListenerClient._testcCsj|jjD]\}|jj|d�}|j|j|jfd�}d|_|��|��}|�	|�
�d�|��|��qdS)NrMr�Tr�)
rOrPrQr{r|r	rpr�rUrVr�r�r)r=rNrfr�rrrr
�test_listener_client�sz(_TestListenerClient.test_listener_clientcCsj|j��}|j|j|jfd�}d|_|��t�d�|�	�}|�
|��d�|��|�
�|��dS)Nr�TrNr�)rOrQr{r|r	rpr�r?r�rUrVr�rr�)r=rfr�rrrr
�test_issue14725�s

z#_TestListenerClient.test_issue14725cCsh|jjD]Z}|jj|d�}|j�|j�}|��}|�d�|�|�d��|�	�|�	�|�	�qdS)NrM�hellorN)
rOrPrQrTr	rUrrnr�r)r=�famrfrerRrrr
�test_issue16955
s
z#_TestListenerClient.test_issue16955N)	rFrGrHr[r*r|rYrZr]rrrr
rX�s
rXc@sTeZdZdZdd�Zedd��Zdd�Zedd	��Zd
d�Z	edd
��Z
dd�ZdS)�	_TestPollrgcCsJ|��\}}|�|��d�|�d�|�|��d�|�|��d�dS)NFr�T)r�rVr�rrQrrr
�test_empty_string
s

z_TestPoll.test_empty_stringcCs*|D]}t�d�|�|�q|��dS�Nr$)r?r�rr)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)r[r��a�br�sbyer�slopr���r�)	r�r{rbr�r�r�rrVr�)r=rarRrSr�rr�rrrr
�test_strings,
s
z_TestPoll.test_stringscCs|�d�dSr`)r�)r�r9rrr
�_child_boundaries;
sz_TestPoll._child_boundariescCsr|�d�\}}|j|j|fd�}|��t�d�ddg}|D]}|�|�q>|��|��|�	|�
�|�dS)NFr�r�sfirstssecond)r�r{rgr�r?r�rrr�r�r)r=r9rDr�r�rnrrr
�test_boundariesC
s
z_TestPoll.test_boundariescCs"|�d�|�d�|�d�dS)Nrcrd�cd)r)r�rSr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�rcr}Trdri)r�rVr�r{rjr�rr�)r=rRrSr�rrr
�test_dont_mergeU
sz_TestPoll.test_dont_mergeN)rFrGrHr[r_r*rbrfrgrhrjrkrrrr
r^
s


r^r:c@sPeZdZdZedd��Zedd��Zedd��Zdd	�Zed
d��Z	dd
�Z
dS)�_TestPicklingConnectionsr7cCsddlm}|jtd�dS)Nr)�resource_sharerr)rrmr5r)r�rmrrr
r�q
sz&_TestPicklingConnections.tearDownClasscCs�|D]@}|jj|d�}|�|j�|��}|�|�|��|��qt�tj	j
df�}|�|���|��\}}|�|�|��|��|��dS)NrMr)
rOrQr�r	rUr�socket�
create_serverr�rr�getsocknamer�)r�rrPr\rf�new_connrrrr
�	_listenerv
s


z"_TestPicklingConnections._listenercCsxt|jd�D]*\}}|j�|�}|�|���|��q|��\}}t��}|�|�|�	|���|��|��dSr)
r/r�rOrTr�r0rrnr�sendall)r�rr	rrVr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�)rOrPr�r{rrrpr�rrtr
r�r�rVr0r	r�r�)r=rPZlconnZlconn0Zlpr�Zrconn0Zrpr\rr	rq�bufrrrr
�
test_pickling�
sF



z&_TestPicklingConnections.test_picklingcCsD|��}|�d�|��|��}|��}|�|d�|��dS)N�all is wellr�)r�r�r)r�rrDr9rrrr
�child_access�
s
z%_TestPicklingConnections.child_accesscCs�|��\}}|j|j|fd�}d|_|��|��|jdd�\}}|�|�|��|�|��d�|��|jdd�\}}|�|�|��|�d�|��|�|��d�|�	�dS)Nr�TFr�rxZfoobarZfoobarfoobar)
r�r{ryrpr�rr�rVr�r�)r=rr-r�r9rDrrr
�test_access�
s"


z$_TestPicklingConnections.test_accessN)rFrGrHr[r*r�rrrtrwryrzrrrr
rll
s


.
rlcs<eZdZdZ�fdd�Z�fdd�Zdd�Zdd	�Z�ZS)
�	_TestHeapr7cs*t���tjjj|_tj��tjj_dSr)rzr�rr�r��_heap�old_heapZHeapr^r~rr
r��
s
z_TestHeap.setUpcs|jtjj_t���dSr)r}rr�r�r|rzr�r^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�rrNr�free�occupiedcss|]}|jVqdSr�rA)r��arenarrr
rV'sz&_TestHeap.test_heap.<locals>.<genexpr>rM)rr�r�r|Z_DISCARD_FREE_SPACE_LARGER_THANr�r��randomZlognormvariater�rsZ	randranger�r�Z_len_to_seqr"Z_arenas�indexZ_allocated_blocksrrV�sum�sortrAZshufflerPZ_n_freesZ
_n_mallocsZ_pending_free_blocks)r=Z
iterationsZ	maxblocksZblocksr�r�rArSr�rr�r�r�r�r5Z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~rN)r�Z	isenabledZenabler�Zdisable�
get_threshold�
set_thresholdr�rr�r�Zbuddy)r=Z
thresholdsr�rRrSrrr
�test_free_from_gcAs
z_TestHeap.test_free_from_gc)	rFrGrHr[r�r�r�r�r�rrr~r
r{�
s
@r{c@s"eZdZdefdefdefgZdS)�_Foorr�zN)rFrGrHr.r/r0Z_fields_rrrr
r�[s�r�c@s>eZdZdZdd�Zedd��Zddd�Zd	d
�Zdd�Z	d
S)�_TestSharedCTypesr7cCsts|�d�dSrrr^rrr
r�fsz_TestSharedCTypes.setUpcCsz|jd9_|jd9_|jd9_|jd9_|jd9_|jd9_tt|��D]}||d9<q`dSr�)rWrrr�rs)r�rrr�r�r?�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�r^r,gUUUUUU�?rrMr�rr�rerr�r�T�gUUUUUU�?rrX�@Z
hellohello)rr/r0r�r=r�r�r	rWr{r�rpr�r�rVrPrr)
r=r�rrr�r�r?r�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��@rr)r�rrrr�rVrP)r=r�r�rrr
�	test_copy�sz_TestSharedCTypes.test_copyN)F)
rFrGrHr[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)�_TestSharedMemoryr7cCs8t|t�rt�|�}n|}||jdt|��<|��dSr)rr3r�SharedMemoryrvrsr)Zshmem_name_or_objZbinary_dataZ	local_smsrrr
�!_attach_existing_shmem_then_write�s

z3_TestSharedMemory._attach_existing_shmem_then_writecCs|tt���Sr)r3r3rt)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���createrAr�rrr�Ztest01_dblunlinkr~c@seZdZejejBZdS)zO_TestSharedMemory.test_shared_memory_basics.<locals>.OptionalAttachSharedMemoryN)rFrGrHr3rH�O_RDWRZ_flagsrrrr
�OptionalAttachSharedMemory�sr�Ztest01_nottherer2�r�)r�rr�r�r<rVr!rxrArsrvrr�Z
_USE_POSIXr��FileNotFoundError�FileExistsErrorr6)
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�rasHELLO)rr�r�r<r{r�r!rpr�r�rVrrrvr)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�r3r�r�r�r�r'r�r�rtr�)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)NrHr�csg|]}��t|���qSr)r�r�r��Zsmm1rr
r�WszS_TestSharedMemory.test_shared_memory_SharedMemoryManager_basics.<locals>.<listcomp>rar�csg|]}�j|d��qS)r�)r�)r�rr�rr
r�Xsr��r�r!r%�howdy)rr�r�r�r6r�r�r�rr��shmr!rVrsrxrvr�r�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?qr^�ignoreZ100rMr���)r�r�r�r�NTr�Zsomer]z8s8sdq8sxxxxxxx?qzexceeds available storagezfar too manyuencodésrNu	encodéess	123456789r�sadiosZtest03_duplicater��Mr2ipr�any)rr�r�r�r<rVrkrs�warnings�catch_warnings�simplefilterr�r6r�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�r2rHZchangedr]rRi�)rr�r�r�r�r<�pickle�dumps�loadsrnrr}rVrsr!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�raFr�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?r@r��minrr�r�rbr3r!rr?r�)r=r�r�r!�deadlinerCr�rBrrr
�4test_shared_memory_cleaned_after_process_termination�s2
�

�zF_TestSharedMemory.test_shared_memory_cleaned_after_process_terminationN)rFrGrHr[r�r�r�r�r�r7rEr3r!r�r�r�r�r�r�rrrr
r��s
[

`r�c@s<eZdZdZdd�Zdd�Zedd��Zdd	�Zd
d�Z	dS)
�
_TestFinalizer7cCstj��|_tj��dSr)r�_finalizer_registryr�registry_backuprr^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>.FooNrwrrrr
r�&sr�)rRr�)rS)re)�d10rN)rA�exitpriority)�d01r)�d02)�d03�r�i����)�STOPi����)r~r�Finalizer�Z_exit_functionrr3�_exit)r�rr�rRrSZclose_brer�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�rnrrr
r�Rsz/_TestFinalize.test_finalize.<locals>.<listcomp>r�rRrSr�r�r�r�r�)	r�r{r�rpr�r�r/r�rV)r=rr-r�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)NrNr�)r�)r�rr�r�Zrandintr^�r�rr
r>[sz6_TestFinalize.test_thread_safety.<locals>.Foo.__init__N)rFrGrHr>rr�rr
r�Zsr�Fc
sP�sLt�t��d�zt��Wqtk
rH}z|�W5d}~XYqXqdSr`)r?r�r�rZ_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�ra)r�r�Zgetrandbitsr�r)rr�)r�r�r�rr
�make_finalizersns$z9_TestFinalize.test_thread_safety.<locals>.make_finalizersg���ư>rarxr�T)r~r��getswitchintervalr�r��setswitchintervalr�r�r�r
r�rZ
start_threadsr?r�)r=r�r�Zold_intervalZ
old_thresholdrLr)r�r�r�r�r
�test_thread_safetyUs,


�


z _TestFinalize.test_thread_safetyN)
rFrGrHr[r�r�r*r�r�r�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)rNr)r3�path�splitext�split)r�rArrr
r��sz4_TestImportStar.get_module_names.<locals>.<listcomp>cSsg|]}d|�qS)zmultiprocessing.r)r�r�rrr
r��szmultiprocessing.__init__r)
�globr3r��dirnamer�__file__r��escaperr�)r=r�Zfolder�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)r�r�r�rrKr.rur�rnr�r�)r=r�r!�mod�attrrrr
�test_import�s&








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

z _TestLogging.test_enable_loggingcCst��}|�|���dSr)rr�r�ZgetEffectiveLevel)r�rr�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��loggingZ	getLoggerrr�r�r{r�r�rVr�r�rZNOTSETr�)	r=ZLEVEL1ZLEVEL2r�Zroot_loggerZ
root_levelr)r*r�rrr
�
test_level�s*


z_TestLogging.test_levelN)rFrGrHr[r�r*r�rrrrr
r��s

r�c@s6eZdZdZedd��Ze�ee	d�d�dd��Z
dS)	�_TestPollEintrr7cCst�d�t�|tj�dSr`)r?r�r3r�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)
r3rtr�rr{rr�r�r?r�rnrVru)r=rr�Z
oldhandlerZkillerr�rrr
�test_poll_eintr	s
z_TestPollEintr.test_poll_eintrN)rFrGrHr[r*rr7r+r�r�r	rrrr
rs

rc@s eZdZe�ed�dd��ZdS)�TestInvalidHandle�skipped on Windowsc	CsZtj�d�}z*z|��Wnttfk
r2YnXW5d|_X|�ttftjjd�dS)Ni�M�r2)rrOZ
ConnectionZ_handler�r6rr�rDrrr
�test_invalid_handles$s

�z&TestInvalidHandle.test_invalid_handlesN)rFrGrHr7rE�WIN32rrrrr
r
"s
r
c@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=rArrr
r9szQOtherTest.test_deliver_challenge_auth_failure.<locals>._FakeConnection.recv_bytescSsdSrr�r=r8rrr
r;szQOtherTest.test_deliver_challenge_auth_failure.<locals>._FakeConnection.send_bytesN)rFrGrHrrrrrr
�_FakeConnection8sr�abc)r~r�r�AuthenticationErrorrOZdeliver_challenge�r=rr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)NrNr�rr�)r�rrOZ	CHALLENGErrrr
rEs

zPOtherTest.test_answer_challenge_auth_failure.<locals>._FakeConnection.recv_bytescSsdSrrrrrr
rLszPOtherTest.test_answer_challenge_auth_failure.<locals>._FakeConnection.send_bytesN)rFrGrHr>rrrrrr
rBsrr)r~r�rrrOZanswer_challengerrrr
�"test_answer_challenge_auth_failureAs�z,OtherTest.test_answer_challenge_auth_failureN)rFrGrHrrrrrr
r5s
rcCs|jd7_dSrM)r�)�nsrrr
�initializerVsrc@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�TestInitializerscCs"t��|_|j��|_d|j_dSr�)r�Manager�mgrrkrr�r^rrr
r�Zs
zTestInitializers.setUpcCs|j��|j��dSr)rr�r�r^rrr
r�_s
zTestInitializers.tearDowncCsNtj��}|�t|jd�|�t|jf�|�|jj	d�|�
�|��dSrM)rr��SyncManagerr��	TypeErrorr�rrrVr�r�r�)r=r�rrr
�test_manager_initializercs
z)TestInitializers.test_manager_initializercCsH|jttjdd�t�dt|jf�}|��|��|�|jj	d�dS)NrN)r)
r�rrr|rrrr�rVr�r�rrr
�test_pool_initializerks
z&TestInitializers.test_pool_initializerN)rFrGrHr�r�rr rrrr
rYsrcCs,z|jdd�}Wntjk
r&YnXdS)NF)�block)r�r`rh)rd�itemrrr
�_this_sub_processwsr#cCs2t��}tjt|fd�}d|_|��|��dSr�)rrr{r#rpr�r�)rZsubProcrrr
�
_test_process}s
r$cCs||Srrrprrr
�_afunc�sr%c
Cs:tjdd�}|�tdddddddg�}|��|��dS)	Nr]r7rNr�rMrarXr^)rr|r�r%rr�)r}rrrr
�pool_in_process�sr&c@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)r3rtr)�_cacher�rrr
�cache�s

z_file_like.cachecCs|j�|�dSr)r+r�rrrr
rs�sz_file_like.writecCs|j�d�|j��g|_dS)Nr)r(rsr�r+r*r^rrr
�flush�sz_file_like.flushN)rFrGrHr>�propertyr+rsr,rrrr
r'�s

r'c@s$eZdZdd�Zdd�Zdd�ZdS)�TestStdinBadfiledescriptorcCs tjtd�}|��|��dS�Nrx)rr{r$r�r�)r=r
rrr
�test_queue_in_process�sz0TestStdinBadfiledescriptor.test_queue_in_processcCs tjtd�}|��|��dSr/)rr{r&r�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>rx)	rrr'rsrr{r,r�rb)r=Zsior
rr2r
�
test_flushing�s
z(TestStdinBadfiledescriptor.test_flushingN)rFrGrHr0r1r3r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�r3rtr)r�rD�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&r]Fr�r�Tc3s"|]}�D]}||jfVq
qdSrr�)r�r�r��r�rr
rV�sz%TestWait.test_wait.<locals>.<genexpr>r�)�multiprocessing.connectionr'r�rr�r{r6rpr�rr�r�r�r�r&rr�rXrV)r=r5r'�readersZmessagesr�r9rDr�rr�rr7r
�	test_wait�s0


zTestWait.test_waitcCsVt��}|�|�td�D].}|r4t�t��d�|�d|�d��q|��dS)Nr�r$�%s
ru)	rnrr�r?r�r�rsr
r)r�r	r5rr�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&r]r�Trrcss|]}d|VqdS)r;Nrr�rrr
rVsz,TestWait.test_wait_socket.<locals>.<genexpr>r�rur�)r8r'rnror�rrrpr�rr{r<rpr�r�r�r�rUrr�rr
r"rV)r=r5r'rfrr9r�Zdicr�r�r9r�rr��vrrr
�test_wait_socket�s:�





zTestWait.test_wait_socketcCs|�d�dSr�)r:r^rrr
�test_wait_slowszTestWait.test_wait_slowcCs|�d�dSr�)r>r^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&rar�rr皙�����?)
r8r'rr�r?r@rVr�r�r�)r=r'r�rRrSr�rXryr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&rMcSst|dd�d�S)NcSst|�Sr)r�rprrr
r�2r�z>TestWait.test_wait_integer.<locals>.<lambda>.<locals>.<lambda>)r�)rX)rfrrr
r�2r�z,TestWait.test_wait_integer.<locals>.<lambda>r�rrr�rA)r8r'rr�r�r{rCr�rqr�r�rnr�r?r@rVr�r�r�r�r�)r=r'r�Zsorted_r�rRrSr�r�rXryrrr
�test_wait_integer.s>
�

zTestWait.test_wait_integercCsfddlm}t��\}}t��}||gdd�}t��|}|�|g�|�|d�|��|��dS)Nrr&r2rrN)	r8r'rr�r?r@rVr�r)r=r'rRrSrCrXrrr
�test_neg_timeoutYszTestWait.test_neg_timeoutN)F)F)rFrGrHr*r6r:r<r>r?r@rBrCrDrErrrr
r4�s


	
#
+r4c@s4eZdZe�ed�dd��Ze�ed�dd��ZdS)�TestInvalidFamilyrc	Cs&|�t��tj�d�W5QRXdS)Nz\\.\test�r�r6rrOrQr^rrr
�test_invalid_familyjsz%TestInvalidFamily.test_invalid_familyz skipped on non-Windows platformsc	Cs&|�t��tj�d�W5QRXdS)Nz/var/test.piperGr^rrr
�test_invalid_family_win32osz+TestInvalidFamily.test_invalid_family_win32N)	rFrGrHr7rEr
rHr+rIrrrr
rFhs


rFc@s,eZdZedd��Zedd��Zdd�ZdS)�	TestFlagscCs|�ttj��dSr)r�rr��flags�r�rrrr
�run_in_grandchildyszTestFlags.run_in_grandchildcCsrddl}tjdd�\}}tj|j|fd�}|��|��}|��|��|��t	t
j�|f}t|�
|��dS)NrFr�r�)�jsonrr�r{rMr�r�r�rrr�rK�printr�)r�rNr9rDr��grandchild_flagsrKr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�ru)rNr�Zcheck_outputr�r�r�r�rV)r=rN�progr8Zchild_flagsrPrrr
�
test_flags�s�zTestFlags.test_flagsN)rFrGrHr*rMrQrSrrrr
rJxs


rJc@s eZdZedd��Zdd�ZdS)�TestTimeoutscCs>t�d�|�d�|��tj�|�}|�d�|��dS)NrNr���)r?r�r�rrrOrT)r��childr	rr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_INETrMr�r�rU)rnZgetdefaulttimeoutZsetdefaulttimeoutrr�rOrQr{rWr	r�rrVr�rUr)r=Zold_timeout�parentrVrfr�rrrr
rz�s$
�zTestTimeouts.test_timeoutN)rFrGrHr*rWrzrrrr
rT�s
rTc@seZdZdd�ZdS)�TestNoForkBombcCs�t��}tj�tj�t�d�}|dkrVtjj	�
||�\}}}|�|d�|�d|�n2tjj	�
||�\}}}|�|��d�|�|d�dS)Nzmp_fork_bomb.pyr�r�sRuntimeErrors123)rr�r3r�r�r�r�r�rr�Zassert_python_failurerVr�r�rO)r=r�r!r�r�rBrrr
�test_noforkbomb�szTestNoForkBomb.test_noforkbombN)rFrGrHr[rrrr
rZ�srZc@s eZdZedd��Zdd�ZdS)�TestForkAwareThreadLockcCsV|dkr:tj|j|d|fd�}|��|��t|�n|�ttj	��|��dS)NrNr�)
rr{rVr�rrr�rsr�_afterfork_registry)r�r�rr�rrr
rV�s
zTestForkAwareThreadLock.childcCsdt�d�\}}t��}ttj�}tj|jd|fd�}|��|�	�|�
�}t|�|�||�dS)NFrar�)
rr�rZForkAwareThreadLockrsr]r{rVr�rr�rZassertLessEqual)r=r9rDrfZold_sizer�Znew_sizerrr
r��s
z!TestForkAwareThreadLock.test_lockN)rFrGrHr*rVr�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
rn�detachr�r3�dupr)r=rJZto_closerrrr
�get_high_socket_fd�s
zTestCloseFds.get_high_socket_fdcCs,trtjtjtj|d���n
t�|�dS)N)r!)r
rnrX�SOCK_STREAMrr3)r=rJrrr
r�szTestCloseFds.closec
CsZzt�|tjtj�}Wn,tk
rB}z|�|�W5d}~XYnX|��|�d�dSr)rnZfromfdrXrbr�r�r)r�rrJrr�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�r�i6')rKr7r8rr�rarr{rcr�r�rr�r�rqrrnrr3Zwinerror)r=r)r*rJr�r�ZWSAENOTSOCKrrr
�test_closefds.
�

�zTestCloseFds.test_closefdN)rFrGrHrarr*rcrdr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�rr�r�r�
CONN_MAX_SIZE)r�rr�rrrr
�_test_ignore1s

zTestIgnoreEINTR._test_ignorerrcCs�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�Trhr$i�ri)rr�rr{rkrpr�rVr�r?r�r3r�r�r�rr�rrjr�rFrrr
�test_ignore;s(�




zTestIgnoreEINTR.test_ignorec	CsNdd�}t�tj|�tj���$}|�|j�|��}|�d�W5QRXdS)NcSsdSrrrfrrr
r�Tsz6TestIgnoreEINTR._test_ignore_listener.<locals>.handler�welcome)r�rrrOrQr�r	rU)r�rr�rfrRr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$rm)rr�rr{rnrpr�r�r?r�r3r�r�r�rrOrTrVr�)r=rr-r�r	rVrrr
�test_ignore_listener\s �

z$TestIgnoreEINTR.test_ignore_listenerN)rFrGrH�maxrZ
PIPE_MAX_SIZEZ
SOCK_MAX_SIZErjr*rkr7r+r�r�rlrnrorrrr
re,s
	

	rec@s@eZdZedd��Zdd�Zdd�Zdd�Zd	d
�Zdd�Z	d
S)�TestStartMethodcCs|�t���dSr)r�rr�rLrrr
�_check_contextpszTestStartMethod._check_contextcCs^|jdd�\}}|j|j|fd�}|��|��|��}|��|��|�||���dS)NFr�r�)	r�r{rrr�rr�r�rVr�)r=r�r9rDr�Zchild_methodrrr
�
check_contexttszTestStartMethod.check_contextc	Cs�dD]v}zt�|�}Wntk
r.YqYnX|�|��|�|�|��|�|�t|jd�|�t|jd�|�|�qdS)N�r�r�r r�)	rr�r6rVr�r�r��set_start_methodrs)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�ZforcertrN)r�set_forkserver_preload�PRELOADr�rur6rVr�rnr�rF�lower�
startswithr{rsrx)r=r�Z
old_methodrvr�rrr
�test_set_get�s(

�
zTestStartMethod.test_set_getcCs`t��}tjdkr"|�|dg�n:|�|ddgkpX|ddgkpX|dddgkpX|dddgk�dS)Nr%r�r�r )rZget_all_start_methodsr�r�rVrn)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�okrz(failed spawning forkserver or grandchild)rr�rjr3r�r�r�r�r�rr�r�r�rOrOrv)r=r!r�r�rBrrr
�test_preload_resources�s
z&TestStartMethod.test_preload_resourcesN)
rFrGrHr*rrrsr�r|r~r�rrrr
rqos


rqr@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�)rDr")Zpass_fdsrr=TrErur�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 ZsubTestr3�piper�r�r�r�rkr�rr>r�rOr�r#r�r'r?r@r�rr�rZENOENTZEINVALrbrr?ZassertRegex)
r=r�r"r9rDr�rAZname1Zname2r�r�rBr�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)r�alwaysrNzresource_tracker: process died) � multiprocessing.resource_trackerr�r)r3r�r�r��waitpidr�r�r�r$r?r�rr�r�r�r�r�r�r�r�r�rVrsrn�
issubclass�category�UserWarningr3�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$r)Z_check_aliver�)rr�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$r)rr�r{r�r�r�r�rrn)r=r�r�r9rDr�Zis_resource_tracker_reusedrrr
�test_resource_tracker_reused@s�z0TestResourceTracker.test_resource_tracker_reusedN)rFrGrHr�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�rcrQrerrr
�_test_emptyUs
zTestSimpleQueue._test_emptycCs�t��}t��}t��}tj|j|||fd�}d|_|��|�|���|�	�|�
�|�|���|�|�
�d�|�|�
�d�|�|���|��dS)Nr�TF)rZSimpleQueuer�r{r�rpr�rnrQr�r'r}rVr�r�)r=rrYrZr
rrr
�
test_empty_s"�zTestSimpleQueue.test_emptyN)rFrGrHr*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)
NrMcs<eZdZ�fdd�Z�fdd�Zdd�Zdd�Zd	d
�ZdS)zRTestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.FailingForkProcesscs d|_d|_d|_��|�dS)NzFake Process)r!rur�r�)r=r�)�forked_processesrr
r>�sz[TestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.FailingForkProcess.__init__cs"�dkrtd���d8�d|_dS)Nr�Manually induced OSErrorrNr�)rr�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�Zstoppedr�r^rrr
r��s
zWTestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.FailingForkProcess.joincSs|jdkp|jdkS)Nr�r�r�r^rrr
ro�sz[TestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.FailingForkProcess.is_aliveN)rFrGrHr>r�r�r�ror�r�r�rr
�FailingForkProcess�s
r�r�ra)r{)�contextcss|]}|��VqdSrr�)r�rrrr
rV�szITestPoolNotLeakOnFailure.test_release_unused_processes.<locals>.<genexpr>)r�rrr}r|r7ZmockZ	MagicMockrr�r}r�)r=r�r�rr�r
�test_release_unused_processeszs�
�z6TestPoolNotLeakOnFailure.test_release_unused_processesN)rFrGrHr�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_classrKr�r
r^rrr
r��s

zTestSyncManagerTypes.setUpcCsB|jdk	r(|j��r(|j��|j��|j��d|_d|_dSr)r
ror�r�rKr�r^rrr
r��s


zTestSyncManagerTypes.tearDowncCst��dSr)rZ
reap_childrenr�rrr
r{�szTestSyncManagerTypes.setUpClasscCsxt|j�t��}d}tt���dkrtt�|�|d9}t��|}|dkrdtj	_
t	�dt���d|�d��qtqdS)	Nr�rNr�r�T�"multiprocessing.Manager still has � active children after � seconds)rr
r?r@rsrr�r�r�r�environment_altered�
print_warning)r=�
start_timerCr�rrr
�wait_proc_exit�s

z#TestSyncManagerTypes.wait_proc_exitcCs@tj||fd�|_d|j_|j��|��|�|jjd�dS)Nr�Tr)rr{r
rpr�r�rVru)r=Zworkerrnrrr
�
run_worker�s

zTestSyncManagerTypes.run_workercCs*|��st�|��|��|�d�dS�Nr�)rrbr'r�r�rnrrr
r��sz TestSyncManagerTypes._test_eventcCs:|j��}|��|�|j|�|��r,t�|�d�dSr�)rKr�r�r�r�rrbr'�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)rrKr�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)rrKr�r�r�rrr
r�szTestSyncManagerTypes.test_rlockcCs|��dSrr�r�rrr
r�sz$TestSyncManagerTypes._test_semaphorer�cCs(t|j|��}|�|j|�|��dSr)rrKr�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)rKr�r�r�r�rrr
�test_conditions
z#TestSyncManagerTypes.test_conditioncCs|jdkst�|��dSr`)r�rbrr�rrr
�
_test_barriersz"TestSyncManagerTypes._test_barriercCs|j�d�}|�|j|�dSr`)rKr�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)Nr]r7)rKr|r�r�r�rrr
�	test_pool*szTestSyncManagerTypes.test_poolcCsd|��dkst�|��st�|��r(t�|��dks8t�|��rDt�|��dksTt�|��s`t�dS�Nr�rarX)rRrbrTrQr�r�rrr
�_test_queue.sz TestSyncManagerTypes._test_queuercCsNt|j|�d�}|�d�|�d�|�|j|�|��s>t�|��rJt�dSr�)rrKrcr�r�rQrbrT)r=Zqnamer�rrr
�
test_queue8s

zTestSyncManagerTypes.test_queuecCs|�d�dS)Nrq)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)NrrarN)rbr�r�r��reversersrP)r�rnrrrr
�
_test_listCszTestSyncManagerTypes._test_listcCs>|j��}|�d�|�|j|�|r*t�|�t|�d�dS)Nrar)rKr�r�r�r�rbrVrsr�rrr
rJOs


zTestSyncManagerTypes.test_listcCs�t|�dkst�|ddks t�|�d�dks2t�t|���dgksHt�t|���dgks^t�t|���dgkstt�|��ddiks�t�|��dks�t�dS)NrNr�ra)r�ra)	rsrbr�r�rrYr"r�popitemr�rrr
�
_test_dictVszTestSyncManagerTypes._test_dictcCs<|j��}d|d<|�|j|�|r(t�|�t|�d�dS)Nrar�r)rKrWr�r�rbrVrsr�rrr
r[as

zTestSyncManagerTypes.test_dictcCs,|jdkst�|��dkst�|�d�dS)NrNr�)rWrbr�r�r�rrr
�_test_valuehsz TestSyncManagerTypes._test_valuecCs>|j�dd�}|�|j|�|�|jd�|�|��d�dS)Nr�rNr�)rKrr�r�rVrWr�r�rrr
r)nszTestSyncManagerTypes.test_valuecCsH|ddkst�|ddks t�t|�dks0t�t|�ddgksDt�dS)NrrNr�)rbrsr�r�rrr
�_test_arraytsz TestSyncManagerTypes._test_arraycCs$|j�dddg�}|�|j|�dS)Nr�rrN)rKr=r�r�r�rrr
r@{szTestSyncManagerTypes.test_arraycCs |jdkst�|jdkst�dSr�)rrbrr�rrr
�_test_namespacesz$TestSyncManagerTypes._test_namespacecCs(|j��}d|_d|_|�|j|�dSr�)rKrkrrr�r�r�rrr
rl�s
z#TestSyncManagerTypes.test_namespaceN)r�)r�)r�)r)+rFrGrHr�rr�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�r�rJr�r[r�r)r�r@r�rlrrrr
r��sd











	






r�c@seZdZdd�ZdS)�MiscTestCasecCstj|ttjddgd�dS)NZSUBDEBUGr�)ZextraZ	blacklist)rZcheck__all__rr�r^rrr
�test__all__�s�zMiscTestCase.test__all__N)rFrGrHr�rrrr
r��sr�c@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: rN�Dangling threads: )r�rr�r�rrr�r�r�r�r�)r�rJrLrrr
r��s
zBaseMixin.tearDownClassN)rFrGrHr*r{r�rrrr
r��s
r�c@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�rJN)rFrGrHrirr{rOr�rlr�r�r|r�rrqr�r�r�r�r�r�r�rr=r%r<r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)�ManagerMixinrKz
manager.Queuezmanager.JoinableQueuezmanager.Lockz
manager.RLockzmanager.Semaphorezmanager.BoundedSemaphorezmanager.Conditionz
manager.Eventzmanager.Barrierz
manager.Valuez
manager.Arrayzmanager.listzmanager.dictzmanager.NamespacecOs|jj||�Sr)rKr|)r�rArBrrr
r|�szManagerMixin.Poolcst���t��|_dSr)rzr{rrrKr�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�rNr�r�Tr�r�r�rz5Shared objects which still exist at manager shutdown:)r?r@rsrr�r�r�rr�r�r�r�rKZ_number_of_objectsZ_debug_infor�r�rzr�)r�r�rCr�r~rr
r��s&



zManagerMixin.tearDownClass)rFrGrHrirr{r-�operator�
attrgetterrrqr�r�r�r�r�r�r�rr=r�rWrkr*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)�ThreadsMixinrLN)rFrGrHrirZdummyr{rOr�rlr�r|r�rrqr�r�r�r�r�r�r�rr=rrrr
r�s$r�c
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)NrFrJrLrKZWithrN�Mixinc@seZdZdS�z*install_tests_in_module_dict.<locals>.TempNrwrrrr
�Temp)sr�c@seZdZdSr�rwr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)	NrrNT)Z
allow_nonerwz start method not supportedZlinuxz1OSError raises on RLock creation, see issue 3111!)rrxryrZ_cleanupr�rr�r�rur6r7r8r�r�r{r�rr9rZget_temp_dirr�r�r�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)	NFrTrwr�rNr�r)r�rr�rrur�rr�r�r�r�r?r�rZ_cleanup_tests)Z
need_sleeprJrL)r�r�rr
�tearDownModuleNs$

z4install_tests_in_module_dict.<locals>.tearDownModuler�r�)�globalsrrr�r�rIr�r[rb�
capitalizer7�TestCaserFrHrGr~)
Zremote_globsr�rGZlocal_globsZ	ALL_TYPESr!�baseZtype_Znewnamer�r�r�r�rr�r
�install_tests_in_module_dicts8




r�)r()�r7Z
unittest.mockrr`r?rr�r�r3r�rr�r>rnr�rr�r�r�r�r�r�Ztest.supportr�Ztest.support.script_helperr�
import_modulerZ*skip_if_broken_multiprocessing_synchronizer�r8rZmultiprocessing.dummyZmultiprocessing.heapZmultiprocessing.managersr�Zmultiprocessing.queuesrrZHAVE_SEND_HANDLErK�ImportErrorZmultiprocessing.sharedctypesrrr�rZ	HAS_SHMEMr7rr	rrr!rr#r�r�r�rOrarbrcrZ
HAVE_GETVALUEr�r
r'r)r4rAryZctypesr-r.r/r0r~r9r:rIr]r_rfr{r,r6rSrVrWr�r�r�r�r�r�r�r�r�rr8rFrmrnrorqrrr6rvrxryr�r�r�r�r�r�r�r�r�r�r��registerr�rrrrrr
rrrrrLrXr^r+rlr{r�r�r�r�r�r�r�rr
rrrr#r$r%r&r'r.r4rFrJrTrZr\r^rerqrEr�r�r�r�r�r�r�r�r�r�rrrr
�<module>s�





�

,NH6*39FS

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