U
    .e++                     @   sB  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
 ze je  ZW n ek
rt   dZY nX ddddgZdd Zd	d
 Zdd Zdd ZefddZG dd dZG dd deZG dd deZe aedae a[eZi Z ej!" D ]0\Z#Z$e#dd dkrde#kre#e e$ < qe Z%dS )    N)WeakSetprocessBaseProcessProcesscurrent_processactive_childrenc                   C   s   t S )z@
    Return process object representing the current process
    )_current_process r
   r
   4/tmp/pip-unpacked-wheel-39f38r4u/billiard/process.pyr   #   s    c                 C   s   |  a t_ d S N)r	   _mprocr   r
   r
   r   _set_current_process*   s    r   c                  C   s*   t tD ]} | j d k	rt|  qd S r   )list	_children_popenpolldiscard)pr
   r
   r   _cleanup/   s    r   c              
   C   s,   z|    W n tttfk
r&   Y nX d S r   )flushAttributeErrorEnvironmentErrorNotImplementedError)fr
   r
   r   _maybe_flush6   s    r   c                 C   s,   z
|   W n t k
r"   g  Y S X ttS )zN
    Return list of process objects corresponding to live child processes
    )	TypeErrorr   r   )r   r
   r
   r   r   =   s
    

c                   @   s2  e Zd ZdZdd Zddddi dfddZdd	 Zd
d Zdd Zdd Z	dd Z
d5ddZdd Zdd Zedd Zejdd Zedd Zejdd Zedd Zejd d Zed!d" Zed#d$ ZeZed%d& Zed'd( Zed)d* Zed+d, Zed-d. Zed/d0 Zd1d2 Zd3d4 ZdS )6r   z
    Process objects represent activity that is run in a separate process

    The class is analogous to `threading.Thread`
    c                 C   s
   t  d S r   )r   selfr
   r
   r   _PopenP   s    zBaseProcess._PopenNr
   c           	      K   s   |d kst dtt}tj|f | _tj | _t | _	d | _
