<!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>
a
    XC?h*                     @   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	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Ze	jdkreddd ZG dd dejZG dd dejZ G dd dej!ej"Z#G dd dej$Z%G dd dZ&G dd de&Z'dd  Z(G d!d" d"e&Z)G d#d$ d$e)Z*G d%d& d&e)Z+G d'd( d(e&Z,G d)d* d*e&Z-G d+d, d,ej.Z/eZ0e/Z1dS )-    N   )base_events)base_subprocess)	constants)
coroutines)events)
exceptions)futures)selector_events)tasks)
transports)logger)SelectorEventLoopAbstractChildWatcherSafeChildWatcherFastChildWatcherPidfdChildWatcherMultiLoopChildWatcherThreadedChildWatcherDefaultEventLoopPolicyZwin32z+Signals are not really supported on Windowsc                 C   s   d S N )signumframer   r   8/opt/alt/python39/lib64/python3.9/asyncio/unix_events.py_sighandler_noop*   s    r   c                       s   e Zd Zd( f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Z
d*ddZd+ddZdd Zd,dddddddZd-ddddddddZd d! Zd"d# Zd$d% Zd&d' Z  ZS )._UnixSelectorEventLoopNc                    s   t  | i | _d S r   )super__init___signal_handlers)selfselector	__class__r   r   r   5   s    z_UnixSelectorEventLoop.__init__c                    sZ   t    t s.t| jD ]}| | qn(| jrVtjd| dt	| d | j
  d S )NzClosing the loop z@ on interpreter shutdown stage, skipping signal handlers removalsource)r   closesysis_finalizinglistr   remove_signal_handlerwarningswarnResourceWarningclearr    sigr"   r   r   r&   9   s    
z_UnixSelectorEventLoop.closec                 C   s   |D ]}|sq|  | qd S r   )_handle_signal)r    datar   r   r   r   _process_self_dataG   s    z)_UnixSelectorEventLoop._process_self_datac                 G   sR  t |st |rtd| | |   zt| j	  W n4 t
tfyv } ztt|W Y d }~n
d }~0 0 t||| d }|| j|< zt|t t|d W n tyL } z| j|= | jsztd W n6 t
tfy } ztd| W Y d }~n
d }~0 0 |jtjkr6td| dn W Y d }~n
d }~0 0 d S )Nz3coroutines cannot be used with add_signal_handler()Fset_wakeup_fd(-1) failed: %ssig  cannot be caught)r   ZiscoroutineZiscoroutinefunction	TypeError_check_signalZ_check_closedsignalset_wakeup_fdZ_csockfileno
ValueErrorOSErrorRuntimeErrorstrr   ZHandler   r   siginterruptr   infoerrnoEINVAL)r    r0   callbackargsexchandleZnexcr   r   r   add_signal_handlerN   s2    

"
"z)_UnixSelectorEventLoop.add_signal_handlerc                 C   s8   | j |}|d u rd S |jr*| | n
| | d S r   )r   getZ
_cancelledr*   Z_add_callback_signalsafe)r    r0   rH   r   r   r   r1   {   s    z%_UnixSelectorEventLoop._handle_signalc              
   C   s   |  | z| j|= W n ty*   Y dS 0 |tjkr>tj}ntj}zt|| W nD ty } z,|jtj	krt
d| dn W Y d }~n
d }~0 0 | jsztd W n4 ttfy } ztd| W Y d }~n
d }~0 0 dS )NFr6   r7   r4   r5   T)r9   r   KeyErrorr:   SIGINTdefault_int_handlerSIG_DFLr>   rC   rD   r?   r;   r=   r   rB   )r    r0   handlerrG   r   r   r   r*      s(    

"z,_UnixSelectorEventLoop.remove_signal_handlerc                 C   s6   t |tstd||t vr2td| d S )Nzsig must be an int, not zinvalid signal number )
isinstanceintr8   r:   valid_signalsr=   r/   r   r   r   r9      s    
z$_UnixSelectorEventLoop._check_signalc                 C   s   t | ||||S r   )_UnixReadPipeTransportr    pipeprotocolwaiterextrar   r   r   _make_read_pipe_transport   s    z0_UnixSelectorEventLoop._make_read_pipe_transportc                 C   s   t | ||||S r   )_UnixWritePipeTransportrT   r   r   r   _make_write_pipe_transport   s    z1_UnixSelectorEventLoop._make_write_pipe_transportc	              
      s   t  }
|
 std|  }t| |||||||f||d|	}|
