<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>

]                 @   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 d d l	 m Z d d l	 m Z d d l	 m Z d d l	 m Z d d	 l	 m Z d d
 l	 m Z d d l	 m Z d d l	 m Z d d l m Z d d l m Z d d d d d g Z e j d k r\e d   d d   Z y e j Z Wn e k
 rd d   Z Yn XGd d   d e j  Z e  e d  rd d   Z! n d  d l" Z" d d   Z! Gd  d!   d! e j#  Z$ Gd" d#   d# e j% e j&  Z' e  e d$  r8e j( Z) n d  d l" Z" d% d&   Z) Gd' d(   d( e j*  Z+ Gd) d   d  Z, Gd* d+   d+ e,  Z- Gd, d   d e-  Z. Gd- d   d e-  Z/ Gd. d/   d/ e j0  Z1 e Z2 e1 Z3 d S)0    N   )base_events)base_subprocess)compat)	constants)
coroutines)events)futures)selector_events)	selectors)
transports)	coroutine)loggerSelectorEventLoopAbstractChildWatcherSafeChildWatcherFastChildWatcherDefaultEventLoopPolicywin32z+Signals are not really supported on Windowsc             C   s   d  S)N )signumframer   r   0/opt/alt/python35/lib64/python3.5/unix_events.py_sighandler_noop%   s    r   c             C   s   |  S)Nr   )pathr   r   r   <lambda>.   s    r   c            
       s  e  Z d  Z d   f d d  Z d d   Z   f d d   Z d d	   Z d
 d   Z d d   Z d d   Z	 d d   Z
 d d d d  Z d d d d  Z e d d d   Z d d   Z e d d d d d d d d   Z e d d d d d  d d d! d"  Z   S)#_UnixSelectorEventLoopNc                s   t    j |  i  |  _ d  S)N)super__init___signal_handlers)selfselector)	__class__r   r   r   7   s    z_UnixSelectorEventLoop.__init__c             C   s
   t  j   S)N)socket
socketpair)r    r   r   r   _socketpair;   s    z"_UnixSelectorEventLoop._socketpairc                s8   t    j   x$ t |  j  D] } |  j |  q Wd  S)N)r   closelistr   remove_signal_handler)r    sig)r"   r   r   r&   >   s    z_UnixSelectorEventLoop.closec             C   s+   x$ | D] } | s q |  j  |  q Wd  S)N)_handle_signal)r    datar   r   r   r   _process_self_dataC   s    z)_UnixSelectorEventLoop._process_self_datac          +   G   s  t  j |  s t  j |  r* t d   |  j |  |  j   y t j |  j j	    Wn= t
 t f k
 r } z t t |    WYd  d  } ~ Xn Xt j | | |   } | |  j | <y$ t j | t  t j | d  Wn t k
 r} z |  j | =|  j sXy t j d  Wn; t
 t f k
 rW} z t j d |  WYd  d  } ~ Xn X| j t j k rt d j |    n   WYd  d  } ~ Xn Xd  S)Nz3coroutines cannot be used with add_signal_handler()Fr   zset_wakeup_fd(-1) failed: %szsig {} cannot be caught)r   ZiscoroutineZiscoroutinefunction	TypeError_check_signal_check_closedsignalset_wakeup_fdZ_csockfileno
ValueErrorOSErrorRuntimeErrorstrr   ZHandler   r   siginterruptr   infoerrnoEINVALformat)r    r)   callbackargsexchandleZnexcr   r   r   add_signal_handlerJ   s0    
%
	#z)_UnixSelectorEventLoop.add_signal_handlerc             C   sL   |  j  j |  } | d  k r" d  S| j r; |  j |  n |  j |  d  S)N)r   getZ
