a
    åze*Ê  ã                   @   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rúe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ÚDefaultEventLoopPolicyÚwin32z+Signals are not really supported on Windowsc                 C   s   d S ©N© )ÚsignumÚframer   r   ú)/usr/lib/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_signalÚ_check_closedÚsignalÚset_wakeup_fdZ_csockÚfilenoÚ
ValueErrorÚOSErrorÚRuntimeErrorÚstrr   ÚHandler    r   Úsiginterruptr   ÚinfoÚerrnoÚEINVAL)r!   r1   Ú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!   r1   rK   r   r   r   r2   {   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r‚t
d|› dƒ‚n‚ W Y d }~n
d }~0 0 | jsäzt d¡ W n4 ttfyâ } zt d|¡ W Y d }~n
d }~0 0 dS )NFr7   r8   r5   r6   T)r:   r    ÚKeyErrorr<   ÚSIGINTÚdefault_int_handlerÚSIG_DFLr@   rF   rG   rA   r=   r?   r   rE   )r!   r1   ÚhandlerrJ   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Úintr9   r<   Úvalid_signalsr?   r0   r   r   r   r:   ¥   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   )Ú_UnixWritePipeTransportrW   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 s¾0    Y  |S )NzRasyncio.get_child_watcher() is not activated, subprocess support is not installed.)rZ   r[   )r   Úget_child_watcherÚ	is_activerA   Úcreate_futureÚ_UnixSubprocessTransportÚadd_child_handlerZget_pidÚ_child_watcher_callbackÚ
SystemExitÚKeyboardInterruptÚBaseExceptionr'   Ú_wait)r!   rY   rI   ÚshellÚstdinÚstdoutÚstderrÚbufsizer[   ÚkwargsÚwatcherrZ   Ú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Ú
returncoderp   r   r   r   rd   ×   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 qä0 n@|d u r´t dƒ‚|j	tjksÌ|j
tjkrÚt 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 sslú1ssl_handshake_timeout is only meaningful with sslú3path 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 )rx   )r?   ÚosÚfspathÚsocketÚAF_UNIXÚSOCK_STREAMÚsetblockingZsock_connectr'   ÚfamilyÚtypeZ_create_connection_transport)	r!   Úprotocol_factoryÚpathru   rv   rw   rx   Ú	transportrY   r   r   r   Úcreate_unix_connectionÚ   sL    ÿÿÿ