| | j| z|I d H  W n@ t	t
fy    Y n* ty   |  | I d H   Y n0 W d    n1 s0    Y  |S )NzRasyncio.get_child_watcher() is not activated, subprocess support is not installed.)rW   rX   )r   get_child_watcher	is_activer?   create_future_UnixSubprocessTransportadd_child_handlerZget_pid_child_watcher_callback
SystemExitKeyboardInterruptBaseExceptionr&   Z_wait)r    rV   rF   shellstdinstdoutstderrbufsizerX   kwargswatcherrW   transpr   r   r   _make_subprocess_transport   s.    


&z1_UnixSelectorEventLoop._make_subprocess_transportc                 C   s   |  |j| d S r   )call_soon_threadsafeZ_process_exited)r    pid
returncoderl   r   r   r   ra      s    z._UnixSelectorEventLoop._child_watcher_callback)sslsockserver_hostnamessl_handshake_timeoutc          	         s
  |r|d u r6t dn |d ur&t d|d ur6t d|d ur|d urNt dt|}ttjtjd}z |d | ||I d H  W q   |   Y q0 n@|d u rt d|j	tjks|j
tjkrt d||d | j|||||d	I d H \}}||fS )
Nz/you have to pass server_hostname when using sslz+server_hostname is only meaningful with ssl1ssl_handshake_timeout is only meaningful with ssl3path and sock can not be specified at the same timer   Fzno path and sock were specified.A UNIX Domain Stream Socket was expected, got )rt   )r=   osfspathsocketAF_UNIXSOCK_STREAMsetblockingZsock_connectr&   familytypeZ_create_connection_transport)	r    protocol_factorypathrq   rr   rs   rt   	transportrV   r   r   r   create_unix_connection   sL    




z-_UnixSelectorEventLoop.create_unix_connectiond   T)rr   backlogrq   rt   start_servingc             
      s  t |trtd|d ur&|s&td|d urJ|d ur@tdt|}ttjtj}|d dvrz t	
t	|jrt| W nB ty   Y n2 ty } ztd|| W Y d }~n
d }~0 0 z|| W nn ty2 }	 z@|  |	jtjkrd|d}
ttj|
d n W Y d }	~	nd }	~	0    |   Y n0 n<|d u r\td	|jtjksx|jtjkrtd
||d t| |g||||}|r|  tdI d H  |S )Nz*ssl argument must be an SSLContext or Noneru   rv   r   )r    z2Unable to check or remove stale UNIX socket %r: %rzAddress z is already in usez-path was not specified, and no sock specifiedrw   F)rP   boolr8   r=   rx   ry   rz   r{   r|   statS_ISSOCKst_moderemoveFileNotFoundErrorr>   r   errorZbindr&   rC   Z
EADDRINUSEr~   r   r}   r   ZServerZ_start_servingr   sleep)r    r   r   rr   r   rq   rt   r   errrG   msgZserverr   r   r   create_unix_server  sh    






z)_UnixSelectorEventLoop.create_unix_serverc           
   
      s   z
t j W n ty&   tdY n0 z| }W n4 ttjfyh } ztdW Y d }~n
d }~0 0 zt |j	}W n t
y   tdY n0 |r|n|}|sdS |  }	| |	d |||||d |	I d H S )Nzos.sendfile() is not availableznot a regular filer   )rx   sendfileAttributeErrorr   SendfileNotAvailableErrorr<   ioUnsupportedOperationfstatst_sizer>   r^   _sock_sendfile_native_impl)
r    rr   fileoffsetcountr<   r   Zfsize	blocksizefutr   r   r   _sock_sendfile_nativeJ  s,    

 z,_UnixSelectorEventLoop._sock_sendfile_nativec	                 C   s,  |  }	|d ur| | | r4| ||| d S |rd|| }|dkrd| ||| || d S zt|	|||}
W nD ttfy   |d u r| 	|| | 
|	| j||	||||||
 Y nd tyj } z|d ur|jtjkrt|turtdtj}||_|}|dkr>td}| ||| || n| ||| || W Y d }~nd }~0  ttfy    Y n ty } z$| ||| || W Y d }~nrd }~0 0 |
dkr| ||| || nD||
7 }||
7 }|d u r
| 	|| | 
|	| j||	||||||
 d S )Nr   zsocket is not connectedzos.sendfile call failed)r<   remove_writer	cancelled_sock_sendfile_update_fileposZ
