B
    18\                 @   s   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Zd dlZd dl	m
Z
 d dlmZmZmZmZmZ d dlmZ d dlmZ dZdZdd	 Zd
d ZG dd dZG dd dejZdd ZdS )    N)support)runtestINTERRUPTEDCHILD_ERRORPROGRESS_MIN_TIMEformat_test_result)setup_tests)format_durationg      >@g       @c          	   C   s   ddl m}m} t|}|| f}t|}tjft	 dddd|f}|j
rV|dg7 }||||dtjd	ktjd
}| | \}}	| }
W dQ R X |
||	fS )a)  Run the given test in a subprocess with --worker-args.

    ns is the option Namespace parsed from command-line arguments. regrtest
    is invoked in a subprocess with the --worker-args argument; when the
    subprocess exits, its return code, stdout and stderr are returned as a
    3-tuple.
    r   )PopenPIPEz-uz-mztest.regrtestz--worker-argsz--pgoTnt)stdoutstderruniversal_newlines	close_fdscwdN)
subprocessr
   r   varsjsondumpssys
executabler   args_from_interpreter_flagspgoosnameSAVEDCWDcommunicatewait)testnamensr
   r   ns_dictworker_argscmdpopenr   r   retcode r&   _/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/libregrtest/runtest_mp.pyrun_test_in_subprocess   s&    



r(   c          
   C   s   t | \}}tjf |}t| yt||}W nR tk
rN   tdd f}Y n6 tk
r } zt	
  tt|f}W d d }~X Y nX t  tt |dd td d S )N T)flushr   )r   loadstypesSimpleNamespacer   r   KeyboardInterruptr   BaseException	traceback	print_excr   strprintr   r   exit)r"   r!   r   r    resulter&   r&   r'   run_tests_worker=   s    r7   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	MultiprocessIteratorz8A thread-safe iterator over tests for multiprocess mode.c             C   s   d| _ t | _|| _d S )NF)interrupted	threadingLocklocktests)selfr=   r&   r&   r'   __init__U   s    
zMultiprocessIterator.__init__c             C   s   | S )Nr&   )r>   r&   r&   r'   __iter__Z   s    zMultiprocessIterator.__iter__c          	   C   s*   | j  | jrtdt| jS Q R X d S )Nztests interrupted)r<   r9   StopIterationnextr=   )r>   r&   r&   r'   __next__]   s    zMultiprocessIterator.__next__N)__name__
__module____qualname____doc__r?   r@   rC   r&   r&   r&   r'   r8   Q   s   r8   c                   s,   e Zd Z fddZdd Zdd Z  ZS )MultiprocessThreadc                s,   t    || _|| _|| _d | _d | _d S )N)superr?   pendingoutputr    current_test
start_time)r>   rJ   rK   r    )	__class__r&   r'   r?   e   s    
zMultiprocessThread.__init__c             C   s  yt | j}W n  tk
r.   | jd dS X z&t | _|| _t	|| j
\}}}W d d | _X |dkrtd| d f}| j|| | |f dS | d\}}}|s| jd dS t|}t|dkstd|| j|| | |f dS )	N)NNNNTr   zExit code %sF
   zInvalid result tuple: )rB   rJ   rA   rK   puttime	monotonicrM   rL   r(   r    r   rstripstrip
rpartitionr   r+   lenAssertionError)r>   testr%   r   r   r5   _r&   r&   r'   _runtestm   s0    

zMultiprocessThread._runtestc             C   sB   yd}x|s|   }qW W n" tk
r<   | jd  Y nX d S )NF)NNNN)r[   r/   rK   rQ   )r>   stopr&   r&   r'   run   s    zMultiprocessThread.run)rD   rE   rF   r?   r[   r]   __classcell__r&   r&   )rN   r'   rH   d   s    rH   c                s  t   tjjj}|d k	} fddtjjD }tdt	|  x|D ]}|
  qVW dd }d}d}ttt}zyx|jjk r|rtj|dd	 y j|d
}	W nB t jk
r   ||}
|
rjjstdd|
 dd wY nX |	\}}}}|d kr |d7 }q|| |\}}}t||}|ttfkrt|tkrtjjst|dt| 7 }n|tkrd||f }||}
|
rjjs|dd|
 7 }|| |rt|dd |rjjst|tjdd |d tkrt|d7 }qW W n( tk
r:   d_d_t  Y nX W d |rNt  X t  }xdd |D }
t!t"t#|
}
|
s~P t  | }dd|
t	|
f }|t$krd||f }t|dd x|D ]}|t$ qW qZW d S )Nc                s   g | ]}t  jqS r&   )rH   r    ).0i)rK   rJ   regrtestr&   r'   
<listcomp>   s   z*run_tests_multiprocess.<locals>.<listcomp>z.Run tests in parallel using %s child processesc             S   sR   g }xH| D ]@}|j }|sq
t |j }|tkr
d|t|f }|| q
W |S )Nz%s (%s))rL   rR   rS   rM   r   r	   append)workersrunningworkerrL   dttextr&   r&   r'   get_running   s    
z+run_tests_multiprocess.<locals>.get_runningr      T)r4   )timeoutzrunning: %sz, )r*   z (%s)z%s (%s)z -- running: %s)filer*   c             S   s   g | ]
}|j qS r&   )rL   )r_   rf   r&   r&   r'   rb      s    zWaiting for %s (%s tests)z%s since %.0f sec)%queueQueuer8   r=   r    rk   rangeuse_mpr3   rW   startmaxPROGRESS_UPDATEr   faulthandlerdump_traceback_latergetEmptyr   joinaccumulate_resultr   r   r   r	   display_progressr   r   r.   r9   cancel_dump_traceback_laterrR   rS   listfilterboolWAIT_PROGRESS)ra   Ztest_timeoutuse_timeoutrd   rf   ri   finished
test_indexZget_timeoutitemre   rY   r   r   r5   ok	test_timexml_datarh   Z
wait_startrg   liner&   )rK   rJ   ra   r'   run_tests_multiprocess   s    











r   )rt   r   r   rm   r   r:   rR   r0   r,   rY   r   test.libregrtest.runtestr   r   r   r   r   test.libregrtest.setupr   test.libregrtest.utilsr	   rs   r   r(   r7   r8   ThreadrH   r   r&   r&   r&   r'   <module>   s&   #3