
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3

  \”‘  ã               @   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W n ek
�r(   dd„ ZY nX G dd„ dejƒZe edƒ�rRdd„ Z!nd dl"Z"dd„ Z!G d d!„ d!ej#ƒZ$G d"d#„ d#ej%ej&ƒZ'e ed$ƒ�ržej(Z)nd dl"Z"d%d&„ Z)G d'd(„ d(ej*ƒZ+G d)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j0ƒZ1eZ2e1Z3dS )0é    Né   )Úbase_events)Úbase_subprocess)Úcompat)Ú	constants)Ú
coroutines)Úevents)Úfutures)Úselector_events)Ú	selectors)Ú
transports)Ú	coroutine)ÚloggerÚSelectorEventLoopÚAbstractChildWatcherÚSafeChildWatcherÚFastChildWatcherÚDefaultEventLoopPolicyZwin32z+Signals are not really supported on Windowsc             C   s   d S )N© )ÚsignumÚframer   r   ú+/usr/lib64/python3.6/asyncio/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„Zd#dd„Zed$dd„ƒZdd„ Zeddddœdd„ƒZed%ddddœdd „ƒZ‡  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)ÚsocketZ
socketpair)r   r   r   r   Ú_socketpair;   s    z"_UnixSelectorEventLoop._socketpairc                s^   t ƒ jƒ  tjƒ s2xFt| jƒD ]}| j|ƒ qW n(| jrZtjd| ›d�t	| d� | j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   Úsig)r!   r   r   r%   >   s    
z_UnixSelectorEventLoop.closec             C   s"   x|D ]}|sq| j |ƒ qW d S )N)Ú_handle_signal)r   Údatar   r   r   r   Ú_process_self_dataL   s    
z)_UnixSelectorEventLoop._process_self_datac          +   G   sH  t j|ƒst j|ƒrtdƒ‚| j|ƒ | jƒ  ytj| jj	ƒ ƒ W n2 t
tfk
rt } ztt|ƒƒ‚W Y d d }~X nX tj||| ƒ}|| j|< ytj|tƒ tj|dƒ W n˜ tk
�rB } zz| j|= | j�sytjdƒ W n4 t
tfk
�r } ztjd|ƒ W Y d d }~X nX |jtjk�r0tdj|ƒƒ‚n‚ W Y d d }~X nX d 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_signalZ_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_handlerS   s0    