ÿÿ
þz-_UnixSelectorEventLoop.create_unix_connectionéd   T)rv   Úbacklogru   rx   Ú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rÊz t	 
t 	|¡j¡r„t |¡ 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r†td
|›ƒ‚| d¡ t | |g||||¡}|rÄ| ¡  t d¡I d H  |S )Nz*ssl argument must be an SSLContext or Nonery   rz   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 specifiedr{   F)rS   Úboolr9   r?   r|   r}   r~   r   r€   ÚstatÚS_ISSOCKÚst_modeÚremoveÚFileNotFoundErrorr@   r   ÚerrorÚbindr'   rF   Z
EADDRINUSEr‚   rƒ   r   r   ZServerZ_start_servingr   Úsleep)r!   r„   r…   rv   r‰   ru   rx   rŠ   ÚerrrJ   Ú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|}|s¬dS |  ¡ }	|  |	d |||||d¡ |	I d H S )Nzos.sendfile() is not availableznot a regular filer   )r|   ÚsendfileÚAttributeErrorr   ÚSendfileNotAvailableErrorr>   ÚioÚUnsupportedOperationÚfstatÚst_sizer@   ra   Ú_sock_sendfile_native_impl)
r!   rv   ÚfileÚoffsetÚcountr>   r•   Ú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 }~nÆd }~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_fileposÚ
set_resultr|   r˜   ÚBlockingIOErrorÚInterruptedErrorÚ_sock_add_cancellation_callbackZ
add_writerrŸ   r@   rF   ZENOTCONNrƒ   ÚConnectionErrorÚ	__cause__r   rš   Úset_exceptionre   rf   rg   )r!   r¥   Zregistered_fdrv   r>   r¡   r¢   r¤   Ú
total_sentÚfdÚsentrJ   Ú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   )r|   Ú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 )Nr5   )r¨   r>   r§   )r¥   r²   ©r!   rv   r   r   Úcb¬  s    zB_UnixSelectorEventLoop._sock_add_cancellation_callback.<locals>.cb)Úadd_done_callback)r!   r¥   rv   r¹   r   r¸   r   r­   «  s    z6_UnixSelectorEventLoop._sock_add_cancellation_callback)N)NN)NN)N)N)N)Ú__name__Ú
__module__Ú__qualname__r   r'   r4   rL   r2   r+   r:   r\   r^   rq   rd   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 ) rV   i   Nc                    sÚ   t ƒ  |¡ || jd< || _|| _| ¡ | _|| _d| _d| _	t
 | j¡j}t |¡s„t |¡s„t |¡s„d | _d | _d | _tdƒ‚t
 | jd¡ | j | jj| ¡ | j | jj| j| j¡ |d urÖ| j tj|d ¡ d S )NrX   Fz)Pipe transport is for pipes/sockets only.)r   r   Ú_extraÚ_loopÚ_piper>   Ú_filenoÚ	_protocolÚ_closingÚ_pausedr|   r   r   r   ÚS_ISFIFOrŽ   ÚS_ISCHRr?   Úset_blockingÚ	call_soonÚconnection_madeÚ_add_readerÚ_read_readyr	   Ú_set_result_unless_cancelled)r!   ÚlooprX   rY   rZ   r[   Ú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Ú	selectorsÚ
EVENT_READÚformatÚjoin)r!   rE   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
 ¡ r‚t d| ¡ d| _| j
 | j¡ | j
 | jj¡ | j
 | jd ¡ d S )Nz"Fatal read error on pipe transportú%r was closed by peerT)r|   ÚreadrÂ   Úmax_sizer«   r¬   r@   Ú_fatal_errorrÃ   Zdata_receivedrÀ   Ú	get_debugr   rE   rÄ   Ú_remove_readerrÉ   Zeof_receivedÚ_call_connection_lost)r!   r3   rJ   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!   rY   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†   rY   )rS   r@   rF   ZEIOrÀ   rå   r   rè   Úcall_exception_handlerrÃ   rò   ©r!   rJ   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!   rJ   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   rV   ´  s   
rV   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 )(r]   Nc           
         sþ   t ƒ  ||¡ || jd< || _| ¡ | _|| _tƒ | _d| _	d| _
t | j¡j}t |¡}t |¡}t |¡}	|s”|s”|	s”d | _d | _d | _tdƒ‚t | jd¡ | j | jj| ¡ |	sÈ|ràtj d¡sà| j | jj| j| j¡ |d urú| j tj|d ¡ d S )NrX   r   Fz?Pipe transport is only for pipes, sockets and character devicesZaix)r   r   r¿   rÁ   r>   rÂ   rÃ   Ú	bytearrayÚ_bufferÚ
_conn_lostrÄ   r|   r   r   r   rÇ   rÆ   rŽ   r?   rÈ   rÀ   rÉ   rÊ   r(   ÚplatformÚ
startswithrË   rÌ   r	   rÍ   )
r!   rÎ   rX   rY   rZ   r[   rÏ   Zis_charÚis_fifoÚ	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r¨t 	|| 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Ü   ÚEVENT_WRITEÚget_write_buffer_sizerÞ   rß   )r!   rE   r"   rÔ   rm   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   rE   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rèd 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)rS   r  Ú
memoryviewr  rÄ   r   Z!LOG_THRESHOLD_FOR_CONNLOST_WRITESr   Úwarningr  r|   ÚwriterÂ   r«   r¬   re   rf   rg   rä   r  rÀ   Z_add_writerÚ_write_readyZ_maybe_pause_protocol)r!   r3   ÚnrJ   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   )r|   r  rÂ   r  r«   r¬   re   rf   rg   r/   r  rÀ   Ú_remove_writerrä   r  Z_maybe_resume_protocolrÄ   ræ   rç   )r!   r  rJ   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ù   )	rS   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   r]   <  s"   %	#	

