a
    äzeô  ã                   @   sŒ   d Z ddlZddlZddlZddlZddlZddlZddlZddl	m
Z
 ddlmZ e ed¡ G dd„ de
ƒZdd	„ Zed
krˆe ¡  dS )z.This test checks for correct fork() behavior.
é    N)ÚForkWait)ÚsupportÚforkc                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚForkTestc                    sú   t  ¡ ‰d‰d‰d‰ ‡ ‡‡‡fdd„}t j|d}| ¡  ˆ ¡  d}t ¡ }z~|sŽtˆƒ}|ˆ krpt |¡ q¤t	j
dkr‚td	ƒ t d¡ n| ¡  | j||d
 W zt |tj¡ W qö tyÊ   Y qö0 n(zt |tj¡ W n tyò   Y n0 0 dS )zFCheck fork() in main thread works while a subthread is doing an importzfake test moduleÚpartialZcompletec                      s:   t  ¡  ˆtjˆ< ˆ ¡  t d¡ ˆ tjˆ< t  ¡  d S )Ng{®Gáz„?)ÚimpÚacquire_lockÚsysÚmodulesÚsetÚtimeÚsleepÚrelease_lock© ©Zcomplete_moduleZfake_module_nameZimport_startedZpartial_moduler   ú%/usr/lib/python3.9/test/test_fork1.pyÚimporter   s    


z9ForkTest.test_threaded_import_lock_fork.<locals>.importer)Útargeté*   é   z Child encountered partial module©ÚexitcodeN)Ú	threadingÚEventÚThreadÚstartÚwaitÚosr   Ú
__import__Ú_exitr   ÚverboseÚprintÚjoinÚ	wait_implÚkillÚsignalÚSIGKILLÚOSError)Úselfr   Útr   ÚpidÚmr   r   r   Útest_threaded_import_lock_fork   s8    
ýz'ForkTest.test_threaded_import_lock_forkc                    s,   d‰ ‡ ‡fdd„}t dƒD ]}||ƒ qdS )zJCheck fork() in main thread works while the main thread is doing an importr   c              	      sÂ   d}d}zdzFt | ƒD ]}t ¡  |d7 }qt ¡ }| }W t |ƒD ]}t ¡  qBnt |ƒD ]}t ¡  qZ0 W n4 ty    |rštjdkrt	dƒ t 
d¡ ‚ Y n0 |r°t 
ˆ ¡ ˆj|ˆ d d S )Nr   Fr   zRuntimeError in childr   )Úranger   r   r   r   r   ÚRuntimeErrorr   r    r!   r   r#   )ÚlevelÚreleaseZin_childÚir*   ©r   r(   r   r   Úfork_with_import_lockC   s,    
ÿ


zDForkTest.test_nested_import_lock_fork.<locals>.fork_with_import_locké   N)r-   )r(   r3   r/   r   r2   r   Útest_nested_import_lock_fork?   s    z%ForkTest.test_nested_import_lock_forkN)Ú__name__Ú
__module__Ú__qualname__r,   r5   r   r   r   r   r      s   +r   c                   C   s   t  ¡  d S )N)r   Úreap_childrenr   r   r   r   ÚtearDownModule`   s    r:   Ú__main__)Ú__doc__Ú_impr   r   r%   r	   r   r   ZunittestZtest.fork_waitr   Útestr   Zget_attributer   r:   r6   Úmainr   r   r   r   Ú<module>   s   M