z)_UnixSelectorEventLoop.add_signal_handlerc             C   s8   | j j|ƒ}|d krd S |jr*| j|ƒ n
| j|ƒ d S )N)r   ÚgetZ
_cancelledr)   Z_add_callback_signalsafe)r   r.   rD   r   r   r   r/   €   s    z%_UnixSelectorEventLoop._handle_signalc          &   C   sâ   | j |ƒ y| j|= W n tk
r*   dS X |tjkr>tj}ntj}ytj||ƒ W n@ tk
r” } z$|jtj	kr‚t
dj|ƒƒ‚n‚ W Y d d }~X nX | jsÞytjdƒ W n2 ttfk
rÜ } ztjd|ƒ W Y d d }~X nX dS )NFzsig {} cannot be caughtr   zset_wakeup_fd(-1) failed: %sTr2   )r4   r   ÚKeyErrorr5   ÚSIGINTÚdefault_int_handlerÚSIG_DFLr9   r>   r?   r:   r@   r6   r8   r   r=   )r   r.   ZhandlerrC   r   r   r   r)   Š   s(    

z,_UnixSelectorEventLoop.remove_signal_handlerc             C   sH   t |tƒstdj|ƒƒ‚d|  ko,tjk n  sDtdj|tjƒƒ‚d S )Nzsig must be an int, not {!r}r   zsig {} out of range(1, {}))Ú
isinstanceÚintr3   r@   r5   ÚNSIGr8   )r   r.   r   r   r   r4   ª   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   rO   rP   rQ   rR   r   r   r   Ú_make_write_pipe_transport»   s    z1_UnixSelectorEventLoop._make_write_pipe_transportc	             k   s´   t jƒ �¢}
| jƒ }t| |||||||f||dœ|	—Ž}|
j|jƒ | j|ƒ y|E d H  W n& tk
r~ } z
|}W Y d d }~X nX d }|d k	r¦|jƒ  |j	ƒ E d H  |‚W d Q R X |S )N)rQ   rR   )
r   Úget_child_watcherZcreate_futureÚ_UnixSubprocessTransportÚadd_child_handlerZget_pidÚ_child_watcher_callbackÚ	Exceptionr%   Z_wait)r   rP   rB   ÚshellÚstdinÚstdoutÚstderrÚbufsizerR   ÚkwargsÚwatcherrQ   ÚtransprC   Ú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Ú
returncoderb   r   r   r   rY   Ý   s    z._UnixSelectorEventLoop._child_watcher_callback)ÚsslÚsockÚserver_hostnamec            c   sî   |r|d kr&t dƒ‚n|d k	r&t dƒ‚|d k	rŠ|d k	r>t dƒ‚tjtjtjdƒ}y |jdƒ | j||ƒE d H  W qÌ   |jƒ  ‚ Y qÌX nB|d kršt dƒ‚|jtjks´tj	|j
ƒ rÂt dj|ƒƒ‚|jdƒ | j||||ƒE d 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})r8   r"   ÚAF_UNIXÚSOCK_STREAMÚsetblockingZsock_connectr%   Úfamilyr   Ú_is_stream_socketÚtyper@   Z_create_connection_transport)r   Úprotocol_factoryr   rg   rh   ri   Ú	transportrP   r   r   r   Úcreate_unix_connectionà   s8    


z-_UnixSelectorEventLoop.create_unix_connectionéd   )rh   Úbacklogrg   c      
   !   C   s¤  t |tƒrtdƒ‚|d k	�r0|d k	r,tdƒ‚t|ƒ}tjtjtjƒ}|d d
