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

  \³O  ã               @   sþ   d Z 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 )z¦Event loop using a proactor and related classes.

A proactor is a "notify-on-completion" multiplexer.  Currently a
proactor is only implemented on Windows with IOCP.
ÚBaseProactorEventLoopé    Né   )Úbase_events)Úcompat)Ú	constants)Úfutures)Ússlproto)Ú
transports)Úloggerc                   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
ejrXdd„ Zddd„Zdd„ Zdd„ Zdd„ Z‡  ZS )Ú_ProactorBasePipeTransportz*Base class for pipe and socket transports.Nc                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__Ú__doc__r   r/   r   r2   r3   r4   r7   r   ZPY34r<   rG   rE   r5   rL   Ú__classcell__r#   r#   )r"   r$   r      s    
r   c                   s<   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zdd	d
„Z‡  ZS )Ú_ProactorReadPipeTransportzTransport for read pipes.Nc                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   rR   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   rR   rS   r   r   rT   r   rB   r
   rC   )r   r#   r#   r$   Úresume_reading©   s    
z)_ProactorReadPipeTransport.resume_readingc             C   s¬  | j rd| _d S d }�z@yf|d k	rN| j|ks@| jd kr<| js@t‚d | _|jƒ }| jr\d }d S |dkrhd 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
�rD   | j�s@‚ Y nX | jj| jƒ W d |�rl| jj|ƒ n:|d k	�r¦| jjƒ �rŽt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)rR   rS   r   r   ÚAssertionErrorÚresultr   Ú	_proactorÚrecvr   ÚConnectionAbortedErrorrG   rB   r
   rC   ÚConnectionResetErrorrE   ÚOSErrorr   ÚCancelledErrorÚadd_done_callbackrT   r   Zdata_receivedZeof_receivedr7   )r   ÚfutÚdatarF   Z	keep_openr#   r#   r$   rT   ³   sL    



z(_ProactorReadPipeTransport._loop_reading)NNN)N)	r(   rM   rN   rO   r   rU   rV   rT   rP   r#   r#   )r"   r$   rQ   —   s    
rQ   c               @   s:   e Zd ZdZdd„ Zddd„Zdd„ Zd	d
„ Zdd„ ZdS )Ú_ProactorBaseWritePipeTransportzTransport for write pipes.c             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d ks‚t‚| 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   )rb   )rA   ÚbytesÚ	bytearrayÚ
memoryviewÚtyper(   Ú	TypeErrorr   ÚRuntimeErrorr   r   Z!LOG_THRESHOLD_FOR_CONNLOST_WRITESr
   Úwarningr   r   rX   Ú_loop_writingÚ_maybe_pause_protocolÚextend)r   rb   Úmsgr#   r#   r$   Úwriteé   s*    



z%_ProactorBaseWritePipeTransport.writeNc             C   s4  yÒ|| j kst‚d | _ d| _|r(|jƒ  |d kr<| j}d | _|st| jrV| jj| jd ƒ | j	rj| j
jtjƒ | jƒ  n\| jjj| j
|ƒ| _ | j jƒ sÂ| jdks t‚t|ƒ| _| j j| jƒ | jƒ  n| j j| jƒ W n\ 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   rX   r   rY   r   r   r   r   r5   r   r   rH   rJ   ÚSHUT_WRZ_maybe_resume_protocolrZ   ÚsendÚdoner+   r`   rk   rl   r]   rE   r^   rG   )r   Úfrb   rF   r#   r#   r$   rk     s4    



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   rO   ro   rk   rt   ru   rv   r#   r#   r#   r$   rc   å   s   $
#rc   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   rZ   r[   r   r   r`   Ú_pipe_closed)r   ÚargsÚkw)r"   r#   r$   r   ;  s    z$_ProactorWritePipeTransport.__init__c             C   sv   |j ƒ rd S |jƒ dkst‚| jr4| jd ks0t‚d S || jksLt|| jfƒ‚d | _| jd k	rj| jtƒ ƒ n| jƒ  d S )NrW   )	Z	cancelledrY   rX   r   r   r   rE   ÚBrokenPipeErrorr7   )r   ra   r#   r#   r$   ry   @  s    
z(_ProactorWritePipeTransport._pipe_closed)r(   rM   rN   r   ry   rP   r#   r#   )r"   r$   rw   :  s   rw   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú_ProactorDuplexPipeTransportzTransport for duplex pipes.c             C   s   dS )NFr#   )r   r#   r#   r$   rt   U  s    z*_ProactorDuplexPipeTransport.can_write_eofc             C   s   t ‚d S )N)ÚNotImplementedError)r   r#   r#   r$   ru   X  s    z&_ProactorDuplexPipeTransport.write_eofN)r(   rM   rN   rO   rt   ru   r#   r#   r#   r$   r}   P  s   r}   c                   s:   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Z‡  ZS )Ú_ProactorSocketTransportz Transport for connected sockets.Nc                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
   rj   Zgetpeername)r   r   r#   r#   r$   r   f  s    



z#_ProactorSocketTransport._set_extrac             C   s   dS )NTr#   )r   r#   r#   r$   rt   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   rp   )r   r#   r#   r$   ru   y  s
    
z"_ProactorSocketTransport.write_eof)NNN)	r(   rM   rN   rO   r   r   rt   ru   rP   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(   rZ   Ú	_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)rQ   )r   r   r   r   r    r#   r#   r$   Ú_make_read_pipe_transport¥  s    z/BaseProactorEventLoop._make_read_pipe_transportc             C   s   t | ||||ƒS )N)rw   )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_runningri   Ú	is_closedÚ_stop_accept_futuresÚ_close_self_piperZ   r7   rƒ   r   )r   )r"   r#   r$   r7   ¯  s    
zBaseProactorEventLoop.closec             C   s   | j j||ƒS )N)rZ   r[   )r   r   Únr#   r#   r$   Ú	sock_recvÁ  s    zBaseProactorEventLoop.sock_recvc             C   s   | j j||ƒS )N)rZ   rq   )r   r   rb   r#   r#   r$   Úsock_sendallÄ  s    z"BaseProactorEventLoop.sock_sendallc             C   s   | j j||ƒS )N)rZ   Zconnect)r   r   Zaddressr#   r#   r$   Úsock_connectÇ  s    z"BaseProactorEventLoop.sock_connectc             C   s   | j j|ƒS )N)rZ   Ú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   )rY   rZ   r[   r™   r   r_   Ú	ExceptionrD   r„   r`   rœ   )r   rs   rF   r#   r#   r$   rœ   â  s    z(BaseProactorEventLoop._loop_self_readingc             C   s   | j jdƒ d S )Nó    )rš   rq   )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>   éÿÿÿÿ)rY   Z_debugr
   rC   r‹   r‡   r�   rZ   r–   r^   r*   rD   r7   r   r_   r…   r`   )rs   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�   rZ   Ú_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§   rP   r#   r#   )r"   r$   r   �  s4   
 
 
 
 



()rO   Ú__all__rJ   r9   Ú r   r   r   r   r   r	   Úlogr
   Z_FlowControlMixinZBaseTransportr   ZReadTransportrQ   ZWriteTransportrc   rw   Z	Transportr}   r   ZBaseEventLoopr   r#   r#   r#   r$   Ú<module>   s2    MT
#