_cancelledr(   Z_add_callback_signalsafe)r    r)   r@   r   r   r   r*   w   s    	z%_UnixSelectorEventLoop._handle_signalc          &   C   s  |  j  |  y |  j | =Wn t k
 r3 d SYn X| t j k rO t j } n	 t j } y t j | |  WnR t k
 r } z2 | j t j	 k r t
 d j |    n   WYd  d  } ~ Xn X|  j sy t j d  Wn; t t f k
 r} z t j d |  WYd  d  } ~ Xn Xd S)NFzsig {} cannot be caughtr   zset_wakeup_fd(-1) failed: %sTr-   )r/   r   KeyErrorr1   SIGINTdefault_int_handlerSIG_DFLr5   r:   r;   r6   r<   r2   r4   r   r9   )r    r)   handlerr?   r   r   r   r(      s(    			#z,_UnixSelectorEventLoop.remove_signal_handlerc             C   sb   t  | t  s$ t d j |    d | k o> t j k  n s^ t d j | t j    d  S)Nzsig must be an int, not {!r}r   zsig {} out of range(1, {}))
isinstanceintr.   r<   r1   NSIGr4   )r    r)   r   r   r   r/      s
    z$_UnixSelectorEventLoop._check_signalc             C   s   t  |  | | | |  S)N)_UnixReadPipeTransport)r    pipeprotocolwaiterextrar   r   r   _make_read_pipe_transport   s    z0_UnixSelectorEventLoop._make_read_pipe_transportc             C   s   t  |  | | | |  S)N)_UnixWritePipeTransport)r    rL   rM   rN   rO   r   r   r   _make_write_pipe_transport   s    z1_UnixSelectorEventLoop._make_write_pipe_transportc	             k   s   t  j    }
 |  j   } t |  | | | | | | | d | d | |	 } |
 j | j   |  j |  y | Ed  HWn+ t k
 r } z | } WYd  d  } ~ Xn Xd  } | d  k	 r | j   | j	   Ed  H|  Wd  QRX| S)NrN   rO   )