r]   c                   @   s   e Zd Zdd„ ZdS )rb   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)ri   rj   rk   rl   Úuniversal_newlinesrm   Úwb)Ú	buffering)
Ú
subprocessÚPIPEr~   Ú
socketpairÚPopenÚ_procr'   rÖ   Údetachrj   )	r!   rI   ri   rj   rk   rl   rm   rn   Zstdin_wr   r   r   Ú_start  s,    
ÿþþ
þz_UnixSubprocessTransport._startN)r»   r¼   r½   r!  r   r   r   r   rb   	  s   rb   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!   rs   rH   rI   r   r   r   rc   9  s    	z&AbstractChildWatcher.add_child_handlerc                 C   s
   t ƒ ‚d S r   r"  ©r!   rs   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½   rc   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À   r0  r,   r-   ÚRuntimeWarningÚvaluesræ   r|   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µ   )r0  rM   r|   Z
pidfd_openrÀ   rË   Ú_do_wait)r!   rs   rH   rI   Zexistingr9  r   r   r   rc   ™  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)r0  ÚpoprÀ   ræ   r|   ÚwaitpidÚChildProcessErrorr   r  Ú_compute_returncoder'   )r!   rs   r9  rH   rI   r:  Ústatusrt   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)r0  r=  rN   rÀ   ræ   r|   r'   )r!   rs   r9  r:  r   r   r   r&  µ  s    
z&PidfdChildWatcher.remove_child_handlerN)r»   r¼   r½   r   r)  r.  r`   r'   r(  rc   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   )r|   ÚWIFSIGNALEDÚWTERMSIGÚ	WIFEXITEDÚWEXITSTATUS)rA  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 )Ú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   r5  ré   r   r   r   r'   Ó  s    zBaseChildWatcher.closec                 C   s   | j d uo| j  ¡ S r   r4  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 r6  )rÀ   r0  r,   r-   r7  r+   r<   ÚSIGCHLDrL   Ú	_sig_chldrI  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ý   )rI  re   rf   rg   rÀ   rþ   r  r   r   r   rK  ó  s    þzBaseChildWatcher._sig_chldN)
r»   r¼   r½   r   r'   r`   rH  rI  r(  rK  r   r   r   r   rF  Í  s   rF  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   )r0  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   )r0  rH  r$  r   r   r   rc     s    z"SafeChildWatcher.add_child_handlerc                 C   s(   z| j |= W dS  ty"   Y dS 0 d S ©NTF©r0  rN   r%  r   r   r   r&    s
    z%SafeChildWatcher.remove_child_handlerc                 C   s   t | jƒD ]}|  |¡ q
d S r   ©r*   r0  rH  r%  r   r   r   rI  $  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 ¡ r¦t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ú   )r|   r>  ÚWNOHANGr?  r   r  r@  rÀ   rå   rè   r0  r=  rN   )r!   rG  rs   rA  rt   rH   rI   r   r   r   rH  )  s0    þ

ÿ
ÿzSafeChildWatcher._do_waitpid)r»   r¼   r½   r'   r)  r.  rc   r&  rI  rH  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   Ú	threadingÚLockÚ_lockÚ_zombiesÚ_forksré   r#   r   r   r   V  s    