kr´y tj	t
j|ƒjƒrnt
j|ƒ W nB tk
r„   Y n0 tk
r² } ztjd||ƒ W Y d d }~X nX y|j|ƒ W nj tk
�r } z8|jƒ  |jtjk�rdj|ƒ}ttj|ƒd ‚n‚ W Y d d }~X n   |jƒ  ‚ Y nX n>|d k�rBtdƒ‚|jtjk�s`tj|jƒ �rnt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   ru   )rK   Úboolr3   r8   Ú_fspathr"   rj   rk   ÚstatÚS_ISSOCKÚosÚst_modeÚremoveÚFileNotFoundErrorr9   r   ÚerrorZbindr%   r>   Z
EADDRINUSEr@   rm   r   rn   ro   ZServerZlistenrl   Z_start_serving)
r   rp   r   rh   rt   rg   rc   rC   ÚmsgZserverr   r   r   Úcreate_unix_server  sP    

 




z)_UnixSelectorEventLoop.create_unix_server)N)NN)NN)N)N)Ú__name__Ú
__module__Ú__qualname__r   r#   r%   r1   rE   r/   r)   r4   rS   rU   r   rd   rY   rr   r€   Ú__classcell__r   r   )r!   r   r   1   s*   -
  
 
%r   Úset_blockingc             C   s   t j| dƒ d S )NF)rz   r…   )Úfdr   r   r   Ú_set_nonblockingB  s    r‡   c             C   s,   t j | t jƒ}|tjB }t j | t j|ƒ d S )N)ÚfcntlZF_GETFLrz   Ú
O_NONBLOCKZF_SETFL)r†   Úflagsr   r   r   r‡   G  s    
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rhdd„ Zd!dd„Zdd„ Zdd„ Z‡  ZS )"rN   é   i   Nc                sÐ   t ƒ j|ƒ || jd< || _|| _|jƒ | _|| _d| _t	j
| jƒj}tj|ƒpbtj|ƒpbt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 )NrO   Fz)Pipe transport is for pipes/sockets only.)r   r   Ú_extraÚ_loopÚ_piper7   Ú_filenoÚ	_protocolÚ_closingrz   Úfstatr{   rx   ÚS_ISFIFOry   ÚS_ISCHRr8   r‡   Ú	call_soonÚconnection_madeÚ_add_readerÚ_read_readyr	   Ú_set_result_unless_cancelled)r   ÚlooprO   rP   rQ   rR   Úmode)r!   r   r   r   Q  s,    






z_UnixReadPipeTransport.__init__c             C   s¼   | j jg}| jd kr |jdƒ n| jr0|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   Z
EVENT_READÚjoin)r   r=   r    rŸ   r   r   r   Ú__repr__n  s$    




z_UnixReadPipeTransport.__repr__c             C   sº   yt j| j| jƒ}W nD ttfk
r,   Y nŠ tk
rX } z| j|dƒ W Y d d }~X n^X |rl| jj	|ƒ nJ| 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)rz   Úreadr�   Úmax_sizeÚBlockingIOErrorÚInterruptedErrorr9   Ú_fatal_errorr�   Zdata_receivedr�   Ú	get_debugr   r=   r‘   Ú_remove_readerr•   Zeof_receivedÚ_call_connection_lost)r   r0   rC   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   rP   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   s,   | j d k	r(tjd|  t| d� | j jƒ  d S )Nzunclosed transport %r)r$   )rŽ   r*   r+   r,   r%   )r   r   r   r   Ú__del__­  s    
z_UnixReadPipeTransport.__del__úFatal error on pipe transportc             C   sZ   t |tƒr4|jtjkr4| jjƒ rLtjd| |dd� n| jj||| | j	dœƒ | j
|ƒ d S )Nz%r: %sT)Úexc_info)ÚmessageÚ	exceptionrq   rP   )rK   r9   r>   ZEIOr�   r­   r   ÚdebugÚcall_exception_handlerr�   rµ   )r   rC   r¹   r   r   r   r¬   ³  s    
z#_UnixReadPipeTransport._fatal_errorc             C   s(   d| _ | jj| jƒ | jj| j|ƒ d S )NT)r‘   r�   r®   r�   r•   r¯   )r   rC   r   r   r   rµ   Á  s    z_UnixReadPipeTransport._closec             C   s4   z| j j|ƒ W d | jjƒ  d | _d | _ d | _X d S )N)r�   Úconnection_lostrŽ   r%   r�   )r   rC   r   r   r   r¯   Æ  s    
z,_UnixReadPipeTransport._call_connection_losti   )NN)r·   )r�   r‚   rƒ   r©   r   r§   r˜   r°   r±   r²   r³   r´   r%   r   ÚPY34r¶   r¬   rµ   r¯   r„   r   r   )r!   r   rN   M  s   
rN   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r|dd„ Zdd„ Zd&dd „Zd'd!d"„Zd#d$„ Z‡  ZS )(rT   Nc       
         sü   t ƒ j||ƒ || jd< || _|jƒ | _|| _tƒ | _d| _	d| _
tj| jƒj}tj|ƒ}tj|ƒ}tj|ƒ}	|px|px|	s”d | _d | _d | _tdƒ‚t| jƒ | jj| jj| ƒ |	sÆ|rÞtjjdƒ rÞ| jj| jj| j| jƒ |d k	rø| jjtj|d ƒ d S )NrO   r   Fz?Pipe transport is only for pipes, sockets and character devicesÚaix)r   r   rŒ   rŽ   r7   r�   r�   Ú	bytearrayÚ_bufferÚ
_conn_lostr‘   rz   r’   r{   rx   r”   r“   ry   r8   r‡   r�   r•   r–   r&   ÚplatformÚ
startswithr—   r˜   r	   r™   )
r   rš   rO   rP   rQ   rR   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r0|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   ZEVENT_WRITEÚget_write_buffer_sizer¦   )r   r=   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   s6   | j jƒ rtjd| ƒ | jr*| jtƒ ƒ n| jƒ  d S )Nz%r was closed by peer)r�   r­   r   r=   rÁ   rµ   ÚBrokenPipeError)r   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jdƒ |  jd7  _d S | j	� søyt
j| j|ƒ}W nT ttfk
r„   d}Y n: tk
r¼ } z|  jd7  _| j|dƒ d S d }~X n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)rK   rÀ   Ú
memoryviewrÂ   r‘   r   Z!LOG_THRESHOLD_FOR_CONNLOST_WRITESr   ÚwarningrÁ   rz   Úwriter�   rª   r«   rZ   r¬   rÆ   r�   Z_add_writerÚ_write_readyZ_maybe_pause_protocol)r   r0   ÚnrC   r   r   r   rÊ     s2    

z_UnixWritePipeTransport.writec             C   sè   yt j| j| jƒ}W nj ttfk
r,   Y n¸ tk
r~ } z8| jjƒ  |  jd7  _| j	j
| jƒ | j|dƒ W Y d d }~X nfX |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   )rz   rÊ   r�   rÁ   rª   r«   rZ   r-   rÂ   r�   Ú_remove_writerr¬   rÆ   Z_maybe_resume_protocolr‘   r®   r¯   )r   rÌ   rC   r   r   r   rË   >  s&    


z$_UnixWritePipeTransport._write_readyc             C   s   dS )NTr   )r   r   r   r   Úcan_write_eofX  s    z%_UnixWritePipeTransport.can_write_eofc             C   s8   | j r
d S d| _ | js4| jj| jƒ | jj| jd ƒ d S )NT)r‘   rÁ   r�   r®   r�   r•   r¯   )r   r   r   r   Ú	write_eof[  s    z!_UnixWritePipeTransport.write_eofc             C   s
   || _ d S )N)r�   )r   rP   r   r   r   r²   d  s    z$_UnixWritePipeTransport.set_protocolc             C   s   | j S )N)r�   )r   r   r   r   r³   g  s    z$_UnixWritePipeTransport.get_protocolc             C   s   | j S )N)r‘   )r   r   r   r   r´   j  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%   m  s    z_UnixWritePipeTransport.closec             C   s,   | j d k	r(tjd|  t| d� | j jƒ  d S )Nzunclosed transport %r)r$   )rŽ   r*   r+   r,   r%   )r   r   r   r   r¶   v  s    
z_UnixWritePipeTransport.__del__c             C   s   | j d ƒ d S )N)rµ   )r   r   r   r   Úabort|  s    z_UnixWritePipeTransport.abortúFatal error on pipe transportc             C   sP   t |tjƒr*| jjƒ rBtjd| |dd� n| jj||| | jdœƒ | j	|ƒ d S )Nz%r: %sT)r¸   )r¹   rº   rq   rP   )
rK   r   Z_FATAL_ERROR_IGNOREr�   r­   r   r»   r¼   r�   rµ   )r   rC   r¹   r   r   r   r¬     s    
z$_UnixWritePipeTransport._fatal_errorc             C   sF   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   rC   r   r   r   rµ   �  s    
z_UnixWritePipeTransport._closec             C   s4   z| j j|ƒ W d | jjƒ  d | _d | _ d | _X d S )N)r�   r½   rŽ   r%   r�   )r   rC   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   rT   Ð  s$   %	!	

rT   Úset_inheritablec             C   sN   t tddƒ}tj| tjƒ}|s4tj| tj||B ƒ ntj| tj|| @ ƒ d S )NZ
FD_CLOEXECr   )r¤   rˆ   ZF_GETFDZF_SETFD)r†   ZinheritableZcloexec_flagÚoldr   r   r   Ú_set_inheritable¥  s
    rÔ   c               @   s   e Zd Zdd„ ZdS )rW   c       	   	   K   sv   d }|t jkr*| jjƒ \}}t|jƒ dƒ t j|f||||d|dœ|—Ž| _|d k	rr|jƒ  t	|j
ƒ d|d�| j_d S )NF)r[   r\   r]   r^   Zuniversal_newlinesr_   Úwb)Ú	buffering)Ú
subprocessÚPIPEr�   r#   rÔ   r7   ÚPopenÚ_procr%   r¡   Údetachr\   )	r   rB   r[   r\   r]   r^   r_   r`   Zstdin_wr   r   r   Ú_start±  s    
z_UnixSubprocessTransport._startN)r�   r‚   rƒ   rÜ   r   r   r   r   rW   ¯  s   rW   c               @   s<   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   re   rA   rB   r   r   r   rX   ß  s    	z&AbstractChildWatcher.add_child_handlerc             C   s
   t ƒ ‚d S )N)rÝ   )r   re   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ƒ   rX   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   sf   | j d k	r$|d kr$| jr$tjdtƒ | j d k	r<| j jtjƒ || _ |d k	rb|jtj| j	ƒ | j
