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

  \³O  ã               @   sú   d g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 G dd„ de	je	jƒZG dd„ dee	jƒZG dd„ dee	jƒZG dd„ deƒZG dd„ deee	jƒZG dd„ deee	jƒZG dd „ d ejƒZdS )ÚBaseProactorEventLoopé    Né   )Úbase_events)Úcompat)Ú	constants)Úfutures)Ússlproto)Ú
transports)Úloggerc                   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	e
jrTdd„ Zddd„Zdd„ Zdd„ Zdd„ Z‡  ZS )Ú_ProactorBasePipeTransportNc                s˜   t ƒ j||ƒ | j|ƒ || _|| _|| _d | _d | _d | _d| _	d| _
d| _d| _| jd k	rh| jjƒ  | jj| jj| ƒ |d k	r”| jjtj|d ƒ d S )Nr   F)ÚsuperÚ__init__Ú
_set_extraÚ_sockÚ	_protocolÚ_serverÚ_bufferÚ	_read_futÚ
_write_futÚ_pending_writeÚ
_conn_lostÚ_closingÚ_eof_writtenZ_attachÚ_loopÚ	call_soonZconnection_mader   Z_set_result_unless_cancelled)ÚselfÚloopÚsockÚprotocolÚwaiterÚextraÚserver)Ú	__class__© ú//usr/lib64/python3.6/asyncio/proactor_events.pyr      s$    



z#_ProactorBasePipeTransport.__init__c             C   s¾   | j jg}| jd kr |jdƒ n| jr0|jdƒ | jd k	rN|jd| jjƒ  ƒ | jd k	rh|jd| j ƒ | jd k	r‚|jd| j ƒ | jr t	| jƒ}|jd| ƒ | j
r°|jdƒ dd	j|ƒ S )
NÚclosedÚclosingzfd=%szread=%szwrite=%rzwrite_bufsize=%szEOF writtenz<%s>ú )r"   Ú__name__r   Úappendr   Úfilenor   r   r   Úlenr   Újoin)r   ÚinfoÚbufsizer#   r#   r$   Ú__repr__/   s"    







z#_ProactorBasePipeTransport.__repr__c             C   s   || j d< d S )NÚpipe)Ú_extra)r   r   r#   r#   r$   r   B   s    z%_ProactorBasePipeTransport._set_extrac             C   s
   || _ d S )N)r   )r   r   r#   r#   r$   Úset_protocolE   s    z'_ProactorBasePipeTransport.set_protocolc             C   s   | j S )N)r   )r   r#   r#   r$   Úget_protocolH   s    z'_ProactorBasePipeTransport.get_protocolc             C   s   | j S )N)r   )r   r#   r#   r$   Ú
is_closingK   s    z%_ProactorBasePipeTransport.is_closingc             C   s^   | j r
d S d| _ |  jd7  _| j r@| jd kr@| jj| jd ƒ | jd k	rZ| jjƒ  d | _d S )NTr   )	r   r   r   r   r   r   Ú_call_connection_lostr   Úcancel)r   r#   r#   r$   ÚcloseN   s    

z _ProactorBasePipeTransport.closec             C   s*   | j d k	r&tjd|  t| d� | jƒ  d S )Nzunclosed transport %r)Úsource)r   ÚwarningsÚwarnÚResourceWarningr7   )r   r#   r#   r$   Ú__del__]   s    
z"_ProactorBasePipeTransport.__del__ú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)Úexc_info)ÚmessageÚ	exceptionZ	transportr   )
Ú
isinstancer   Z_FATAL_ERROR_IGNOREr   Ú	get_debugr
   ÚdebugÚcall_exception_handlerr   Ú_force_close)r   Úexcr?   r#   r#   r$   Ú_fatal_errorc   s    
z'_ProactorBasePipeTransport._fatal_errorc             C   sj   | j r
d S d| _ |  jd7  _| jr4| jjƒ  d | _| jrJ| jjƒ  d | _d| _d | _| jj| j	|ƒ d S )NTr   r   )
r   r   r   r6   r   r   r   r   r   r5   )r   rF   r#   r#   r$   rE   p   s    