zFastChildWatcher.__init__c                    s"   | j  ¡  | j ¡  tƒ  ¡  d S r   )r0  r/   rW  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   )rV  rX  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)rV  rX  rW  rB   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   )rV  rW  r=  rN   r0  )r!   rs   rH   rI   rt   r   r   r   rc   u  s    2z"FastChildWatcher.add_child_handlerc                 C   s(   z| j |= W dS  ty"   Y dS 0 d S rM  rN  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 ¡ r’t d||¡ Y W d   ƒ q d }Y n0 | j ¡ rÄt d||¡ W d   ƒ n1 sØ0    Y  |d u rút d||¡ q |||g|¢R Ž  q d S )Nr5   r   z,unknown process %s exited with returncode %srQ  z8Caught subprocess termination from unknown pid: %d -> %d)r|   r>  rS  r?  r@  rV  r0  r=  rN   rX  rW  rÀ   rå   r   rè   r  )r!   rs   rA  rt   rH   rI   r   r   r   rI  Š  s:    

þ

ÿ"þz FastChildWatcher._do_waitpid_all)r»   r¼   r½   r   r'   r)  r.  rc   r&  rI  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   )r0  Ú_saved_sighandlerré   r   r   r   r   È  s    zMultiLoopChildWatcher.__init__c                 C   s
   | j d uS r   )rY  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)	r0  r/   rY  r<   Ú	getsignalrJ  rK  r   r  )r!   rR   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!   r1  Úexc_valÚexc_tbr   r   r   r.  Þ  s    zMultiLoopChildWatcher.__exit__c                 G   s&   t  ¡ }|||f| j|< |  |¡ d S r   )r   Úget_running_loopr0  rH  )r!   rs   rH   rI   rÎ   r   r   r   rc   á  s    z'MultiLoopChildWatcher.add_child_handlerc                 C   s(   z| j |= W dS  ty"   Y dS 0 d S rM  rN  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)rY  r<   rJ  rK  r   r  rQ   rD   r'  r   r   r   r(  ï  s    


z!MultiLoopChildWatcher.attach_loopc                 C   s   t | jƒD ]}|  |¡ q
d S r   rO  r%  r   r   r   rI     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 | 
¡ r¬t d||¡ n0|rÆ| ¡ rÆt d	||¡ |j|||g|¢R Ž  d S )
Nr<  rP  Fr   TrR  rú   ú%Loop %r that handles pid %r is closedrQ  )r|   r>  rS  r?  r   r  r@  r0  r=  rN   Ú	is_closedrå   rè   rr   )	r!   rG  rs   rA  rt   Z	debug_logrÎ   rH   rI   r   r   r   rH    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 )NrL  Trú   )rI  re   rf   rg   r   r  )r!   r   r   r   r   r   rK  )  s    zMultiLoopChildWatcher._sig_chldN)r»   r¼   r½   r   r`   r'   r)  r.  rc   r&  r(  rI  rH  rK  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*   rc  r8  rß   )r!   Úthreadsri  r   r   r   rd  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   r[  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   )re  rg  r   r   r   rj  W  s   ÿz0ThreadedChildWatcher.__del__.<locals>.<listcomp>z0 has registered but not finished child processesr%   )r*   rc  r8  r$   r.   )r!   rö   rk  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ÚnamerI   rf  )	r   r^  rT  ÚThreadrH  Únextrb  rc  Ústart)r!   rs   rH   rI   rÎ   ri  r   r   r   rc   ^  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<  rP  rQ  r_  )r|   r>  r?  r   r  r@  rå   rè   r`  rr   rc  r=  )r!   rÎ   rG  rH   rI   rs   rA  rt   r   r   r   rH  p  s$    þ
ÿz ThreadedChildWatcher._do_waitpidN)r»   r¼   r½   r   r`   r'   rd  r)  r.  r,   r-   r÷   rc   r&  r(  rH  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   rV  rr  r   rT  Ú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_looprr  rT  rs  rt  r(  r'  r#   r   r   rw  š  s
    
ÿz*_UnixDefaultEventLoopPolicy.set_event_loopc                 C   s   | j d u r|  ¡  | j S r   )rr  rv  ré   r   r   r   r_   ¨  s    
z-_UnixDefaultEventLoopPolicy.get_child_watcherc                 C   s   | j d ur| j  ¡  || _ d S r   )rr  r'   )r!   ro   r   r   r   Úset_child_watcher²  s    

z-_UnixDefaultEventLoopPolicy.set_child_watcher)r»   r¼   r½   r   Z_loop_factoryr   rv  rw  r_   rx  r¾   r   r   r#   r   rq  ‹  s   
rq  )2rF   r›   ra  r|   rÜ   r<   r~   r   r  r(   rT  r,   Ú r   r   r   r   r   r   r	   r
   r   r   Úlogr   Ú__all__r  ÚImportErrorr   ZBaseSelectorEventLoopr   ZReadTransportrV   Z_FlowControlMixinZWriteTransportr]   ZBaseSubprocessTransportrb   r   r   r@  rF  r   r   r   r   ZBaseDefaultEventLoopPolicyrq  r   r   r   r   r   r   Ú<module>   s`   	
    	ÿ NON5Ji}Y2