r   get_child_watcherZcreate_future_UnixSubprocessTransportadd_child_handlerZget_pid_child_watcher_callback	Exceptionr&   _wait)r    rM   r>   shellstdinstdoutstderrbufsizerO   kwargswatcherrN   transpr?   errr   r   r   _make_subprocess_transport   s$    		
z1_UnixSelectorEventLoop._make_subprocess_transportc             C   s   |  j  | j |  d  S)N)Zcall_soon_threadsafeZ_process_exited)r    pid
returncoder`   r   r   r   rV      s    z._UnixSelectorEventLoop._child_watcher_callbacksslsockserver_hostnamec            c   sB  | r! | d  k r9 t  d   n | d  k	 r9 t  d   | d  k	 r | d  k	 r] t  d   t j t j t j d  } y& | j d  |  j | |  Ed  HWq| j     YqXn\ | d  k r t  d   | j t j k s t j	 |  rt  d j
 |    | j d  |  j | | | |  Ed  H\ } } | | f S)Nz/you have to pass server_hostname when using sslz+server_hostname is only meaningful with sslz3path and sock can not be specified at the same timer   Fzno path and sock were specifiedz2A UNIX Domain Stream Socket was expected, got {!r})r4   r#   AF_UNIXSOCK_STREAMsetblockingZsock_connectr&   familyr   _is_stream_socketr<   Z_create_connection_transport)r    protocol_factoryr   re   rf   rg   	transportrM   r   r   r   create_unix_connection   s8    	
z-_UnixSelectorEventLoop.create_unix_connectionbacklogd   c      
   !   C   s  t  | t  r t d   | d  k	 r| d  k	 r? t d   t |  } t j t j t j  } | d d
 k r y, t j	 t
 j |  j  r t
 j |  WnI t k
 r Yn8 t k
 r } z t j d | |  WYd  d  } ~ Xn Xy | j |  Wqt k
 ri} zK | j   | j t j k rTd j |  } t t j |  d   n   WYd  d  } ~ Xq| j     YqXnO | d  k rt d   | j t j k st j |  rt d j |    t j |  | g  }	 | j |  | j d	  |  j | | | |	  |	 S)Nz*ssl argument must be an SSLContext or Nonez3path and sock can not be specified at the same timer    z2Unable to check or remove stale UNIX socket %r: %rzAddress {!r} is already in usez-path was not specified, and no sock specifiedz2A UNIX Domain Stream Socket was expected, got {!r}F)r   rr   )rH   boolr.   r4   _fspathr#   rh   ri   statS_ISSOCKosst_moderemoveFileNotFoundErrorr5   r   errorbindr&   r:   Z
EADDRINUSEr<   rk   r   rl   ZServerlistenrj   Z_start_serving)
r    rm   r   rf   rp   re   ra   r?   msgZserverr   r   r   create_unix_server   sP    	&

	z)_UnixSelectorEventLoop.create_unix_server)__name__
__module____qualname__r   r%   r&   r,   rA   r*   r(   r/   rP   rR   r   rb   rV   ro   r   r   r   )r"   r   r   1   s*   -
 %r   set_blockingc             C   s   t  j |  d  d  S)NF)rw   r   )fdr   r   r   _set_nonblocking9  s    r   c             C   s<   t  j  |  t  j  } | t j B} t  j  |  t  j |  d  S)N)fcntlZF_GETFLrw   
O_NONBLOCKZF_SETFL)r   flagsr   r   r   r   >  s    c                   s   e  Z d  Z d Z d d   f d d  Z d d   Z d d	   Z d
 d   Z d d   Z d d   Z	 d d   Z
 d d   Z d d   Z e j r d d   Z d d d  Z d d   Z d d   Z   S) rK      i   Nc                s*  t    j |  | |  j d <| |  _ | |  _ | j   |  _ | |  _ d |  _ t	 j
 |  j  j } t j |  p t j |  p t j |  s d  |  _ d  |  _ d  |  _ t d   t |  j  |  j j |  j j |   |  j j |  j j |  j |  j  | d  k	 r&|  j j t j | d   d  S)NrL   Fz)Pipe transport is for pipes/sockets only.)r   r   _extra_loop_piper3   _fileno	_protocol_closingrw   fstatrx   ru   S_ISFIFOrv   S_ISCHRr4   r   	call_soonconnection_made_add_reader_read_readyr	   _set_result_unless_cancelled)r    looprL   rM   rN   rO   mode)r"   r   r   r   H  s,    							z_UnixReadPipeTransport.__init__c             C   s  |  j  j g } |  j d  k r. | j d  n |  j rD | j d  | j d |  j  t |  j d d   } |  j d  k	 r | d  k	 r t j	 | |  j t
 j  } | r | j d  q | j d  n, |  j d  k	 r | j d  n | j d  d d	 j |  S)
Nclosedclosingzfd=%s	_selectorpollingidleopenz<%s> )r"   r   r   appendr   r   getattrr   r
   _test_selector_eventr   
EVENT_READjoin)r    r9   r!   r   r   r   r   __repr__e  s$    	z_UnixReadPipeTransport.__repr__c             C   s   y t  j |  j |  j  } WnL t t f k
 r6 Yn t k
 rj } z |  j | d  WYd  d  } ~ Xn X| r |  j j	 |  ng |  j
 j   r t j d |   d |  _ |  j
 j |  j  |  j
 j |  j j  |  j
 j |  j d   d  S)Nz"Fatal read error on pipe transportz%r was closed by peerT)rw   readr   max_sizeBlockingIOErrorInterruptedErrorr5   _fatal_errorr   Zdata_receivedr   	get_debugr   r9   r   _remove_readerr   Zeof_received_call_connection_lost)r    r+   r?   r   r   r   r   {  s    #	z"_UnixReadPipeTransport._read_readyc             C   s   |  j  j |  j  d  S)N)r   r   r   )r    r   r   r   pause_reading  s    z$_UnixReadPipeTransport.pause_readingc             C   s   |  j  j |  j |  j  d  S)N)r   r   r   r   )r    r   r   r   resume_reading  s    z%_UnixReadPipeTransport.resume_readingc             C   s   | |  _  d  S)N)r   )r    rM   r   r   r   set_protocol  s    z#_UnixReadPipeTransport.set_protocolc             C   s   |  j  S)N)r   )r    r   r   r   get_protocol  s    z#_UnixReadPipeTransport.get_protocolc             C   s   |  j  S)N)r   )r    r   r   r   
is_closing  s    z!_UnixReadPipeTransport.is_closingc             C   s   |  j  s |  j d   d  S)N)r   _close)r    r   r   r   r&     s    	z_UnixReadPipeTransport.closec             C   s4   |  j  d  k	 r0 t j d |  t  |  j  j   d  S)Nzunclosed transport %r)r   warningswarnResourceWarningr&   )r    r   r   r   __del__  s    z_UnixReadPipeTransport.__del__zFatal error on pipe transportc          	   C   s   t  | t  rL | j t j k rL |  j j   rw t j d |  | d d n+ |  j j d | d | d |  d |  j	 i  |  j
 |  d  S)Nz%r: %sexc_infoTmessage	exceptionrn   rM   )rH   r5   r:   ZEIOr   r   r   debugcall_exception_handlerr   r   )r    r?   r   r   r   r   r     s    !	z#_UnixReadPipeTransport._fatal_errorc             C   s6   d |  _  |  j j |  j  |  j j |  j |  d  S)NT)r   r   r   r   r   r   )r    r?   r   r   r   r     s    	z_UnixReadPipeTransport._closec             C   sD   z |  j  j |  Wd  |  j j   d  |  _ d  |  _  d  |  _ Xd  S)N)r   connection_lostr   r&   r   )r    r?   r   r   r   r     s    		z,_UnixReadPipeTransport._call_connection_losti   )r   r   r   r   r   r   r   r   r   r   r   r   r&   r   PY34r   r   r   r   r   r   )r"   r   rK   D  s   	rK   c                   s   e  Z d  Z d d   f d d  Z d d   Z d d   Z d d	   Z d
 d   Z d d   Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z e j r d d   Z d d   Z d d d   Z d d! d"  Z d# d$   Z   S)%rQ   Nc       
         sj  t    j | |  | |  j d <| |  _ | j   |  _ | |  _ t   |  _ d |  _	 d |  _
 t j |  j  j } t j |  } t j |  } t j |  }	 | p | p |	 s d  |  _ d  |  _ d  |  _ t d   t |  j  |  j j |  j j |   |	 s| rAt j j d  rA|  j j |  j j |  j |  j  | d  k	 rf|  j j t j | d   d  S)NrL   r   Fz?Pipe transport is only for pipes, sockets and character devicesaix)r   r   r   r   r3   r   r   	bytearray_buffer
_conn_lostr   rw   r   rx   ru   r   r   rv   r4   r   r   r   r   sysplatform
startswithr   r   r	   r   )
r    r   rL   rM   rN   rO   r   Zis_charZis_fifoZ	is_socket)r"   r   r   r     s2    							z _UnixWritePipeTransport.__init__c             C   s#  |  j  j g } |  j d  k r. | j d  n |  j rD | j d  | j d |  j  t |  j d d   } |  j d  k	 r | d  k	 r t j	 | |  j t
 j  } | r | j d  n | j d  |  j   } | j d |  n, |  j d  k	 r| j d  n | j d  d	 d
 j |  S)Nr   r   zfd=%sr   r   r   z
bufsize=%sr   z<%s>r   )r"   r   r   r   r   r   r   r   r
   r   r   EVENT_WRITEget_write_buffer_sizer   )r    r9   r!   r   r]   r   r   r   r     s(    	z _UnixWritePipeTransport.__repr__c             C   s   t  |  j  S)N)lenr   )r    r   r   r   r     s    z-_UnixWritePipeTransport.get_write_buffer_sizec             C   sI   |  j  j   r t j d |   |  j r; |  j t    n
 |  j   d  S)Nz%r was closed by peer)r   r   r   r9   r   r   BrokenPipeError)r    r   r   r   r   
  s
    	z#_UnixWritePipeTransport._read_readyc             C   sa  t  | t  r t |  } | s% d  S|  j s7 |  j ri |  j t j k rV t j d  |  j d 7_ d  S|  j	 sDy t
 j |  j |  } Wne t t f k
 r d } YnH t k
 r } z( |  j d 7_ |  j | d  d  SWYd  d  } ~ Xn X| t |  k r	d  S| d k r+t |  | d   } |  j j |  j |  j  |  j	 | 7_	 |  j   d  S)Nz=pipe closed by peer or os.write(pipe, data) raised exception.r   r   z#Fatal write error on pipe transport)rH   r   
memoryviewr   r   r   Z!LOG_THRESHOLD_FOR_CONNLOST_WRITESr   warningr   rw   writer   r   r   rW   r   r   r   Z_add_writer_write_readyZ_maybe_pause_protocol)r    r+   nr?   r   r   r   r     s2    	
z_UnixWritePipeTransport.writec             C   s&  y t  j |  j |  j  } Wn{ t t f k
 r6 Yn t k
 r } zD |  j j   |  j d 7_ |  j	 j
 |  j  |  j | d  WYd  d  } ~ Xn X| t |  j  k r|  j j   |  j	 j
 |  j  |  j   |  j r|  j	 j |  j  |  j d   d  S| d k r"|  j d  |  =d  S)Nr   z#Fatal write error on pipe transportr   )rw   r   r   r   r   r   rW   clearr   r   _remove_writerr   r   Z_maybe_resume_protocolr   r   r   )r    r   r?   r   r   r   r   4  s&    #
	z$_UnixWritePipeTransport._write_readyc             C   s   d S)NTr   )r    r   r   r   can_write_eofN  s    z%_UnixWritePipeTransport.can_write_eofc             C   sL   |  j  r d  Sd |  _  |  j sH |  j j |  j  |  j j |  j d   d  S)NT)r   r   r   r   r   r   r   )r    r   r   r   	write_eofQ  s    			z!_UnixWritePipeTransport.write_eofc             C   s   | |  _  d  S)N)r   )r    rM   r   r   r   r   Z  s    z$_UnixWritePipeTransport.set_protocolc             C   s   |  j  S)N)r   )r    r   r   r   r   ]  s    z$_UnixWritePipeTransport.get_protocolc             C   s   |  j  S)N)r   )r    r   r   r   r   `  s    z"_UnixWritePipeTransport.is_closingc             C   s'   |  j  d  k	 r# |  j r# |  j   d  S)N)r   r   r   )r    r   r   r   r&   c  s    z_UnixWritePipeTransport.closec             C   s4   |  j  d  k	 r0 t j d |  t  |  j  j   d  S)Nzunclosed transport %r)r   r   r   r   r&   )r    r   r   r   r   l  s    z_UnixWritePipeTransport.__del__c             C   s   |  j  d   d  S)N)r   )r    r   r   r   abortq  s    z_UnixWritePipeTransport.abortzFatal error on pipe transportc          	   C   sy   t  | t j  r= |  j j   rh t j d |  | d d n+ |  j j d | d | d |  d |  j i  |  j	 |  d  S)Nz%r: %sr   Tr   r   rn   rM   )