z'_ProactorBasePipeTransport._force_closec             C   s^   z| j j|ƒ W d t| jdƒr,| jjtjƒ | jjƒ  d | _| j}|d k	rX|j	ƒ  d | _X d S )NÚshutdown)
r   Zconnection_lostÚhasattrr   rH   ÚsocketZ	SHUT_RDWRr7   r   Z_detach)r   rF   r!   r#   r#   r$   r5      s    
z0_ProactorBasePipeTransport._call_connection_lostc             C   s"   | j }| jd k	r|t| jƒ7 }|S )N)r   r   r+   )r   Úsizer#   r#   r$   Úget_write_buffer_size�   s    
z0_ProactorBasePipeTransport.get_write_buffer_size)NNN)r=   )r(   Ú
__module__Ú__qualname__r   r/   r   r2   r3   r4   r7   r   ZPY34r<   rG   rE   r5   rL   Ú__classcell__r#   r#   )r"   r$   r      s    
r   c                   s8   e Zd Zd
‡ fdd„	Zdd„ Zdd„ Zddd	„Z‡  ZS )Ú_ProactorReadPipeTransportNc                s4   t ƒ j||||||ƒ d| _d| _| jj| jƒ d S )NF)r   r   Ú_pausedÚ_reschedule_on_resumer   r   Ú_loop_reading)r   r   r   r   r   r    r!   )r"   r#   r$   r   ›   s    z#_ProactorReadPipeTransport.__init__c             C   s0   | j s| jrd S d| _| jjƒ r,tjd| ƒ d S )NTz%r pauses reading)r   rQ   r   rB   r
   rC   )r   r#   r#   r$   Úpause_reading¢   s
    
z(_ProactorReadPipeTransport.pause_readingc             C   sP   | j s| j rd S d| _| jr6| jj| j| jƒ d| _| jjƒ rLtj	d| ƒ d S )NFz%r resumes reading)
r   rQ   rR   r   r   rS   r   rB   r
   rC   )r   r#   r#   r$   Úresume_reading©   s    
z)_ProactorReadPipeTransport.resume_readingc             C   sŽ  | j rd| _d S d }�z"yH|d k	r0d | _|jƒ }| jr>d }d S |dkrJd S | jjj| jdƒ| _W nÆ t	k
r® } z2| js†| j
|dƒ n| jjƒ ržtjddd� W Y d d }~X nˆ tk
rØ } z| j|ƒ W Y d d }~X n^ tk
�r } z| j
|dƒ W Y d d }~X n0 tjk
�r&   | j�s"‚ Y nX | jj| jƒ W d |�rN| jj|ƒ n:|d k	�rˆ| jjƒ �rptjd| ƒ | jjƒ }|�sˆ| jƒ  X d S )NTó    i   z"Fatal read error on pipe transportz*Read error on pipe transport while closing)r>   z%r received EOF)rQ   rR   r   Úresultr   r   Ú	_proactorÚrecvr   ÚConnectionAbortedErrorrG   rB   r
   rC   ÚConnectionResetErrorrE   ÚOSErrorr   ÚCancelledErrorÚadd_done_callbackrS   r   Zdata_receivedZeof_receivedr7   )r   ÚfutÚdatarF   Z	keep_openr#   r#   r$   rS   ³   sH    


z(_ProactorReadPipeTransport._loop_reading)NNN)N)r(   rM   rN   r   rT   rU   rS   rO   r#   r#   )r"   r$   rP   —   s
    
rP   c               @   s6   e Zd Zdd„ Zddd„Zdd„ Zdd	„ Zd
d„ ZdS )Ú_ProactorBaseWritePipeTransportc             C   s¸   t |tttfƒs&dt|ƒj }t|ƒ‚| jr4tdƒ‚|s<d S | j	rj| j	t
jkrXtjdƒ |  j	d7  _	d S | jd kr†| jt|ƒd� n.| js t|ƒ| _| jƒ  n| jj|ƒ | jƒ  d S )Nz3data argument must be a bytes-like object, not '%s'zwrite_eof() already calledzsocket.send() raised exception.r   )r`   )rA   ÚbytesÚ	bytearrayÚ
memoryviewÚtyper(   Ú	TypeErrorr   ÚRuntimeErrorr   r   Z!LOG_THRESHOLD_FOR_CONNLOST_WRITESr
   Úwarningr   Ú_loop_writingr   Ú_maybe_pause_protocolÚextend)r   r`   Úmsgr#   r#   r$   Úwriteé   s(    



