B
    18™\Ü  ã               @   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éÿ   é   )ÚtimeÚ	monotonicÚosÚwaitpidÚWNOHANGÚsleepÚassertEqual)ÚselfZcpidÚdeadlineZspidÚstatus© r   úS/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/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)Ú	threadingÚEventÚ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Úir4   )r   r   r   Úfork_with_import_lockO   s(    


zDForkTest.test_nested_import_lock_fork.<locals>.fork_with_import_locké   N)r7   )r   r<   r9   r   )r   r   Útest_nested_import_lock_forkL   s    z%ForkTest.test_nested_import_lock_forkN)Ú__name__Ú
__module__Ú__qualname__r   r6   r>   r   r   r   r   r      s   *r   c               C   s
   t ƒ  d S )N)r   r   r   r   r   ÚtearDownModulel   s    rB   Ú__main__)Ú__doc__Ú_impr   r   r0   r   r&   r   ÚunittestZtest.fork_waitr   Ztest.supportr   r   r   r   r   rB   r?   Úmainr   r   r   r   Ú<module>   s   
X