|| _t|| _t|| _|pt| jd ddd | jD  | _|d k	r|| _td k	rt|  d| _d S )Nz#group argument must be None for now-:c                 s   s   | ]}t |V  qd S r   )str).0ir
   r
   r   	<genexpr>`   s     z'BaseProcess.__init__.<locals>.<genexpr>F)AssertionErrornext_process_counterr	   	_identity_configcopyosgetpid_parent_pidr   _targettuple_argsdict_kwargstype__name__join_namedaemon	_danglingadd_controlled_termination)	r   grouptargetnameargskwargsr8   Z_kwcountr
   r
   r   __init__S   s$    



zBaseProcess.__init__c                 C   s   | j r| j | j| j dS )zQ
        Method to be run in sub-process; can be overridden in sub-class
        N)r/   r1   r3   r   r
   r
   r   runi   s    zBaseProcess.runc                 C   sR   | j dkstd| jt ks(tdt  | | | _ | j j| _t	
|  dS )z%
        Start child process
        Nzcannot start a process twicez:can only start a process object created by current process)r   r&   r.   r,   r-   r   r   sentinel	_sentinelr   r:   r   r
   r
   r   startp   s    
zBaseProcess.startc                 C   s   | j d k	r| j   d S r   )r   closer   r
   r
   r   rG   |   s    
zBaseProcess.closec                 C   s   | j   dS )zT
        Terminate process; sends SIGTERM signal or uses TerminateProcess()
        N)r   	terminater   r
   r
   r   rH      s    zBaseProcess.terminatec                 C   s   d| _ |   d S )NT)r;   rH   r   r
   r
   r   terminate_controlled   s    z BaseProcess.terminate_controlledc                 C   sR   | j t kstd| jdk	s(td| j|}|dk	rFt|  |   dS )z5
        Wait until child process terminates
        zcan only join a child processNzcan only join a started process)	r.   r,   r-   r&   r   waitr   r   rG   )r   timeoutresr
   r
   r   r6      s    
zBaseProcess.joinc                 C   sF   | t krdS | jt ks"td| jdkr0dS | j  | jjdkS )z1
        Return whether process is alive
        Tzcan only test a child processNF)r	   r.   r,   r-   r&   r   r   
returncoder   r
   r
   r   is_alive   s    

zBaseProcess.is_alivec                 C   s   | j d krdS | j  d kS )NFr   r   r   r
   r
   r   	_is_alive   s    
zBaseProcess._is_alivec                 C   s   | j S r   )r7   r   r
   r
   r   r>      s    zBaseProcess.namec                 C   s   t |tstd|| _d S )Nzname must be a string)
isinstancer"   r&   r7   )r   r>   r
   r
   r   r>      s    c                 C   s   | j ddS )z4
        Return whether process is a daemon
        r8   Fr*   getr   r
   r
   r   r8      s    zBaseProcess.daemonc                 C   s    | j dkstd|| jd< dS )z1
        Set whether process is a daemon
        Nzprocess has already startedr8   )r   r&   r*   )r   daemonicr
   r
   r   r8      s    c                 C   s
   | j d S )Nauthkey)r*   r   r
   r
   r   rU      s    zBaseProcess.authkeyc                 C   s   t || jd< dS )z2
        Set authorization key of process
        rU   N)AuthenticationStringr*   )r   rU   r
   r
   r   rU      s    c                 C   s   | j dkr| j S | j  S )zM
        Return exit code of process or `None` if it has yet to stop
        NrO   r   r
   r
   r   exitcode   s    
zBaseProcess.exitcodec                 C   s"   | t krt S | jo| jjS dS )zU
        Return identifier (PID) of process or `None` if it has yet to start
        N)r	   r,   r-   r   pidr   r
   r
   r   ident   s    zBaseProcess.identc                 C   s*   z| j W S  tk
r$   tdY nX dS )z{
        Return a file descriptor (Unix) or handle (Windows) suitable for
        waiting for process termination.
        zprocess not startedN)rE   r   
ValueErrorr   r
   r
   r   rD      s    zBaseProcess.sentinelc                 C   s   t S r   )r(   r   r
   r
   r   _counter   s    zBaseProcess._counterc                 C   s   t S r   )r   r   r
   r
   r   r      s    zBaseProcess._childrenc                 C   s   | j S r   )rU   r   r
   r
   r   _authkey   s    zBaseProcess._authkeyc                 C   s   | j S r   )r8   r   r
   r
   r   	_daemonic   s    zBaseProcess._daemonicc                 C   s   | j dS )NtempdirrR   r   r
   r
   r   _tempdir   s    zBaseProcess._tempdirc                 C   s   | t krd}n>| jt kr"d}n*| jd kr2d}n| j d k	rH| j}nd}t|tkrv|dkrfd}ndt	
|| }dt| j| j|| jrdpd	f S )
Nstartedunknowninitialr   stoppedzstopped[%s]z<%s(%s, %s%s)>z daemon )r	   r.   r,   r-   r   r   rW   r4   int_exitcode_to_namerS   r5   r7   r8   )r   statusr
   r
   r   __repr__  s"    
 zBaseProcess.__repr__c                 C   s6  ddl m}m} zz| j	d k	r.|
| j	 tdat atjd k	r~ztj  ttjt_W n tttfk
r|   Y nX t}t|  tjjj}t| }| d  |D ]2}|rt!|| tj"st#|j$D ]}|%  qqt&' t_(z|j)*  |+  W 5 ~X |d| j z| -  d}W 5 |,  X W n t.k
r }	 zn|	j/sVd}n\t!|	j/d t0rt|	j/d }n>tj1t2|	j/d d  ttj t!|	j/d t2rdnd}W 5 d }	~	X Y nF   d}|j3d| j4dd	sdd l5}
tj1d
| j4  |
6  Y nX W 5 |d| j| ttj ttj X |S )N   )utilcontextz#process %s exiting with exitcode %dz#child process %s calling self.run()r   
z
Process %sT)exc_infozProcess %s:
)7rd   rj   rk   inforX   r   sysstdoutstderrZ_start_methodZ_force_start_method	itertoolsrA   r(   setr   stdinrG   openr,   devnullr   OSErrorrZ   r	   r   loggingLoggermanager
loggerDictr   keysappendrQ   PlaceHolder	getLoggerhandlers
createLock	threadingRLock_lockZ_finalizer_registryclearZ_run_after_forkersZ_exit_functionrC   
SystemExitr?   re   writer"   errorr>   	traceback	print_exc)r   rj   rk   rW   Zold_processr{   Zlogger_namesr>   handlerexcr   r
   r
   r   
_bootstrap  sl    








* 
zBaseProcess._bootstrap)N)r5   
__module____qualname____doc__r   rB   rC   rF   rG   rH   rI   r6   rN   rP   propertyr>   setterr8   rU   rW   rY   rX   rD   r[   r   r\   r]   r_   rh   r   r
   r
   r
   r   r   I   s\     









	






c                   @   s   e Zd Zdd ZdS )rV   c                 C   s,   ddl m} | d krtdtt| ffS )Nri   )get_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)rk   r   r   rV   bytes)r   r   r
   r
   r   
__reduce__e  s    
zAuthenticationString.__reduce__N)r5   r   r   r   r
   r
   r
   r   rV   c  s   rV   c                   @   s   e Zd Zdd ZdS )_MainProcessc                 C   s2   d| _ d| _d | _d | _ttddd| _d S )Nr
   MainProcess    z/mp)rU   Z	semprefix)r)   r7   r.   r   rV   r,   urandomr*   r   r
   r
   r   rB   u  s    z_MainProcess.__init__N)r5   r   r   rB   r
   r
   r
   r   r   s  s   r   ri      ZSIG_)&r,   ro   signalrr   rx   r   _weakrefsetr   multiprocessingr   r   pathabspathgetcwdZORIGINAL_DIRrw   __all__r   r   r   r   r   r   r   rV   r   r	   rA   r(   rs   r   r   rf   __dict__itemsr>   signumr9   r
   r
   r
   r   <module>   s@   
  