z%_ProactorBaseWritePipeTransport.writeNc             C   s  y¶d | _ d| _|r|jƒ  |d kr.| j}d | _|sf| jrH| jj| jd ƒ | jr\| j	j
tjƒ | jƒ  nN| jjj| j	|ƒ| _ | j jƒ s¦t|ƒ| _| j j| jƒ | jƒ  n| j j| jƒ W nZ tk
râ } z| j|ƒ W Y d d }~X n0 tk
�r } z| j|dƒ W Y d d }~X nX d S )Nr   z#Fatal write error on pipe transport)r   r   rW   r   r   r   r   r5   r   r   rH   rJ   ÚSHUT_WRZ_maybe_resume_protocolrX   ÚsendÚdoner+   r^   ri   rj   r[   rE   r\   rG   )r   Úfr`   rF   r#   r#   r$   ri     s0    



z-_ProactorBaseWritePipeTransport._loop_writingc             C   s   dS )NTr#   )r   r#   r#   r$   Úcan_write_eof0  s    z-_ProactorBaseWritePipeTransport.can_write_eofc             C   s   | j ƒ  d S )N)r7   )r   r#   r#   r$   Ú	write_eof3  s    z)_ProactorBaseWritePipeTransport.write_eofc             C   s   | j d ƒ d S )N)rE   )r   r#   r#   r$   Úabort6  s    z%_ProactorBaseWritePipeTransport.abort)NN)r(   rM   rN   rm   ri   rr   rs   rt   r#   r#   r#   r$   ra   å   s
   $
#ra   c                   s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú_ProactorWritePipeTransportc                s4   t ƒ j||Ž | jjj| jdƒ| _| jj| jƒ d S )Né   )	r   r   r   rX   rY   r   r   r^   Ú_pipe_closed)r   ÚargsÚkw)r"   r#   r$   r   ;  s    z$_ProactorWritePipeTransport.__init__c             C   s@   |j ƒ rd S | jrd S d | _| jd k	r4| jtƒ ƒ n| jƒ  d S )N)Z	cancelledr   r   r   rE   ÚBrokenPipeErrorr7   )r   r_   r#   r#   r$   rw   @  s    
z(_ProactorWritePipeTransport._pipe_closed)r(   rM   rN   r   rw   rO   r#   r#   )r"   r$   ru   :  s   ru   c               @   s   e Zd Zdd„ Zdd„ ZdS )Ú_ProactorDuplexPipeTransportc             C   s   dS )NFr#   )r   r#   r#   r$   rr   U  s    z*_ProactorDuplexPipeTransport.can_write_eofc             C   s   t ‚d S )N)ÚNotImplementedError)r   r#   r#   r$   rs   X  s    z&_ProactorDuplexPipeTransport.write_eofN)r(   rM   rN   rr   rs   r#   r#   r#   r$   r{   P  s   r{   c                   s6   e Zd Zd
‡ fdd„	Zdd„ Zdd„ Zdd	„ Z‡  ZS )Ú_ProactorSocketTransportNc                s$   t ƒ j||||||ƒ tj|ƒ d S )N)r   r   r   Z_set_nodelay)r   r   r   r   r   r    r!   )r"   r#   r$   r   a  s    z!_ProactorSocketTransport.__init__c             C   s¨   || j d< y|jƒ | j d< W n4 tjtfk
rP   | jjƒ rLtjd|dd� Y nX d| j kr¤y|j	ƒ | j d< W n4 tjtfk
r¢   | jjƒ ržtjd|dd� Y nX d S )NrJ   Zsocknamezgetsockname() failed on %rT)r>   Úpeernamezgetpeername() failed on %r)
r1   ZgetsocknamerJ   ÚerrorÚAttributeErrorr   rB   r
   rh   Zgetpeername)r   r   r#   r#   r$   r   f  s    