set_resultrx   r   BlockingIOErrorInterruptedError_sock_add_cancellation_callbackZ
add_writerr   r>   rC   ZENOTCONNr   ConnectionError	__cause__r   r   Zset_exceptionrb   rc   rd   )r    r   Zregistered_fdrr   r<   r   r   r   
total_sentfdZsentrG   new_excr   r   r   r   r   a  sp    






 

z1_UnixSelectorEventLoop._sock_sendfile_native_implc                 C   s   |dkrt ||t j d S Nr   )rx   lseekSEEK_SET)r    r<   r   r   r   r   r   r     s    z4_UnixSelectorEventLoop._sock_sendfile_update_fileposc                    s    fdd}| | d S )Nc                    s&   |   r" }|dkr" | d S )Nr4   )r   r<   r   )r   r   r    rr   r   r   cb  s    zB_UnixSelectorEventLoop._sock_add_cancellation_callback.<locals>.cb)Zadd_done_callback)r    r   rr   r   r   r   r   r     s    z6_UnixSelectorEventLoop._sock_add_cancellation_callback)N)NN)NN)N)N)N)__name__
__module____qualname__r   r&   r3   rI   r1   r*   r9   rY   r[   rm   ra   r   r   r   r   r   r   __classcell__r   r   r"   r   r   /   s@   -
   
  
 
 . CFr   c                       s   e Zd ZdZ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fddZdddZdd Zdd Z  ZS ) rS   i   Nc                    s   t  | || jd< || _|| _| | _|| _d| _d| _	t
| jj}t|st|st|sd | _d | _d | _tdt
| jd | j| jj|  | j| jj| j| j |d ur| jtj|d  d S )NrU   Fz)Pipe transport is for pipes/sockets only.)r   r   _extra_loop_piper<   _fileno	_protocol_closing_pausedrx   r   r   r   S_ISFIFOr   S_ISCHRr=   set_blocking	call_soonconnection_made_add_reader_read_readyr	   _set_result_unless_cancelled)r    looprU   rV   rW   rX   moder"   r   r   r     s6    



z_UnixReadPipeTransport.__init__c                 C   s   | j jg}| jd u r |d n| jr0|d |d| j  t| jdd }| jd ur|d urt	|| jt
j}|r|d q|d n | jd ur|d n
|d dd	|S )
Nclosedclosingfd=	_selectorpollingidleopen<{}> )r#   r   r   appendr   r   getattrr   r
   _test_selector_event	selectorsZ
EVENT_READformatjoin)r    rB   r!   r   r   r   r   __repr__  s$    





z_UnixReadPipeTransport.__repr__c              
   C   s   zt | j| j}W nD ttfy*   Y n tyX } z| |d W Y d }~nfd }~0 0 |rl| j	| nJ| j
 rtd|  d| _| j
| j | j
| jj | j
| jd  d S )Nz"Fatal read error on pipe transport%r was closed by peerT)rx   readr   max_sizer   r   r>   _fatal_errorr   Zdata_receivedr   	get_debugr   rB   r   _remove_readerr   Zeof_received_call_connection_lost)r    r2   rG   r   r   r   r     s    "
z"_UnixReadPipeTransport._read_readyc                 C   s>   | j s| jrd S d| _| j| j | j r:td|  d S )NTz%r pauses reading)r   r   r   r   r   r   r   debugr    r   r   r   pause_reading  s    
z$_UnixReadPipeTransport.pause_readingc                 C   sB   | j s| jsd S d| _| j| j| j | j r>td|  d S )NFz%r resumes reading)	r   r   r   r   r   r   r   r   r   r   r   r   r   resume_reading  s    
z%_UnixReadPipeTransport.resume_readingc                 C   s
   || _ d S r   r   r    rV   r   r   r   set_protocol  s    z#_UnixReadPipeTransport.set_protocolc                 C   s   | j S r   r   r   r   r   r   get_protocol  s    z#_UnixReadPipeTransport.get_protocolc                 C   s   | j S r   r   r   r   r   r   