rH   r   Z_FATAL_ERROR_IGNOREr   r   r   r   r   r   r   )r    r?   r   r   r   r   r   t  s    	z$_UnixWritePipeTransport._fatal_errorc             C   s_   d |  _  |  j r% |  j j |  j  |  j j   |  j j |  j  |  j j |  j |  d  S)NT)	r   r   r   r   r   r   r   r   r   )r    r?   r   r   r   r     s    		z_UnixWritePipeTransport._closec             C   sD   z |  j  j |  Wd  |  j j   d  |  _ d  |  _  d  |  _ Xd  S)N)r   r   r   r&   r   )r    r?   r   r   r   r     s    		z-_UnixWritePipeTransport._call_connection_lost)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&   r   r   r   r   r   r   r   r   r   )r"   r   rQ     s$   %	!		rQ   set_inheritablec             C   si   t  t d d  } t j |  t j  } | sJ t j |  t j | | B n t j |  t j | | @ d  S)NZ
FD_CLOEXECr   )r   r   ZF_GETFDZF_SETFD)r   inheritableZcloexec_flagoldr   r   r   _set_inheritable  s
    r   c               @   s   e  Z d  Z d d   Z d S)rT   c       	      K   s   d  } | t  j k r= |  j j   \ } } t | j   d  t  j | d | d | d | d | d d d | | |  _ | d  k	 r | j   t	 | j
   d d	 | |  j _ d  S)