z#_ProactorSocketTransport._set_extrac             C   s   dS )NTr#   )r   r#   r#   r$   rr   v  s    z&_ProactorSocketTransport.can_write_eofc             C   s2   | j s| jrd S d| _| jd kr.| jjtjƒ d S )NT)r   r   r   r   rH   rJ   rn   )r   r#   r#   r$   rs   y  s
    
z"_ProactorSocketTransport.write_eof)NNN)r(   rM   rN   r   r   rr   rs   rO   r#   r#   )r"   r$   r}   \  s
    r}   c                   sÒ   e Zd Z‡ fdd„Zd-dd„Zd.dddddœdd	„Zd/d
d„Zd0dd„Zd1dd„Z‡ 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d2d d!„Zd"d#„ Zd3d%d&„Zd'd(„ Zd)d*„ Zd+d,„ Z‡  ZS )4r   c                sH   t ƒ jƒ  tjd|jjƒ || _|| _d | _i | _	|j
| ƒ | jƒ  d S )NzUsing proactor: %s)r   r   r
   rC   r"   r(   rX   Ú	_selectorÚ_self_reading_futureÚ_accept_futuresZset_loopÚ_make_self_pipe)r   Zproactor)r"   r#   r$   r   ƒ  s    

zBaseProactorEventLoop.__init__Nc             C   s   t | |||||ƒS )N)r}   )r   r   r   r   r    r!   r#   r#   r$   Ú_make_socket_transport�  s    
z,BaseProactorEventLoop._make_socket_transportF)Úserver_sideÚserver_hostnamer    r!   c      
      C   s<   t jƒ stdƒ‚t j| |||||ƒ}	t| ||	||d� |	jS )NzOProactor event loop requires Python 3.5 or newer (ssl.MemoryBIO) to support SSL)r    r!   )r   Z_is_sslproto_availabler|   ZSSLProtocolr}   Z_app_transport)
r   Zrawsockr   Ú
sslcontextr   r†   r‡   r    r!   Zssl_protocolr#   r#   r$   Ú_make_ssl_transport’  s    
z)BaseProactorEventLoop._make_ssl_transportc             C   s   t | ||||ƒS )N)r{   )r   r   r   r   r    r#   r#   r$   Ú_make_duplex_pipe_transport   s    z1BaseProactorEventLoop._make_duplex_pipe_transportc             C   s   t | ||||ƒS )N)rP   )r   r   r   r   r    r#   r#   r$   Ú_make_read_pipe_transport¥  s    z/BaseProactorEventLoop._make_read_pipe_transportc             C   s   t | ||||ƒS )N)ru   )r   r   r   r   r    r#   r#   r$   Ú_make_write_pipe_transport©  s    z0BaseProactorEventLoop._make_write_pipe_transportc                sP   | j ƒ rtdƒ‚| jƒ rd S | jƒ  | jƒ  | jjƒ  d | _d | _tƒ jƒ  d S )Nz!Cannot close a running event loop)	Z
is_runningrg   Ú	is_closedÚ_stop_accept_futuresÚ_close_self_piperX   r7   r�   r   )r   )r"   r#   r$   r7   ¯  s    
zBaseProactorEventLoop.closec             C   s   | j j||ƒS )N)rX   rY   )r   r   Únr#   r#   r$   Ú	sock_recvÁ  s    zBaseProactorEventLoop.sock_recvc             C   s   | j j||ƒS )N)rX   ro   )r   r   r`   r#   r#   r$   Úsock_sendallÄ  s    z"BaseProactorEventLoop.sock_sendallc             C   s   | j j||ƒS )N)rX   Zconnect)r   r   Zaddressr#   r#   r$   Úsock_connectÇ  s    z"BaseProactorEventLoop.sock_connectc             C   s   | j j|ƒS )N)rX   Úaccept)r   r   r#   r#   r$   Úsock_acceptÊ  s    z!BaseProactorEventLoop.sock_acceptc             C   s   t ‚d S )N)r|   )r   r#   r#   r$   Ú_socketpairÍ  s    z!BaseProactorEventLoop._socketpairc             C   sL   | j d k	r| j jƒ  d | _ | jjƒ  d | _| jjƒ  d | _|  jd8  _d S )Nr   )r‚   r6   Ú_ssockr7   Ú_csockÚ_internal_fds)r   r#   r#   r$   r�   Ð  s    