is_closing  s    z!_UnixReadPipeTransport.is_closingc                 C   s   | j s| d  d S r   )r   _closer   r   r   r   r&     s    z_UnixReadPipeTransport.closec                 C   s,   | j d ur(|d| t| d | j   d S Nzunclosed transport r$   r   r-   r&   r    _warnr   r   r   __del__  s    
z_UnixReadPipeTransport.__del__Fatal error on pipe transportc                 C   sZ   t |tr4|jtjkr4| j rLtjd| |dd n| j||| | j	d | 
| d S Nz%r: %sTexc_info)message	exceptionr   rV   )rP   r>   rC   ZEIOr   r   r   r   call_exception_handlerr   r   r    rG   r   r   r   r   r     s    
z#_UnixReadPipeTransport._fatal_errorc                 C   s(   d| _ | j| j | j| j| d S NT)r   r   r   r   r   r   r    rG   r   r   r   r   -  s    z_UnixReadPipeTransport._closec                 C   sP   z,| j | W | j  d | _d | _ d | _n| j  d | _d | _ d | _0 d S r   r   Zconnection_lostr   r&   r   r   r   r   r   r   2  s    

z,_UnixReadPipeTransport._call_connection_lost)NN)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   rS     s   
rS   c                       s   e Zd Z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fddZdd Zd&dd Zd'd!d"Zd#d$ Z  ZS )(rZ   Nc           
         s   t  || || jd< || _| | _|| _t | _d| _	d| _
t| jj}t|}t|}t|}	|s|s|	sd | _d | _d | _tdt| jd | j| jj|  |	s|rtjds| j| jj| j| j |d ur| jtj|d  d S )NrU   r   Fz?Pipe transport is only for pipes, sockets and character devicesZaix)r   r   r   r   r<   r   r   	bytearray_buffer
_conn_lostr   rx   r   r   r   r   r   r   r=   r   r   r   r   r'   platform
startswithr   r   r	   r   )
r    r   rU   rV   rW   rX   r   Zis_charZis_fifoZ	is_socketr"   r   r   r   ?  s6    





z _UnixWritePipeTransport.__init__c                 C   s   | j jg}| jd u r |d n| jr0|d |d| j  t| jdd }| jd ur|d urt	|| jt
j}|r|d n
|d |  }|d|  n | jd ur|d n
|d d	d
|S )Nr   r   r   r   r   r   zbufsize=r   r   r   )r#   r   r   r   r   r   r   r   r
   r   r   ZEVENT_WRITEget_write_buffer_sizer   r   )r    rB   r!   r   ri   r   r   r   r   d  s(    






z _UnixWritePipeTransport.__repr__c                 C   s
   t | jS r   )lenr   r   r   r   r   r   |  s    z-_UnixWritePipeTransport.get_write_buffer_sizec                 C   s6   | j  rtd|  | jr*| t  n|   d S )Nr   )r   r   r   rB   r   r   BrokenPipeErrorr   r   r   r   r     s
    
z#_UnixWritePipeTransport._read_readyc              
   C   s.  t |trt|}|sd S | js&| jrN| jtjkr<td |  jd7  _d S | j	szt
| j|}W nn ttfy   d}Y nV ttfy    Y n@ ty } z(|  jd7  _| |d W Y d }~d S d }~0 0 |t|krd S |dkrt||d  }| j| j| j |  j	|7  _	|   d S )Nz=pipe closed by peer or os.write(pipe, data) raised exception.r   r   #Fatal write error on pipe transport)rP   r   
memoryviewr   r   r   Z!LOG_THRESHOLD_FOR_CONNLOST_WRITESr   warningr   rx   writer   r   r   rb   rc   rd   r   r   r   Z_add_writer_write_readyZ_maybe_pause_protocol)r    r2   nrG   r   r   r   r    s6    


z_UnixWritePipeTransport.writec              
   C   s   zt | j| j}W n ttfy*   Y n ttfy@    Y n ty } z>| j	  |  j
d7  _
| j| j | |d W Y d }~nnd }~0 0 |t| jkr| j	  | j| j |   | jr| j| j | d  d S |dkr| jd |= d S )Nr   r   r   )rx   r  r   r   r   r   rb   rc   rd   r.   r   r   _remove_writerr   r   Z_maybe_resume_protocolr   r   r   )r    r  rG   r   r   r   r    s*    
"

z$_UnixWritePipeTransport._write_readyc                 C   s   dS r   r   r   r   r   r   can_write_eof  s    z%_UnixWritePipeTransport.can_write_eofc                 C   s8   | j r
d S d| _ | js4| j| j | j| jd  d S r   )r   r   r   r   r   r   r   r   r   r   r   	write_eof  s    z!_UnixWritePipeTransport.write_eofc                 C   s
   || _ d S r   r   r   r   r   r   r     s    z$_UnixWritePipeTransport.set_protocolc                 C   s   | j S r   r   r   r   r   r   r     s    z$_UnixWritePipeTransport.get_protocolc                 C   s   | j S r   r   r   r   r   r   r     s    z"_UnixWritePipeTransport.is_closingc                 C   s   | j d ur| js|   d S r   )r   r   r  r   r   r   r   r&     s    z_UnixWritePipeTransport.closec                 C   s,   | j d ur(|d| t| d | j   d S r   r   r   r   r   r   r     s    