ƒ  d S )NzCA loop is being detached from a child watcher with pending handlers)r�   ræ   r*   r+   ÚRuntimeWarningr)   r5   ÚSIGCHLDrE   Ú	_sig_chldré   )r   rš   r   r   r   rß     s    
zBaseChildWatcher.attach_loopc             C   sF   y| j ƒ  W n4 tk
r@ } z| jjd|dœƒ W Y d d }~X nX d S )Nz$Unknown exception in SIGCHLD handler)r¹   rº   )ré   rZ   r�   r¼   )r   rC   r   r   r   rì   1  s    zBaseChildWatcher._sig_chldc             C   s2   t j|ƒrt j|ƒ S t j|ƒr*t j|ƒS |S d S )N)rz   ÚWIFSIGNALEDÚWTERMSIGÚ	WIFEXITEDÚWEXITSTATUS)r   Ústatusr   r   r   Ú_compute_returncode=  s
    


z$BaseChildWatcher._compute_returncodeN)
r�   r‚   rƒ   r   r%   rè   ré   rß   rì   rò   r   r   r   r   rå     s   rå   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 jƒ  tƒ jƒ  d S )N)ræ   r-   r   r%   )r   )r!   r   r   r%   V  s    
zSafeChildWatcher.closec             C   s   | S )Nr   )r   r   r   r   rà   Z  s    zSafeChildWatcher.__enter__c             C   s   d S )Nr   )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�   r:   ræ   rè   )r   re   rA   rB   r   r   r   rX   `  s
    
z"SafeChildWatcher.add_child_handlerc             C   s&   y| j |= dS  tk
r    dS X d S )NTF)ræ   rG   )r   re   r   r   r   rÞ   k  s
    z%SafeChildWatcher.remove_child_handlerc             C   s"   xt | jƒD ]}| j|ƒ qW d S )N)r(   ræ   rè   )r   re   r   r   r   ré   r  s    z SafeChildWatcher._do_waitpid_allc             C   sÆ   yt j|t jƒ\}}W n( tk
r>   |}d}tjd|ƒ Y n0X |dkrLd S | j|ƒ}| jjƒ rntj	d||ƒ y| j
j|ƒ\}}W n. tk
r°   | jjƒ r¬tjd|dd� Y nX |||f|žŽ  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: %rT)r¸   )rz   ÚwaitpidÚWNOHANGÚChildProcessErrorr   rÉ   rò   r�   r­   r»   ræ   ÚpoprG   )r   rç   re   rñ   rf   rA   rB   r   r   r   rè   w  s*    


zSafeChildWatcher._do_waitpid)r�   r‚   rƒ   r%   rà   rä   rX   rÞ   ré   rè   r„   r   r   )r!   r   r   K  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	‡  Z
S )r   c                s$   t ƒ jƒ  tjƒ | _i | _d| _d S )Nr   )r   r   Ú	threadingZ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  _| S Q R X d S )Nr   )rù   rû   )r   r   r   r   rà   ¯  s    zFastChildWatcher.__enter__c          
   C   sV   | j �: |  jd8  _| js$| j r(d S t| jƒ}| jjƒ  W d Q R X tjd|ƒ d S )Nr   z5Caught subprocesses termination from unknown pids: %s)rù   rû   rú   r;   r-   r   rÉ   )r   rá   râ   rã   Zcollateral_victimsr   r   r   rä   µ  s    
zFastChildWatcher.__exit__c             G   sl   | j d krtdƒ‚| j�: y| jj|ƒ}W n" tk
rL   ||f| j|< d S X W d Q R X |||f|žŽ  d S )NzICannot add child handler, the child watcher does not have a loop attached)r�   r:   rù   rú   r÷   rG   ræ   )r   re   rA   rB   rf   r   r   r   rX   Ã  s    
z"FastChildWatcher.add_child_handlerc             C   s&   y| j |= dS  tk
r    dS X d S )NTF)ræ   rG   )r   re   r   r   r   rÞ   Ö  s
    z%FastChildWatcher.remove_child_handlerc             C   sö   xðyt jdt jƒ\}}W n tk
r,   d S X |dkr:d S | j|ƒ}| j�v y| jj|ƒ\}}W nB tk
r¢   | j	rš|| j
|< | jjƒ r˜tjd||ƒ wd }Y nX | jjƒ r¼tjd||ƒ W d Q R X |d krÞtjd||ƒ q|||f|žŽ  qW d S )Nr   r   z,unknown process %s exited with returncode %sz$process %s exited with returncode %sz8Caught subprocess termination from unknown pid: %d -> %dr2   )rz   rô   rõ   rö   rò   rù   ræ   r÷   rG   rû   rú   r�   r­   r   r»   rÉ   )r   re   rñ   rf   rA   rB   r   r   r   ré   Ý  s6    





z FastChildWatcher._do_waitpid_all)r�   r‚   rƒ   r   r%   rà   rä   rX   rÞ   ré   r„   r   r   )r!   r   r   š  s   
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 ƒ jƒ  d | _d S )N)r   r   Ú_watcher)r   )r!   r   r   r     s    
z$_UnixDefaultEventLoopPolicy.__init__c          
   C   sH   t j�8 | jd kr:tƒ | _ttjƒ tjƒr:| jj| j	j
ƒ W d Q R X d S )N)r   rù   rý   r   rK   rø   Úcurrent_threadÚ_MainThreadrß   Ú_localr�   )r   r   r   r   Ú_init_watcher  s    
z)_UnixDefaultEventLoopPolicy._init_watcherc                s6   t ƒ j|ƒ | jd k	r2ttjƒ tjƒr2| jj|ƒ d S )N)r   Úset_event_looprý   rK   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   rV   &  s    
z-_UnixDefaultEventLoopPolicy.get_child_watcherc             C   s   | j d k	r| j jƒ  || _ d S )N)rý   r%   )r   ra   r   r   r   Úset_child_watcher0  s    

z-_UnixDefaultEventLoopPolicy.set_child_watcher)r�   r‚   rƒ   r   Z_loop_factoryr   r  r  rV   r  r„   r   r   )r!   r   rü     s   
rü   )4r>   rz   r5   r"   rx   r×   r&   rø   r*   Ú r   r   r   r   r   r   r	   r
   r   r   r   Úlogr   Ú__all__rÃ   ÚImportErrorr   Úfspathrw   ÚAttributeErrorZBaseSelectorEventLoopr   Úhasattrr‡   rˆ   ZReadTransportrN   Z_FlowControlMixinZWriteTransportrT   rÒ   rÔ   ZBaseSubprocessTransportrW   r   rå   r   r   ZBaseDefaultEventLoopPolicyrü   r   r   r   r   r   r   Ú<module>   sl   

  
  O
F=On2