NFrY   rZ   r[   r\   universal_newlinesr]   wb	buffering)
subprocessPIPEr   r%   r   r3   Popen_procr&   r   detachrZ   )	r    r>   rY   rZ   r[   r\   r]   r^   Zstdin_wr   r   r   _start  s    
z_UnixSubprocessTransport._startN)r   r   r   r   r   r   r   r   rT     s   rT   c               @   sX   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z d S)r   c             G   s   t     d  S)N)NotImplementedError)r    rc   r=   r>   r   r   r   rU     s    	z&AbstractChildWatcher.add_child_handlerc             C   s   t     d  S)N)r   )r    rc   r   r   r   remove_child_handler  s    z)AbstractChildWatcher.remove_child_handlerc             C   s   t     d  S)N)r   )r    r   r   r   r   attach_loop  s    z AbstractChildWatcher.attach_loopc             C   s   t     d  S)N)r   )r    r   r   r   r&     s    zAbstractChildWatcher.closec             C   s   t     d  S)N)r   )r    r   r   r   	__enter__  s    zAbstractChildWatcher.__enter__c             C   s   t     d  S)N)r   )r    abcr   r   r   __exit__  s    zAbstractChildWatcher.__exit__N)	r   r   r   rU   r   r   r&   r   r   r   r   r   r   r     s   
c               @   sd   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z	 d S)BaseChildWatcherc             C   s   d  |  _  i  |  _ d  S)N)r   
_callbacks)r    r   r   r   r     s    	zBaseChildWatcher.__init__c             C   s   |  j  d   d  S)N)r   )r    r   r   r   r&   	  s    zBaseChildWatcher.closec             C   s   t     d  S)N)r   )r    expected_pidr   r   r   _do_waitpid  s    zBaseChildWatcher._do_waitpidc             C   s   t     d  S)N)r   )r    r   r   r   _do_waitpid_all  s    z BaseChildWatcher._do_waitpid_allc             C   s   |  j  d  k	 r4 | d  k r4 |  j r4 t j d t  |  j  d  k	 rV |  j  j t j  | |  _  | d  k	 r | j t j |  j	  |  j
   d  S)NzCA loop is being detached from a child watcher with pending handlers)r   r   r   r   RuntimeWarningr(   r1   SIGCHLDrA   	_sig_chldr   )r    r   r   r   r   r     s    $	zBaseChildWatcher.attach_loopc             C   sV   y |  j    WnA t k
 rQ } z! |  j j d d d | i  WYd  d  } ~ Xn Xd  S)Nr   z$Unknown exception in SIGCHLD handlerr   )r   rW   r   r   )r    r?   r   r   r   r   &  s    	zBaseChildWatcher._sig_chldc             C   sA   t  j |  r t  j |  St  j |  r9 t  j |  S| Sd  S)N)rw   WIFSIGNALEDWTERMSIG	WIFEXITEDWEXITSTATUS)r    statusr   r   r   _compute_returncode2  s
    z$BaseChildWatcher._compute_returncodeN)