z_UnixWritePipeTransport.__del__c                 C   s   |  d  d S r   )r   r   r   r   r   abort  s    z_UnixWritePipeTransport.abortr   c                 C   sN   t |tr(| j r@tjd| |dd n| j||| | jd | | d S r   )	rP   r>   r   r   r   r   r   r   r   r   r   r   r   r     s    

z$_UnixWritePipeTransport._fatal_errorc                 C   sF   d| _ | jr| j| j | j  | j| j | j| j| d S r   )	r   r   r   r  r   r.   r   r   r   r   r   r   r   r     s    
z_UnixWritePipeTransport._closec                 C   sP   z,| j | W | j  d | _d | _ d | _n| j  d | _d | _ d | _0 d S r   r   r   r   r   r   r     s    

z-_UnixWritePipeTransport._call_connection_lost)NN)r   )N)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"   r   rZ   <  s"   %	#	

rZ   c                   @   s   e Zd Zdd ZdS )r_   c           	   	   K   s   d }|t jkrt \}}zht j|f||||d|d|| _|d urh|  t| d|d| j_	d }W |d ur|  |  n|d ur|  |  0 d S )NF)re   rf   rg   rh   Zuniversal_newlinesri   wb)	buffering)

subprocessPIPErz   Z
socketpairPopen_procr&   r   detachrf   )	r    rF   re   rf   rg   rh   ri   rj   Zstdin_wr   r   r   _start  s,    

z_UnixSubprocessTransport._startN)r   r   r   r  r   r   r   r   r_   	  s   r_   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 )r   c                 G   s
   t  d S r   NotImplementedErrorr    ro   rE   rF   r   r   r   r`   9  s    	z&AbstractChildWatcher.add_child_handlerc                 C   s
   t  d S r   r  r    ro   r   r   r   remove_child_handlerD  s    z)AbstractChildWatcher.remove_child_handlerc                 C   s
   t  d S r   r  r    r   r   r   r   attach_loopL  s    z AbstractChildWatcher.attach_loopc                 C   s
   t  d S r   r  r   r   r   r   r&   V  s    zAbstractChildWatcher.closec                 C   s
   t  d S r   r  r   r   r   r   r]   ]  s    zAbstractChildWatcher.is_activec                 C   s
   t  d S r   r  r   r   r   r   	__enter__f  s    zAbstractChildWatcher.__enter__c                 C   s
   t  d S r   r  r    abcr   r   r   __exit__l  s    zAbstractChildWatcher.__exit__N)
r   r   r   r`   r  r  r&   r]   r  r  r   r   r   r   r   "  s   
	r   c                   @   sT   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d Z
dd ZdS )r   c                 C   s   d | _ i | _d S r   r   
_callbacksr   r   r   r   r   }  s    zPidfdChildWatcher.__init__c                 C   s   | S r   r   r   r   r   r   r    s    zPidfdChildWatcher.__enter__c                 C   s   d S r   r   )r    exc_type	exc_valueexc_tracebackr   r   r   r    s    zPidfdChildWatcher.__exit__c                 C   s   | j d uo| j  S r   r   Z
is_runningr   r   r   r   r]     s    zPidfdChildWatcher.is_activec                 C   s   |  d  d S r   r  r   r   r   r   r&     s    zPidfdChildWatcher.closec                 C   sd   | j d ur$|d u r$| jr$tdt | j D ] \}}}| j | t| q.| j	  || _ d S NzCA loop is being detached from a child watcher with pending handlers)
r   r   r+   r,   RuntimeWarningvaluesr   rx   r&   r.   )r    r   pidfd_r   r   r   r    s    
zPidfdChildWatcher.attach_loopc                 G   sZ   | j |}|d ur*|d ||f| j |< n,t|}| j|| j| |||f| j |< d S r   )r   rJ   rx   Z
pidfd_openr   r   _do_wait)r    ro   rE   rF   Zexistingr)  r   r   r   r`     s    
z#PidfdChildWatcher.add_child_handlerc                 C   s~   | j |\}}}| j| zt|d\}}W n" tyT   d}td| Y n
0 t	|}t
| |||g|R   d S )Nr      zJchild process pid %d exit status already read:  will report returncode 255)r   popr   r   rx   waitpidChildProcessErrorr   r  _compute_returncoder&   )r    ro   r)  rE   rF   r*  statusrp   r   r   r   r+    s    

zPidfdChildWatcher._do_waitc                 C   sF   z| j |\}}}W n ty*   Y dS 0 | j| t| dS )NFT)r   r-  rK   r   r   rx   r&   )r    ro   r)  r*  r   r   r   r    s    
z&PidfdChildWatcher.remove_child_handlerN)r   r   r   r   r  r  r]   r&   r  r`   r+  r  r   r   r   r   r   q  s   	r   c                 C   s2   t | rt |  S t | r*t | S | S d S r   )rx   WIFSIGNALEDWTERMSIG	WIFEXITEDWEXITSTATUS)r1  r   r   r   r0    s
    


