B
    u9a
  ã               @   sZ   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mZ dZdZ	dZ
G dd„ dejƒZdS )ar  This test case provides support for checking forking and wait behavior.

To test different wait behavior, override the wait_impl method.

We want fork1() semantics -- only the forking thread survives in the
child after a fork().

On some systems (e.g. Solaris without posix threads) we find that all
active threads survive in the child after a fork(); this is an error.
é    Né   g      à?é   c               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚForkWaitc             C   s    t  ¡ | _i | _d| _g | _d S )Nr   )ÚsupportZthreading_setupÚ_threading_keyÚaliveÚstopÚthreads)Úself© r   ú/usr/lib/python3.7/fork_wait.pyÚsetUp   s    
zForkWait.setUpc             C   s<   d| _ x| jD ]}| ¡  qW d }| j ¡  tj| jŽ  d S )Né   )r   r	   ÚjoinÚclearr   Zthreading_cleanupr   )r
   Úthreadr   r   r   ÚtearDown   s    
zForkWait.tearDownc             C   sB   x<| j s<t ¡ | j|< yt t¡ W q tk
r8   Y qX qW d S )N)r   ÚosÚgetpidr   ÚtimeÚsleepÚ
SHORTSLEEPÚOSError)r
   Úidr   r   r   Úf&   s    z
ForkWait.fc             C   sj   x:t dƒD ].}t |tj¡\}}||kr*P t dt ¡ q
W |  ||¡ |  |dd|d@ |d? f ¡ d S )Né
   r   r   zcause = %d, exit = %déÿ   é   )Úranger   ÚwaitpidÚWNOHANGr   r   r   ÚassertEqual)r
   ÚcpidÚiZspidÚstatusr   r   r   Ú	wait_impl.   s    zForkWait.wait_implc       	      C   s  x6t tƒD ]*}tj| j|fd}| ¡  | j |¡ q
W t 	¡ d }x*t
| jƒtk rnt d¡ |t 	¡ k rFP qFW t| j ¡ ƒ}|  |tt tƒƒ¡ | j ¡ }tjdkr°t ¡ }nt ¡ }|dkrt t¡ d}x(| jD ]}| j| || krØ|d7 }qØW t |¡ n
|  |¡ d S )N)ÚtargetÚargsg      $@gš™™™™™¹?)Z	unixware7r   r   )r   ÚNUM_THREADSÚ	threadingZThreadr   Ústartr	   Úappendr   Z	monotonicÚlenr   r   ÚsortedÚkeysr!   ÚlistÚcopyÚsysÚplatformr   Zfork1ÚforkÚ	LONGSLEEPÚ_exitr%   )	r
   r#   r   ZdeadlineÚaZprefork_livesr"   ÚnÚkeyr   r   r   Ú	test_wait:   s.    





zForkWait.test_waitN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r%   r9   r   r   r   r   r      s
   	r   )Ú__doc__r   r1   r   Zunittestr)   Ztest.supportr   r4   r   r(   ZTestCaser   r   r   r   r   Ú<module>
   s    