U
    d+                     @   s`  d dl m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 ddlmZmZ zeje ZW n ek
r   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e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ej'D ]0\Z(Z)e(dd dkr$de(kr$e(e&e) < q$e	 Z*dS )    )absolute_importN)WeakSetprocess   )itemsstring_t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-lulkwrw3/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   _cleanup3   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_flush:   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   A   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 analagous to `threading.Thread`
    c                 C   s
   t  d S r   )r   selfr   r   r   _PopenT   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>d   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kwargsr<   Z_kwcountr   r   r   __init__W   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)r3   r5   r7   r!   r   r   r   runm   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*   r2   r0   r1   r   r#   sentinel	_sentinelr   r>   r!   r   r   r   startt   s    
zBaseProcess.startc                 C   s   | j d k	r| j   d S r   )r   closer!   r   r   r   rK      s    
zBaseProcess.closec                 C   s   | j   dS )zT
        Terminate process; sends SIGTERM signal or uses TerminateProcess()
        N)r   	terminater!   r   r   r   rL      s    zBaseProcess.terminatec                 C   s   d| _ |   d S )NT)r?   rL   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)	r2   r0   r1   r*   r   waitr   r   rK   )r"   timeoutresr   r   r   r:      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   r2   r0   r1   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   )r;   r!   r   r   r   rB      s    zBaseProcess.namec                 C   s   t |tstd|| _d S )Nzname must be a string)
isinstancer   r*   r;   )r"   rB   r   r   r   rB      s    c                 C   s   | j ddS )z4
        Return whether process is a daemon
        r<   Fr.   getr!   r   r   r   r<      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 startedr<   )r   r*   r.   )r"   daemonicr   r   r   r<      s    c                 C   s
   | j d S )Nauthkey)r.   r!   r   r   r   rY      s    zBaseProcess.authkeyc                 C   s   t || jd< dS )z2
        Set authorization key of process
        rY   N)AuthenticationStringr.   )r"   rY   r   r   r   rY      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
        NrS   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   r0   r1   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)rI   r   
ValueErrorr!   r   r   r   rH      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   )rY   r!   r   r   r   _authkey   s    zBaseProcess._authkeyc                 C   s   | j S r   )r<   r!   r   r   r   	_daemonic   s    zBaseProcess._daemonicc                 C   s   | j dS )NtempdirrV   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   r2   r0   r1   r   r   r[   r8   int_exitcode_to_namerW   r9   r;   r<   )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 )Nr   )utilcontextz#process %s exiting with exitcode %dz#child process %s calling self.run()r   
z
Process %sT)exc_infozProcess %s:
)7rh   rm   rn   infor\   r   sysstdoutstderrZ_start_methodZ_force_start_method	itertoolsrE   r,   setr   stdinrK   openr0   devnullr   OSErrorr^   r   r   loggingLoggermanager
loggerDictr   keysappendrU   PlaceHolder	getLoggerhandlers
createLock	threadingRLock_lockZ_finalizer_registryclearZ_run_after_forkersZ_exit_functionrG   
SystemExitrC   ri   writer&   errorrB   	traceback	print_exc)r"   rm   rn   r[   Zold_processr~   Zlogger_namesrB   handlerexcr   r   r   r   
_bootstrap  sl    








* 
zBaseProcess._bootstrap)N)r9   
__module____qualname____doc__r#   rF   rG   rJ   rK   rL   rM   r:   rR   rT   propertyrB   setterr<   rY   r[   r]   r\   rH   r_   r   r`   ra   rc   rl   r   r   r   r   r   r	   M   s\     









	






c                   @   s   e Zd Zdd ZdS )rZ   c                 C   s,   ddl m} | d krtdtt| ffS )Nr   )get_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)rn   r   r    rZ   bytes)r"   r   r   r   r   
__reduce__i  s    
zAuthenticationString.__reduce__N)r9   r   r   r   r   r   r   r   rZ   g  s   rZ   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)rY   Z	semprefix)r-   r;   r2   r   rZ   r0   urandomr.   r!   r   r   r   rF   y  s    z_MainProcess.__init__N)r9   r   r   rF   r   r   r   r   r   w  s   r      ZSIG_)+
__future__r   r0   rr   signalru   r{   r   _weakrefsetr   multiprocessingr   r   Zfiver   r   pathabspathgetcwdZORIGINAL_DIRrz   __all__r   r   r   r   r   objectr	   r   rZ   r   r   rE   r,   rv   r   r
   rj   __dict__rB   signumr=   r   r   r   r   <module>	   sD   
  