r0  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 r   r  r   r   r   r   r     s    zBaseChildWatcher.__init__c                 C   s   |  d  d S r   r%  r   r   r   r   r&     s    zBaseChildWatcher.closec                 C   s   | j d uo| j  S r   r$  r   r   r   r   r]     s    zBaseChildWatcher.is_activec                 C   s
   t  d S r   r  )r    expected_pidr   r   r   _do_waitpid  s    zBaseChildWatcher._do_waitpidc                 C   s
   t  d S r   r  r   r   r   r   _do_waitpid_all  s    z BaseChildWatcher._do_waitpid_allc                 C   sf   | j d ur$|d u r$| jr$tdt | j d ur<| j tj || _ |d urb|tj| j	 | 
  d S r&  )r   r   r+   r,   r'  r*   r:   SIGCHLDrI   	_sig_chldr9  r  r   r   r   r    s    
zBaseChildWatcher.attach_loopc              
   C   s^   z|    W nL ttfy$    Y n6 tyX } z| jd|d W Y d }~n
d }~0 0 d S )N$Unknown exception in SIGCHLD handler)r   r   )r9  rb   rc   rd   r   r   r   r   r   r   r;    s    zBaseChildWatcher._sig_chldN)
r   r   r   r   r&   r]   r8  r9  r  r;  r   r   r   r   r6    s   r6  c                       sL   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	  Z
S )r   c                    s   | j   t   d S r   )r   r.   r   r&   r   r"   r   r   r&     s    
zSafeChildWatcher.closec                 C   s   | S r   r   r   r   r   r   r    s    zSafeChildWatcher.__enter__c                 C   s   d S r   r   r  r   r   r   r    s    zSafeChildWatcher.__exit__c                 G   s   ||f| j |< | | d S r   )r   r8  r  r   r   r   r`     s    z"SafeChildWatcher.add_child_handlerc                 C   s(   z| j |= W dS  ty"   Y dS 0 d S NTFr   rK   r  r   r   r   r    s
    z%SafeChildWatcher.remove_child_handlerc                 C   s   t | jD ]}| | q
d S r   r)   r   r8  r  r   r   r   r9  $  s    z SafeChildWatcher._do_waitpid_allc                 C   s   zt |t j\}}W n& ty<   |}d}td| Y n.0 |dkrJd S t|}| j rjt	d|| z| j
|\}}W n, ty   | j rtjd|dd Y n0 |||g|R   d S )Nr,  8Unknown child process pid %d, will report returncode 255r   $process %s exited with returncode %s'Child watcher got an unexpected pid: %rTr   )rx   r.  WNOHANGr/  r   r  r0  r   r   r   r   r-  rK   )r    r7  ro   r1  rp   rE   rF   r   r   r   r8  )  s0    


zSafeChildWatcher._do_waitpid)r   r   r   r&   r  r  r`   r  r9  r8  r   r   r   r"   r   r     s   r   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	  Z
S )r   c                    s$   t    t | _i | _d| _d S r   )r   r   	threadingZLock_lock_zombies_forksr   r"   r   r   r   V  s    

zFastChildWatcher.__init__c                    s"   | j   | j  t   d S r   )r   r.   rF  r   r&   r   r"   r   r   r&   \  s    