r   r   r   r   r&   r   r   r   r   r   r   r   r   r   r     s   r   c                   sj   e  Z d  Z   f d d   Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z	   S)r   c                s   |  j  j   t   j   d  S)N)r   r   r   r&   )r    )r"   r   r   r&   K  s    zSafeChildWatcher.closec             C   s   |  S)Nr   )r    r   r   r   r   O  s    zSafeChildWatcher.__enter__c             C   s   d  S)Nr   )r    r   r   r   r   r   r   r   R  s    zSafeChildWatcher.__exit__c             G   s?   |  j  d  k r t d   | | f |  j | <|  j |  d  S)NzICannot add child handler, the child watcher does not have a loop attached)r   r6   r   r   )r    rc   r=   r>   r   r   r   rU   U  s
    	z"SafeChildWatcher.add_child_handlerc             C   s/   y |  j  | =d SWn t k
 r* d SYn Xd  S)NTF)r   rC   )r    rc   r   r   r   r   `  s
    
z%SafeChildWatcher.remove_child_handlerc             C   s+   x$ t  |  j  D] } |  j |  q Wd  S)N)r'   r   r   )r    rc   r   r   r   r   g  s    z SafeChildWatcher._do_waitpid_allc             C   s   y t  j | t  j  \ } } Wn. t k
 rO | } d } t j d |  YnB X| d k r` d  S|  j |  } |  j j   r t j	 d | |  y |  j
 j |  \ } } Wn7 t k
 r |  j j   r t j d | d d Yn X| | | |  d  S)N   z8Unknown child process pid %d, will report returncode 255r   z$process %s exited with returncode %sz'Child watcher got an unexpected pid: %rr   T)rw   waitpidWNOHANGChildProcessErrorr   r   r   r   r   r   r   poprC   )r    r   rc   r   rd   r=   r>   r   r   r   r   l  s*    	
	zSafeChildWatcher._do_waitpid)