z&BaseProactorEventLoop._close_self_pipec             C   sF   | j ƒ \| _| _| jjdƒ | jjdƒ |  jd7  _| j| jƒ d S )NFr   )r–   r—   r˜   Zsetblockingr™   r   Ú_loop_self_reading)r   r#   r#   r$   r„   Ú  s
    z%BaseProactorEventLoop._make_self_pipec             C   s„   y$|d k	r|j ƒ  | jj| jdƒ}W nH tjk
r:   d S  tk
rl } z| jd|| dœƒ W Y d d }~X nX || _|j	| j
ƒ d S )Ni   z.Error on reading from the event loop self pipe)r?   r@   r   )rW   rX   rY   r—   r   r]   Ú	ExceptionrD   r‚   r^   rš   )r   rq   rF   r#   r#   r$   rš   â  s    z(BaseProactorEventLoop._loop_self_readingc             C   s   | j jdƒ d S )Nó    )r˜   ro   )r   r#   r#   r$   Ú_write_to_selfô  s    z$BaseProactorEventLoop._write_to_selféd   c                s&   d‡ ‡‡‡‡‡fdd„	‰ ˆj ˆ ƒ d S )Nc                s"  y†| d k	rl| j ƒ \}}ˆjr,tjdˆ||ƒ ˆƒ }ˆd k	rVˆj||ˆdd|iˆd� nˆj||d|iˆd� ˆjƒ rxd S ˆjjˆƒ} W n~ t	k
ræ } zDˆj
ƒ dkrÀˆjd|ˆdœƒ ˆjƒ  nˆjrÖtjd	ˆdd
� W Y d d }~X n8 tjk
�r   ˆjƒ  Y nX | ˆjˆj
ƒ < | jˆ ƒ d S )Nz#%r got a new connection from %r: %rTr~   )r†   r    r!   )r    r!   r   zAccept failed on a socket)r?   r@   rJ   zAccept failed on socket %r)r>   éÿÿÿÿ)rW   Z_debugr
   rC   r‰   r…   r�   rX   r”   r\   r*   rD   r7   r   r]   rƒ   r^   )rq   ZconnZaddrr   rF   )r   Úprotocol_factoryr   r!   r   rˆ   r#   r$   r   ú  s>    


z2BaseProactorEventLoop._start_serving.<locals>.loop)N)r   )r   r    r   rˆ   r!   Zbacklogr#   )r   r    r   r!   r   rˆ   r$   Ú_start_serving÷  s    $z$BaseProactorEventLoop._start_servingc             C   s   d S )Nr#   )r   Z
event_listr#   r#   r$   Ú_process_events   s    z%BaseProactorEventLoop._process_eventsc             C   s*   x| j jƒ D ]}|jƒ  qW | j jƒ  d S )N)rƒ   Úvaluesr6   Úclear)r   Zfuturer#   r#   r$   rŽ   $  s    z*BaseProactorEventLoop._stop_accept_futuresc             C   s    | j ƒ  | jj|ƒ |jƒ  d S )N)rŽ   rX   Ú_stop_servingr7   )r   r   r#   r#   r$   r¥   )  s    z#BaseProactorEventLoop._stop_serving)NNN)N)NN)NN)NN)N)NNrž   )r(   rM   rN   r   r…   r‰   rŠ   r‹   rŒ   r7   r‘   r’   r“   r•   r–   r�   r„   rš   r�   r¡   r¢   rŽ   r¥   rO   r#   r#   )r"   r$   r   �  s4   
 
 
 
 



()Ú__all__rJ   r9   Ú r   r   r   r   r   r	   Úlogr
   Z_FlowControlMixinZBaseTransportr   ZReadTransportrP   ZWriteTransportra   ru   Z	Transportr{   r}   ZBaseEventLoopr   r#   r#   r#   r$   Ú<module>   s0    MT
#