
][\#                 @   sy  d  d d g Z  d d l Z d d l Z d d l Z d d l Z d d l m Z y e j j e j	    Z
 Wn e k
 r d Z
 Yn Xd d   Z d d   Z d d	   Z Gd
 d    d  e  Z Gd d   d e  Z Gd d   d e  Z e   a e j d  a e   a [ i  Z xS e e j j    D]< \ Z Z e d d  d k r,d e k r,e e e <q,q,We   Z d S)BaseProcesscurrent_processactive_children    N)WeakSetc               C   s   t  S)z@
    Return process object representing the current process
    )_current_process r   r   -/usr/lib/python3.4/multiprocessing/process.pyr   #   s    c               C   s   t    t t  S)zN
    Return list of process objects corresponding to live child processes
    )_cleanuplist	_childrenr   r   r   r   r   )   s    c              C   s@   x9 t  t  D]+ }  |  j j   d  k	 r t j |   q q Wd  S)N)r
   r   _popenpolldiscard)pr   r   r   r	   4   s    r	   c            	   @   sK  e  Z d  Z d Z d d   Z d d d f  i  d d d d Z d d	   Z d
 d   Z d d   Z d 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 d! d"   Z d# d$   Z d S)%r   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)N)NotImplementedError)selfr   r   r   _PopenD   s    zBaseProcess._PopenNdaemonc            C   s   | d  k s t  d   t t  } t j | f |  _ t j j   |  _ t j   |  _	 d  |  _
 | |  _ t |  |  _ t |  |  _ | p t |   j d d j d d   |  j D  |  _ | d  k	 r | |  _ n  t j |   d  S)Nz#group argument must be None for now-:c             s   s   |  ] } t  |  Vq d  S)N)str).0ir   r   r   	<genexpr>S   s    z'BaseProcess.__init__.<locals>.<genexpr>)AssertionErrornext_process_counterr   	_identity_configcopyosgetpid_parent_pidr   _targettuple_argsdict_kwargstype__name__join_namer   	_danglingadd)r   grouptargetnameargskwargsr   countr   r   r   __init__G   s    		#zBaseProcess.__init__c             C   s&   |  j  r" |  j  |  j |  j   n  d S)zQ
        Method to be run in sub-process; can be overridden in sub-class
        N)r#   r%   r'   )r   r   r   r   runX   s    	zBaseProcess.runc             C   s   |  j  d k s t d   |  j t j   k s< t d   t j j d  s[ t d   t   |  j	 |   |  _  |  j  j
 |  _ t j |   d S)z%
        Start child process
        Nzcannot start a process twicez:can only start a process object created by current processr   z3daemonic processes are not allowed to have children)r   r   r"   r    r!   r   r   getr	   r   sentinel	_sentinelr   r-   )r   r   r   r   start_   s    		zBaseProcess.startc             C   s   |  j  j   d S)zT
        Terminate process; sends SIGTERM signal or uses TerminateProcess()
        N)r   	terminate)r   r   r   r   r:   m   s    zBaseProcess.terminatec             C   sn   |  j  t j   k s! t d   |  j d k	 s< t d   |  j j |  } | d k	 rj t j |   n  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   )r   ZtimeoutZresr   r   r   r*   s   s
    !zBaseProcess.joinc             C   sa   |  t  k r d S|  j t j   k s1 t d   |  j d k rD d S|  j 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   
returncode)r   r   r   r   is_alive}   s    !zBaseProcess.is_alivec             C   s   |  j  S)N)r+   )r   r   r   r   r0      s    zBaseProcess.namec             C   s(   t  | t  s t d   | |  _ d  S)Nzname must be a string)
isinstancer   r   r+   )r   r0   r   r   r   r0      s    c             C   s   |  j  j d d  S)z4
        Return whether process is a daemon
        r   F)r   r6   )r   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   Zdaemonicr   r   r   r      s    c             C   s   |  j  d S)Nauthkey)r   )r   r   r   r   r?      s    zBaseProcess.authkeyc             C   s   t  |  |  j d <d S)z2
        Set authorization key of process
        r?   N)AuthenticationStringr   )r   r?   r   r   r   r?      s    c             C   s#   |  j  d k r |  j  S|  j  j   S)zM
        Return exit code of process or `None` if it has yet to stop
        N)r   r   )r   r   r   r   exitcode   s    zBaseProcess.exitcodec             C   s-   |  t  k r t j   S|  j o( |  j j Sd S)zU
        Return identifier (PID) of process or `None` if it has yet to start
        N)r   r    r!   r   pid)r   r   r   r   ident   s    
