B
    u9aÜ  ã               @   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mZmZ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)Úreap_childrenÚget_attributeÚimport_moduleÚverboseÚforkc               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚForkTestc             C   sr   t  ¡ d }x6t  ¡ |krBt |tj¡\}}||kr6P t  d¡ qW |  ||¡ |  |dd|d@ |d? f ¡ d S )Ng      $@gš™™™™™¹?r   zcause = %d, exit = %déÿ   é   )ÚtimeZ	monotonicÚosÚwaitpidÚWNOHANGÚsleepZassertEqual)ÚselfZcpidZdeadlineZspidÚstatus© r   ú /usr/lib/python3.7/test_fork1.pyÚ	wait_impl   s    zForkTest.wait_implc                sÌ   t  ¡ ‰d‰d‰d‰ ‡ ‡‡‡fdd„}t j|d}| ¡  ˆ ¡  t ¡ }zR|sˆtˆƒ}|ˆ krlt d¡ qšt	dkr|t
d	ƒ t d¡ n| ¡  |  |¡ W d
yt |tj¡ W n tk
rÄ   Y nX X 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Úsetr   r   Úrelease_lockr   )Úcomplete_moduleÚfake_module_nameÚimport_startedÚpartial_moduler   r   Úimporter(   s    


z9ForkTest.test_threaded_import_lock_fork.<locals>.importer)Útargetr   é   z Child encountered partial moduleN)Ú	threadingZEventZThreadÚstartÚwaitr   r   Ú
__import__Ú_exitr   ÚprintÚjoinr   ÚkillÚsignalÚSIGKILLÚOSError)r   r    ÚtÚpidÚmr   )r   r   r   r   r   Útest_threaded_import_lock_fork"   s.    z'ForkTest.test_threaded_import_lock_forkc                s*   ‡ fdd„}xt dƒD ]}||ƒ qW dS )zJCheck fork() in main thread works while the main thread is doing an importc          	      s°   d}d}yVz4x t | ƒD ]}t ¡  |d7 }qW t ¡ }| }W d xt |ƒD ]}t ¡  qJW X W n4 tk
r’   |rŒtdkr‚tdƒ t 	d¡ ‚ Y nX |r¢t 	d¡ ˆ  
|¡ d S )Nr   Fr"   zRuntimeError in child)Úranger   r   r   r   r   ÚRuntimeErrorr   r(   r'   r   )ÚlevelÚreleaseZin_childÚir/   )r   r   r   Úfork_with_import_lockO   s(    


zDForkTest.test_nested_import_lock_fork.<locals>.fork_with_import_locké   N)r2   )r   r7   r4   r   )r   r   Útest_nested_import_lock_forkL   s    z%ForkTest.test_nested_import_lock_forkN)Ú__name__Ú
__module__Ú__qualname__r   r1   r9   r   r   r   r   r      s   *r   c               C   s
   t ƒ  d S )N)r   r   r   r   r   ÚtearDownModulel   s    r=   Ú__main__)Ú__doc__Ú_impr   r   r+   r   r#   r   ZunittestZtest.fork_waitr   Ztest.supportr   r   r   r   r   r=   r:   Úmainr   r   r   r   Ú<module>   s   
X