zFastChildWatcher.closec                 C   s<   | j " |  jd7  _| W  d    S 1 s.0    Y  d S )Nr   )rE  rG  r   r   r   r   r  a  s    zFastChildWatcher.__enter__c                 C   st   | j N |  jd8  _| js"| js2W d    d S t| j}| j  W d    n1 sZ0    Y  td| d S )Nr   z5Caught subprocesses termination from unknown pids: %s)rE  rG  rF  r@   r.   r   r  )r    r  r  r  Zcollateral_victimsr   r   r   r  g  s    
(zFastChildWatcher.__exit__c              	   G   s|   | j P z| j|}W n. tyF   ||f| j|< Y W d    d S 0 W d    n1 s\0    Y  |||g|R   d S r   )rE  rF  r-  rK   r   )r    ro   rE   rF   rp   r   r   r   r`   u  s    2z"FastChildWatcher.add_child_handlerc                 C   s(   z| j |= W dS  ty"   Y dS 0 d S r=  r>  r  r   r   r   r    s
    z%FastChildWatcher.remove_child_handlerc              	   C   s  zt dt j\}}W n ty*   Y d S 0 |dkr8d S t|}| j z| j|\}}W nN ty   | j	r|| j
|< | j rtd|| Y W d    q d }Y n0 | j rtd|| W d    n1 s0    Y  |d u rtd|| q |||g|R   q d S )Nr4   r   z,unknown process %s exited with returncode %srA  z8Caught subprocess termination from unknown pid: %d -> %d)rx   r.  rC  r/  r0  rE  r   r-  rK   rG  rF  r   r   r   r   r  )r    ro   r1  rp   rE   rF   r   r   r   r9    s:    



"z FastChildWatcher._do_waitpid_all)r   r   r   r   r&   r  r  r`   r  r9  r   r   r   r"   r   r   L  s   
r   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d Z
dd Zdd Zdd ZdS )r   c                 C   s   i | _ d | _d S r   )r   _saved_sighandlerr   r   r   r   r     s    zMultiLoopChildWatcher.__init__c                 C   s
   | j d uS r   )rH  r   r   r   r   r]     s    zMultiLoopChildWatcher.is_activec                 C   sT   | j   | jd u rd S ttj}|| jkr:td nttj| j d | _d S )Nz+SIGCHLD handler was changed by outside code)	r   r.   rH  r:   	getsignalr:  r;  r   r  )r    rO   r   r   r   r&     s    


zMultiLoopChildWatcher.closec                 C   s   | S r   r   r   r   r   r   r    s    zMultiLoopChildWatcher.__enter__c                 C   s   d S r   r   r    r!  Zexc_valZexc_tbr   r   r   r    s    zMultiLoopChildWatcher.__exit__c                 G   s&   t  }|||f| j|< | | d S r   )r   get_running_loopr   r8  )r    ro   rE   rF   r   r   r   r   r`     s    z'MultiLoopChildWatcher.add_child_handlerc                 C   s(   z| j |= W dS  ty"   Y dS 0 d S r=  r>  r  r   r   r   r    s
    z*MultiLoopChildWatcher.remove_child_handlerc                 C   sN   | j d urd S ttj| j| _ | j d u r<td tj| _ ttjd d S )NzaPrevious SIGCHLD handler was set by non-Python code, restore to default handler on watcher close.F)rH  r:   r:  r;  r   r  rN   rA   r  r   r   r   r    s    


z!MultiLoopChildWatcher.attach_loopc                 C   s   t | jD ]}| | q
d S r   r?  r  r   r   r   r9     s    z%MultiLoopChildWatcher._do_waitpid_allc           	      C   s   zt |t j\}}W n* ty@   |}d}td| d}Y n0 |dkrNd S t|}d}z| j|\}}}W n" t	y   tjd|dd Y nJ0 |
 rtd|| n0|r| rtd	|| |j|||g|R   d S )
Nr,  r@  Fr   TrB  r   %Loop %r that handles pid %r is closedrA  )rx   r.  rC  r/  r   r  r0  r   r-  rK   	is_closedr   r   rn   )	r    r7  ro   r1  rp   Z	debug_logr   rE   rF   r   r   r   r8    s6    
z!MultiLoopChildWatcher._do_waitpidc              	   C   sH   z|    W n6 ttfy$    Y n  tyB   tjddd Y n0 d S )Nr<  Tr   )r9  rb   rc   rd   r   r  )r    r   r   r   r   r   r;  )  s    zMultiLoopChildWatcher._sig_chldN)r   r   r   r   r]   r&   r  r  r`   r  r  r9  r8  r;  r   r   r   r   r     s   %r   c                   @   sj   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Ze	j
fddZdd Zdd Zdd Zdd ZdS )r   c                 C   s   t d| _i | _d S r   )	itertoolsr   _pid_counter_threadsr   r   r   r   r   ?  s    zThreadedChildWatcher.__init__c                 C   s   dS r   r   r   r   r   r   r]   C  s    zThreadedChildWatcher.is_activec                 C   s   |    d S r   )_join_threadsr   r   r   r   r&   F  s    zThreadedChildWatcher.closec                 C   s.   dd t | j D }|D ]}|  qd S )Nc                 S   s   g | ]}|  r|js|qS r   )is_alivedaemon.0threadr   r   r   
<listcomp>K  s   z6ThreadedChildWatcher._join_threads.<locals>.<listcomp>)r)   rP  r(  r   )r    threadsrV  r   r   r   rQ  I  s    z"ThreadedChildWatcher._join_threadsc                 C   s   | S r   r   r   r   r   r   r  P  s    zThreadedChildWatcher.__enter__c                 C   s   d S r   r   rJ  r   r   r   r  S  s    zThreadedChildWatcher.__exit__c                 C   s6   dd t | j D }|r2|| j dt| d d S )Nc                 S   s   g | ]}|  r|qS r   )rR  rT  r   r   r   rW  W  s   z0ThreadedChildWatcher.__del__.<locals>.<listcomp>z0 has registered but not finished child processesr$   )r)   rP  r(  r#   r-   )r    r   rX  r   r   r   r   V  s    zThreadedChildWatcher.__del__c                 G   sF   t  }tj| jdt| j ||||fdd}|| j|< |  d S )Nzwaitpid-T)targetnamerF   rS  )	r   rK  rD  ZThreadr8  nextrO  rP  start)r    ro   rE   rF   r   rV  r   r   r   r`   ^  s    