zBaseProcess.identc             C   s0   y |  j  SWn t k
 r+ t d   Yn Xd S)z{
        Return a file descriptor (Unix) or handle (Windows) suitable for
        waiting for process termination.
        zprocess not startedN)r8   AttributeError
ValueError)r   r   r   r   r7      s    zBaseProcess.sentinelc             C   s   |  t  k r d } n] |  j t j   k r3 d } n? |  j d  k rK d } n' |  j j   d  k	 rl |  j } n d } t |  t k r | d k r d } q d t	 j
 | |  } n  d t |   j |  j | |  j r d p d	 f S)
NZstartedunknowninitialr   Zstoppedzstopped[%s]z<%s(%s, %s%s)>z daemon )r   r"   r    r!   r   r   rA   r(   int_exitcode_to_namer6   r)   r+   r   )r   Zstatusr   r   r   __repr__   s    				zBaseProcess.__repr__c          (   C   s  d d l  m } m } zy |  j d  k	 r> | j |  j  n  t j d  a t   a	 t
 j d  k	 r y# t
 j j   t t j  t
 _ Wq t t f k
 r Yq Xn  t } |  a z | j j   | j   Wd  ~ X| j d  z |  j   d } Wd  | j   XWn t k
 r} zd | j s+d } nM t | j d t  rQ| j d } n' t
 j j t | j d  d  d } WYd  d  } ~ Xn; d } d d  l  } t
 j j d |  j!  | j"   Yn XWd  | j d |  t
 j# j$   t
 j j$   X| S)N   )utilcontextz child process calling self.run()r   
zProcess %s:
z process exiting with exitcode %d)%rH   rM   rN   Z_start_methodZ_force_start_method	itertoolsr3   r   setr   sysstdincloseopenr    devnullOSErrorrE   r   Z_finalizer_registryclearZ_run_after_forkersinfor5   Z_exit_function
SystemExitr1   r>   rI   stderrwriter   	tracebackr0   	print_excstdoutflush)r   rM   rN   Zold_processrA   er]   r   r   r   
_bootstrap   sN    	

		!zBaseProcess._bootstrap)r)   
__module____qualname____doc__r   r4   r5   r9   r:   r*   r=   propertyr0   setterr   r?   rA   rC   rB   r7   rK   rb   r   r   r   r   r   >   s*   
	
c               @   s   e  Z d  Z d d   Z d S)r@   c             C   sA   d d l  m } |   d  k r. t d   n  t t |   f f S)NrL   )get_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)rN   rh   	TypeErrorr@   bytes)r   rh   r   r   r   
__reduce__  s
    zAuthenticationString.__reduce__N)r)   rc   rd   rk   r   r   r   r   r@     s   r@   c               @   s   e  Z d  Z d d   Z d S)_MainProcessc             C   sN   f  |  _  d |  _ d  |  _ d  |  _ i t t j d   d 6d d 6|  _ d  S)NZMainProcess    r?   z/mpZ	semprefix)r   r+   r"   r   r@   r    urandomr   )r   r   r   r   r4   *  s    				z_MainProcess.__init__N)r)   rc   rd   r4   r   r   r   r   rl   (  s   rl   rL      ZSIG_) __all__r    rR   signalrP   _weakrefsetr   pathabspathgetcwdZORIGINAL_DIRrW   r   r   r	   objectr   rj   r@   rl   r   r3   r   rQ   r   rJ   r
   __dict__itemsr0   Zsignumr,   r   r   r   r   <module>
   s0   
		""