r   r   r   r&   r   r   rU   r   r   r   r   r   )r"   r   r   @  s   c                   sp   e  Z d  Z   f d d   Z   f d d   Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z	   S)r   c                s2   t    j   t j   |  _ i  |  _ d |  _ d  S)Nr   )r   r   	threadingLock_lock_zombies_forks)r    )r"   r   r   r     s    	zFastChildWatcher.__init__c                s+   |  j  j   |  j j   t   j   d  S)N)r   r   r   r   r&   )r    )r"   r   r   r&     s    zFastChildWatcher.closec          
   C   s(   |  j   |  j d 7_ |  SWd  QRXd  S)Nr   )r   r  )r    r   r   r   r     s    
zFastChildWatcher.__enter__c          
   C   sg   |  j  G |  j d 8_ |  j s, |  j r0 d  St |  j  } |  j j   Wd  QRXt j d |  d  S)Nr   z5Caught subprocesses termination from unknown pids: %s)r   r  r   r7   r   r   r   )r    r   r   r   Zcollateral_victimsr   r   r   r     s    
zFastChildWatcher.__exit__c             G   s   |  j  d  k r t d   |  j G y |  j j |  } Wn) t k
 rf | | f |  j | <d  SYn XWd  QRX| | | |  d  S)NzICannot add child handler, the child watcher does not have a loop attached)r   r6   r   r   r   rC   r   )r    rc   r=   r>   rd   r   r   r   rU     s    	
z"FastChildWatcher.add_child_handlerc             C   s/   y |  j  | =d SWn t k
 r* d SYn Xd  S)NTF)r   rC   )r    rc   r   r   r   r     s
    
z%FastChildWatcher.remove_child_handlerc             C   s9  x2y t  j d t  j  \ } } Wn t k
 r: d  SYn  X| d k rK d  S|  j |  } |  j  y |  j j |  \ } } WnS t k
 r |  j	 r | |  j
 | <|  j j   r t j d | |  w d  } Yn# X|  j j   r t j d | |  Wd  QRX| d  k r!t j d | |  q | | | |  q Wd  S)Nr   r   z,unknown process %s exited with returncode %sz$process %s exited with returncode %sz8Caught subprocess termination from unknown pid: %d -> %dr-   )rw   r   r   r   r   r   r   r   rC   r  r   r   r   r   r   r   )r    rc   r   rd   r=   r>   r   r   r   r     s6    	
		
	z FastChildWatcher._do_waitpid_all)
r   r   r   r   r&   r   r   rU   r   r   r   r   )r"   r   r     s   
c                   s^   e  Z d  Z e Z   f d d   Z d d   Z   f d d   Z d d   Z d	 d
   Z	   S)_UnixDefaultEventLoopPolicyc                s   t    j   d  |  _ d  S)N)r   r   _watcher)r    )r"   r   r   r     s    z$_UnixDefaultEventLoopPolicy.__init__c          
   C   s^   t  j N |  j d  k rS t   |  _ t t j   t j  rS |  j j |  j	 j
  Wd  QRXd  S)N)r   r   r  r   rH   r   current_thread_MainThreadr   _localr   )r    r   r   r   _init_watcher  s    
z)_UnixDefaultEventLoopPolicy._init_watcherc                sK   t    j |  |  j d  k	 rG t t j   t j  rG |  j j |  d  S)N)r   set_event_loopr  rH   r   r  r  r   )r    r   )r"   r   r   r    s    z*_UnixDefaultEventLoopPolicy.set_event_loopc             C   s    |  j  d  k r |  j   |  j  S)N)r  r  )r    r   r   r   rS     s    
z-_UnixDefaultEventLoopPolicy.get_child_watcherc             C   s)   |  j  d  k	 r |  j  j   | |  _  d  S)N)r  r&   )r    r_   r   r   r   set_child_watcher%  s    z-_UnixDefaultEventLoopPolicy.set_child_watcher)
r   r   r   r   Z_loop_factoryr   r  r  rS   r	  r   r   )r"   r   r    s   
r  )4r:   rw   r1   r#   ru   r   r   r   r    r   r   r   r   r   r   r	   r
   r   r   r   logr   __all__r   ImportErrorr   Zfspathrt   AttributeErrorZBaseSelectorEventLoopr   hasattrr   r   ZReadTransportrK   Z_FlowControlMixinZWriteTransportrQ   r   r   ZBaseSubprocessTransportrT   r   r   r   r   ZBaseDefaultEventLoopPolicyr  r   r   r   r   r   r   <module>   sf    
F=On2