z&ThreadedChildWatcher.add_child_handlerc                 C   s   dS r   r   r  r   r   r   r  g  s    z)ThreadedChildWatcher.remove_child_handlerc                 C   s   d S r   r   r  r   r   r   r  m  s    z ThreadedChildWatcher.attach_loopc                 C   s   zt |d\}}W n& ty:   |}d}td| Y n 0 t|}| rZtd|| | rrtd|| n|j	|||g|R   | j
| d S )Nr   r,  r@  rA  rL  )rx   r.  r/  r   r  r0  r   r   rM  rn   rP  r-  )r    r   r7  rE   rF   ro   r1  rp   r   r   r   r8  p  s$    
z ThreadedChildWatcher._do_waitpidN)r   r   r   r   r]   r&   rQ  r  r  r+   r,   r   r`   r  r  r8  r   r   r   r   r   2  s   	r   c                       sD   e Zd ZeZ fddZdd Z fddZdd Zd	d
 Z	  Z
S )_UnixDefaultEventLoopPolicyc                    s   t    d | _d S r   )r   r   _watcherr   r"   r   r   r     s    
z$_UnixDefaultEventLoopPolicy.__init__c                 C   s\   t jB | jd u r:t | _t t u r:| j| jj	 W d    n1 sN0    Y  d S r   )
r   rE  r^  r   rD  current_threadmain_threadr  _localr   r   r   r   r   _init_watcher  s
    
z)_UnixDefaultEventLoopPolicy._init_watcherc                    s6   t  | | jd ur2t t u r2| j| d S r   )r   set_event_loopr^  rD  r_  r`  r  r  r"   r   r   rc    s
    
z*_UnixDefaultEventLoopPolicy.set_event_loopc                 C   s   | j d u r|   | j S r   )r^  rb  r   r   r   r   r\     s    
z-_UnixDefaultEventLoopPolicy.get_child_watcherc                 C   s   | j d ur| j   || _ d S r   )r^  r&   )r    rk   r   r   r   set_child_watcher  s    

z-_UnixDefaultEventLoopPolicy.set_child_watcher)r   r   r   r   Z_loop_factoryr   rb  rc  r\   rd  r   r   r   r"   r   r]    s   
r]  )2rC   r   rN  rx   r   r:   rz   r   r  r'   rD  r+    r   r   r   r   r   r   r	   r
   r   r   logr   __all__r   ImportErrorr   ZBaseSelectorEventLoopr   ZReadTransportrS   Z_FlowControlMixinZWriteTransportrZ   ZBaseSubprocessTransportr_   r   r   r0  r6  r   r   r   r   ZBaseDefaultEventLoopPolicyr]  r   r   r   r   r   r   <module>   s`   	
    	 NON5Ji}Y2