
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    ¡ê,a<}  ã                   @   sT  d Z d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„ 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ƒ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)Ú	constants)Úfutures)Ú
exceptions)Ú	protocols)Ússlproto)Ú
transports)Útrsock)Úloggerc                 C   s–   t  |¡| jd< z| ¡ | jd< W n0 tjk
rR   | j ¡ rNtj	d|dd� Y nX d| jkr’z| 
¡ | jd< W n  tjk
r�   d | jd< Y nX d S )NÚsocketZsocknamezgetsockname() failed on %rT©Úexc_infoÚpeername)r   ÚTransportSocketÚ_extraZgetsocknamer   ÚerrorÚ_loopÚ	get_debugr   ÚwarningZgetpeername)Ú	transportÚsock© r   ú</opt/alt/python38/lib64/python3.8/asyncio/proactor_events.pyÚ_set_socket_extra   s    
  ÿ
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
ejfd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 ƒ  ||¡ |  |¡ || _|  |¡ || _d | _d | _d | _d| _	d| _
d| _d| _| jd k	rl| j ¡  | j | jj| ¡ |d k	r˜| j tj|d ¡ d S )Nr   F)ÚsuperÚ__init__Ú
_set_extraÚ_sockÚset_protocolÚ_serverÚ_bufferÚ	_read_futÚ
_write_futÚ_pending_writeÚ
_conn_lostÚ_closingÚ_eof_writtenZ_attachr   Ú	call_soonÚ	_protocolZconnection_mader   Z_set_result_unless_cancelled©ÚselfÚloopr   ÚprotocolÚwaiterÚextraÚserver©Ú	__class__r   r   r   2   s(    




 ÿz#_ProactorBasePipeTransport.__init__c                 C   sÄ   | j jg}| jd kr | d¡ n| jr0| d¡ | jd k	rP| d| j ¡ › �¡ | jd k	rl| d| j›�¡ | jd k	rˆ| d| j›�¡ | jr¤| dt	| jƒ› �¡ | j
r´| d¡ d d	 |¡¡S )
NÚclosedÚclosingzfd=zread=zwrite=zwrite_bufsize=zEOF writtenz<{}>ú )r4   Ú__name__r    Úappendr(   Úfilenor$   r%   r#   Úlenr)   ÚformatÚjoin)r-   Úinfor   r   r   Ú__repr__H   s     






z#_ProactorBasePipeTransport.__repr__c                 C   s   || j d< d S )NÚpipe)r   ©r-   r   r   r   r   r   Z   s    z%_ProactorBasePipeTransport._set_extrac                 C   s
   || _ d S ©N©r+   )r-   r/   r   r   r   r!   ]   s    z'_ProactorBasePipeTransport.set_protocolc                 C   s   | j S rB   rC   ©r-   r   r   r   Úget_protocol`   s    z'_ProactorBasePipeTransport.get_protocolc                 C   s   | j S rB   )r(   rD   r   r   r   Ú
is_closingc   s    z%_ProactorBasePipeTransport.is_closingc                 C   s\   | j r
d S d| _ |  jd7  _| js>| jd kr>| j | jd ¡ | jd k	rX| j ¡  d | _d S )NTr   )	r(   r'   r#   r%   r   r*   Ú_call_connection_lostr$   ÚcancelrD   r   r   r   Úclosef   s    

z _ProactorBasePipeTransport.closec                 C   s*   | j d k	r&|d| ›�t| d� |  ¡  d S )Nzunclosed transport )Úsource)r    ÚResourceWarningrI   )r-   Z_warnr   r   r   Ú__del__q   s    
z"_ProactorBasePipeTransport.__del__úFatal error on pipe transportc              	   C   sV   zDt|tƒr*| j ¡ rBtjd| |dd� n| j ||| | jdœ¡ W 5 |   |¡ X d S )Nz%r: %sTr   )ÚmessageÚ	exceptionr   r/   )	Ú_force_closeÚ
isinstanceÚOSErrorr   r   r   ÚdebugÚcall_exception_handlerr+   )r-   ÚexcrN   r   r   r   Ú_fatal_errorv   s    

üz'_ProactorBasePipeTransport._fatal_errorc                 C   s    | j d k	r6| j  ¡ s6|d kr*| j  d ¡ n| j  |¡ | jr@d S d| _|  jd7  _| jrj| j ¡  d | _| jr€| j ¡  d | _d| _	d | _
| j | j|¡ d S )NTr   r   )Ú_empty_waiterÚdoneÚ
set_resultZset_exceptionr(   r'   r%   rH   r$   r&   r#   r   r*   rG   )r-   rU   r   r   r   rP   …   s"    

z'_ProactorBasePipeTransport._force_closec              	   C   s^   z| j 	|¡ W 5 t | jdƒr,| j tj¡ | j ¡  d | _| j}|d k	rX| ¡  d | _X d S )NÚshutdown)
Úhasattrr    rZ   r   Z	SHUT_RDWRrI   r"   Z_detachr+   Zconnection_lost)r-   rU   r2   r   r   r   rG   ™   s    
z0_ProactorBasePipeTransport._call_connection_lostc                 C   s"   | j }| jd k	r|t| jƒ7 }|S rB   )r&   r#   r;   )r-   Úsizer   r   r   Úget_write_buffer_sizeª   s    
z0_ProactorBasePipeTransport.get_write_buffer_size)NNN)rM   )r8   Ú
__module__Ú__qualname__Ú__doc__r   r?   r   r!   rE   rF   rI   ÚwarningsÚwarnrL   rV   rP   rG   r]   Ú__classcell__r   r   r3   r   r   .   s        ÿ
r   c                       sT   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d„Z
‡  ZS )Ú_ProactorReadPipeTransportzTransport for read pipes.Nc                    s:   d | _ d| _tƒ  ||||||¡ | j | j¡ d| _d S )NTF)Ú_pending_dataÚ_pausedr   r   r   r*   Ú_loop_readingr,   r3   r   r   r   µ   s
    z#_ProactorReadPipeTransport.__init__c                 C   s   | j  o| j S rB   )rf   r(   rD   r   r   r   Ú
is_reading¾   s    z%_ProactorReadPipeTransport.is_readingc                 C   s0   | j s| jrd S d| _| j ¡ r,t d| ¡ d S )NTz%r pauses reading)r(   rf   r   r   r   rS   rD   r   r   r   Úpause_readingÁ   s
    
z(_ProactorReadPipeTransport.pause_readingc                 C   sn   | j s| jsd S d| _| jd kr0| j | jd ¡ | j}d | _|d k	rT| j | j|¡ | j ¡ rjt	 
d| ¡ d S )NFz%r resumes reading)r(   rf   r$   r   r*   rg   re   Ú_data_receivedr   r   rS   ©r-   Údatar   r   r   Úresume_readingÔ   s    

z)_ProactorReadPipeTransport.resume_readingc              
   C   s‚   | j  ¡ rt d| ¡ z| j ¡ }W nL ttfk
r>   ‚ Y n4 tk
rp } z|  	|d¡ W Y ¢d S d }~X Y nX |s~|  
¡  d S )Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.)r   r   r   rS   r+   Zeof_receivedÚ
SystemExitÚKeyboardInterruptÚBaseExceptionrV   rI   )r-   Z	keep_openrU   r   r   r   Ú_eof_receivedæ   s    
 ÿz(_ProactorReadPipeTransport._eof_receivedc              
   C   s®   | j r| jd kst‚|| _d S |s.|  ¡  d S t| jtjƒržzt | j|¡ W qª t	t
fk
rh   ‚ Y qª tk
rš } z|  |d¡ W Y ¢d S d }~X Y qªX n| j |¡ d S )Nz3Fatal error: protocol.buffer_updated() call failed.)rf   re   ÚAssertionErrorrq   rQ   r+   r   ZBufferedProtocolZ_feed_data_to_buffered_protorn   ro   rp   rV   Zdata_received)r-   rl   rU   r   r   r   rj   ö   s$    ÿz)_ProactorReadPipeTransport._data_receivedc              
   C   s”  d }�zrzŽ|d k	rP| j|ks0| jd kr,| js0t‚d | _| ¡ rH| ¡ }n| ¡  | jrfd }W W �¢d S |dkrzW W �¢d S | js”| jj	 
| jd¡| _W nÈ tk
rä } z0| js¼|  |d¡ n| j ¡ rÔtjddd� W 5 d }~X Y n’ tk
�r } z|  |¡ W 5 d }~X Y nf tk
�r> } z|  |d¡ W 5 d }~X Y n8 tjk
�r^   | j�sZ‚ Y nX | j�sv| j | j¡ W 5 |d k	�rŽ|   |¡ X d S )Nó    i €  z"Fatal read error on pipe transportz*Read error on pipe transport while closingTr   )rj   r$   r(   rr   rX   ÚresultrH   rf   r   Ú	_proactorÚrecvr    ÚConnectionAbortedErrorrV   r   r   rS   ÚConnectionResetErrorrP   rR   r   ÚCancelledErrorÚadd_done_callbackrg   )r-   Úfutrl   rU   r   r   r   rg     sF    ÿ

ÿ
z(_ProactorReadPipeTransport._loop_reading)NNN)N)r8   r^   r_   r`   r   rh   ri   rm   rq   rj   rg   rc   r   r   r3   r   rd   ±   s       ÿ	rd   c                       s^   e Zd ZdZdZ‡ fdd„Zdd„ Zddd	„Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Z‡  ZS )Ú_ProactorBaseWritePipeTransportzTransport for write pipes.Tc                    s   t ƒ j||Ž d | _d S rB   )r   r   rW   ©r-   ÚargsÚkwr3   r   r   r   G  s    z(_ProactorBaseWritePipeTransport.__init__c                 C   sÖ   t |tttfƒs$tdt|ƒj› �ƒ‚| jr2tdƒ‚| j	d k	rDtdƒ‚|sLd S | j
rz| j
tjkrht d¡ |  j
d7  _
d S | jd kr¤| jd ks’t‚| jt|ƒd� n.| js¾t|ƒ| _|  ¡  n| j |¡ |  ¡  d S )Nz/data argument must be a bytes-like object, not zwrite_eof() already calledz(unable to write; sendfile is in progresszsocket.send() raised exception.r   )rl   )rQ   ÚbytesÚ	bytearrayÚ
memoryviewÚ	TypeErrorÚtyper8   r)   ÚRuntimeErrorrW   r'   r   Ú!LOG_THRESHOLD_FOR_CONNLOST_WRITESr   r   r%   r#   rr   Ú_loop_writingÚ_maybe_pause_protocolÚextendrk   r   r   r   ÚwriteK  s.    ÿ




z%_ProactorBaseWritePipeTransport.writeNc              
   C   sx  �z|d k	r"| j d kr"| jr"W d S || j ks0t‚d | _ d| _|rH| ¡  |d kr\| j}d | _|s”| jrv| j | jd ¡ | j	rŠ| j
 tj¡ |  ¡  n\| jj | j
|¡| _ | j  ¡ sâ| jdksÀt‚t|ƒ| _| j  | j¡ |  ¡  n| j  | j¡ | jd k	�r| j d k�r| j d ¡ W n\ tk
�rD } z|  |¡ W 5 d }~X Y n0 tk
�rr } z|  |d¡ W 5 d }~X Y nX d S )Nr   z#Fatal write error on pipe transport)r%   r(   rr   r&   rt   r#   r   r*   rG   r)   r    rZ   r   ÚSHUT_WRÚ_maybe_resume_protocolru   ÚsendrX   r;   rz   r‡   rˆ   rW   rY   rx   rP   rR   rV   )r-   Úfrl   rU   r   r   r   r‡   q  s<    



z-_ProactorBaseWritePipeTransport._loop_writingc                 C   s   dS ©NTr   rD   r   r   r   Úcan_write_eofš  s    z-_ProactorBaseWritePipeTransport.can_write_eofc                 C   s   |   ¡  d S rB   )rI   rD   r   r   r   Ú	write_eof�  s    z)_ProactorBaseWritePipeTransport.write_eofc                 C   s   |   d ¡ d S rB   ©rP   rD   r   r   r   Úabort   s    z%_ProactorBaseWritePipeTransport.abortc                 C   s:   | j d k	rtdƒ‚| j ¡ | _ | jd kr4| j  d ¡ | j S )NzEmpty waiter is already set)rW   r…   r   Zcreate_futurer%   rY   rD   r   r   r   Ú_make_empty_waiter£  s    

z2_ProactorBaseWritePipeTransport._make_empty_waiterc                 C   s
   d | _ d S rB   )rW   rD   r   r   r   Ú_reset_empty_waiter«  s    z3_ProactorBaseWritePipeTransport._reset_empty_waiter)NN)r8   r^   r_   r`   Z_start_tls_compatibler   rŠ   r‡   r�   r‘   r“   r”   r•   rc   r   r   r3   r   r|   A  s   &
)r|   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú_ProactorWritePipeTransportc                    s4   t ƒ j||Ž | jj | jd¡| _| j | j¡ d S )Né   )	r   r   r   ru   rv   r    r$   rz   Ú_pipe_closedr}   r3   r   r   r   °  s    z$_ProactorWritePipeTransport.__init__c                 C   sv   |  ¡ rd S | ¡ dkst‚| jr4| jd ks0t‚d S || jksLt|| jfƒ‚d | _| jd k	rj|  tƒ ¡ n|  ¡  d S )Nrs   )	Z	cancelledrt   rr   r(   r$   r%   rP   ÚBrokenPipeErrorrI   )r-   r{   r   r   r   r˜   µ  s    
z(_ProactorWritePipeTransport._pipe_closed)r8   r^   r_   r   r˜   rc   r   r   r3   r   r–   ¯  s   r–   c                       sX   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Zddd„Zddd„Z	ddd„Z
‡  ZS )Ú_ProactorDatagramTransporti   Nc                    s>   || _ d | _tƒ j|||||d� t ¡ | _| j | j	¡ d S )N)r0   r1   )
Ú_addressrW   r   r   ÚcollectionsÚdequer#   r   r*   rg   )r-   r.   r   r/   Úaddressr0   r1   r3   r   r   r   Ç  s
    
z#_ProactorDatagramTransport.__init__c                 C   s   t | |ƒ d S rB   ©r   rA   r   r   r   r   Ó  s    z%_ProactorDatagramTransport._set_extrac                 C   s   t dd„ | jD ƒƒS )Nc                 s   s   | ]\}}t |ƒV  qd S rB   )r;   )Ú.0rl   Ú_r   r   r   Ú	<genexpr>×  s     zC_ProactorDatagramTransport.get_write_buffer_size.<locals>.<genexpr>)Úsumr#   rD   r   r   r   r]   Ö  s    z0_ProactorDatagramTransport.get_write_buffer_sizec                 C   s   |   d ¡ d S rB   r’   rD   r   r   r   r“   Ù  s    z _ProactorDatagramTransport.abortc                 C   s´   t |tttfƒstdt|ƒƒ‚|s&d S | jd k	rN|d | jfkrNtd| j› �ƒ‚| jr‚| jr‚| jt	j
krpt d¡ |  jd7  _d S | j t|ƒ|f¡ | jd kr¨|  ¡  |  ¡  d S )Nz,data argument must be bytes-like object (%r)z!Invalid address: must be None or z!socket.sendto() raised exception.r   )rQ   r€   r�   r‚   rƒ   r„   r›   Ú
ValueErrorr'   r   r†   r   r   r#   r9   r%   r‡   rˆ   )r-   rl   Úaddrr   r   r   ÚsendtoÜ  s&    ÿ
ÿ

z!_ProactorDatagramTransport.sendtoc              
   C   s  z¤| j rW d S || jkst‚d | _|r.| ¡  | jr@| j r\| jr\| jrV| j | j	d ¡ W d S | j 
¡ \}}| jd k	rŠ| jj | j|¡| _n| jjj| j||d�| _W nZ tk
rÒ } z| j |¡ W 5 d }~X Y nD tk
rþ } z|  |d¡ W 5 d }~X Y nX | j | j¡ |  ¡  d S )N)r¥   z'Fatal write error on datagram transport)r'   r%   rr   rt   r#   r›   r(   r   r*   rG   Úpopleftru   r�   r    r¦   rR   r+   Úerror_receivedÚ	ExceptionrV   rz   r‡   rŒ   )r-   r{   rl   r¥   rU   r   r   r   r‡   ø  s4    
ÿþz(_ProactorDatagramTransport._loop_writingc              
   C   sV  d }�z4zÆ| jrW W �¢$d S | j|ks:| jd kr6| js:t‚d | _|d k	r„| ¡ }| jrdd }W W ¢Üd S | jd k	r||| j }}n|\}}| jr”W W ¢¬d S | jd k	r¶| jj	 
| j| j¡| _n| jj	 | j| j¡| _W nN tk
rü } z| j  |¡ W 5 d }~X Y n< tjk
�r   | j�s‚ Y nX | jd k	�r8| j | j¡ W 5 |�rP| j  ||¡ X d S rB   )r+   Zdatagram_receivedr'   r$   r(   rr   rt   r›   r   ru   rv   r    Úmax_sizeZrecvfromrR   r¨   r   ry   rz   rg   )r-   r{   rl   r¥   ÚresrU   r   r   r   rg     sD    ÿ



ÿÿ
z(_ProactorDatagramTransport._loop_reading)NNN)N)N)N)r8   r^   r_   rª   r   r   r]   r“   r¦   r‡   rg   rc   r   r   r3   r   rš   Å  s       ÿ

!rš   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   rD   r   r   r   r�   J  s    z*_ProactorDuplexPipeTransport.can_write_eofc                 C   s   t ‚d S rB   )ÚNotImplementedErrorrD   r   r   r   r‘   M  s    z&_ProactorDuplexPipeTransport.write_eofN)r8   r^   r_   r`   r�   r‘   r   r   r   r   r¬   E  s   r¬   c                       sB   e Zd ZdZejj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 ƒ  ||||||¡ t |¡ d S rB   )r   r   r   Z_set_nodelayr,   r3   r   r   r   X  s    z!_ProactorSocketTransport.__init__c                 C   s   t | |ƒ d S rB   rŸ   rA   r   r   r   r   ]  s    z#_ProactorSocketTransport._set_extrac                 C   s   dS r�   r   rD   r   r   r   r�   `  s    z&_ProactorSocketTransport.can_write_eofc                 C   s2   | j s| jrd S d| _| jd kr.| j tj¡ d S r�   )r(   r)   r%   r    rZ   r   r‹   rD   r   r   r   r‘   c  s
    
z"_ProactorSocketTransport.write_eof)NNN)r8   r^   r_   r`   r   Z_SendfileModeZ
TRY_NATIVEZ_sendfile_compatibler   r   r�   r‘   rc   r   r   r3   r   r®   Q  s       ÿr®   c                       sî   e Zd Z‡ fdd„Zd3dd„Zd4ddddddœdd	„Zd5d
d„Zd6dd„Zd7dd„Zd8d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d"d#„ Zd$d%„ Zd9d&d'„Zd(d)„ Zd:d+d,„Zd-d.„ Zd/d0„ Zd1d2„ Z‡  ZS );r   c                    sh   t ƒ  ¡  t d|jj¡ || _|| _d | _i | _	| 
| ¡ |  ¡  t ¡ t ¡ krdt | j ¡ ¡ d S )NzUsing proactor: %s)r   r   r   rS   r4   r8   ru   Ú	_selectorÚ_self_reading_futureÚ_accept_futuresZset_loopÚ_make_self_pipeÚ	threadingÚcurrent_threadÚmain_threadÚsignalÚset_wakeup_fdÚ_csockr:   )r-   Zproactorr3   r   r   r   m  s    

zBaseProactorEventLoop.__init__Nc                 C   s   t | |||||ƒS rB   )r®   )r-   r   r/   r0   r1   r2   r   r   r   Ú_make_socket_transportz  s    
 ÿz,BaseProactorEventLoop._make_socket_transportF)Úserver_sideÚserver_hostnamer1   r2   Ússl_handshake_timeoutc             	   C   s0   t j| ||||||	d�}
t| ||
||d� |
jS )N)r¼   ©r1   r2   )r	   ZSSLProtocolr®   Z_app_transport)r-   Zrawsockr/   Ú
sslcontextr0   rº   r»   r1   r2   r¼   Zssl_protocolr   r   r   Ú_make_ssl_transport  s        ý ÿz)BaseProactorEventLoop._make_ssl_transportc                 C   s   t | |||||ƒS rB   )rš   )r-   r   r/   rž   r0   r1   r   r   r   Ú_make_datagram_transportŒ  s    
 ÿz.BaseProactorEventLoop._make_datagram_transportc                 C   s   t | ||||ƒS rB   )r¬   ©r-   r   r/   r0   r1   r   r   r   Ú_make_duplex_pipe_transport‘  s       ÿz1BaseProactorEventLoop._make_duplex_pipe_transportc                 C   s   t | ||||ƒS rB   )rd   rÁ   r   r   r   Ú_make_read_pipe_transport–  s    z/BaseProactorEventLoop._make_read_pipe_transportc                 C   s   t | ||||ƒS rB   )r–   rÁ   r   r   r   Ú_make_write_pipe_transportš  s       ÿz0BaseProactorEventLoop._make_write_pipe_transportc                    sj   |   ¡ rtdƒ‚|  ¡ rd S t ¡ t ¡ kr6t d¡ |  ¡  |  	¡  | j
 ¡  d | _
d | _tƒ  ¡  d S )Nz!Cannot close a running event loopéÿÿÿÿ)Z
is_runningr…   Ú	is_closedr³   r´   rµ   r¶   r·   Ú_stop_accept_futuresÚ_close_self_piperu   rI   r¯   r   rD   r3   r   r   rI      s    

zBaseProactorEventLoop.closec                 Ã   s   | j  ||¡I d H S rB   )ru   rv   )r-   r   Únr   r   r   Ú	sock_recv´  s    zBaseProactorEventLoop.sock_recvc                 Ã   s   | j  ||¡I d H S rB   )ru   Z	recv_into)r-   r   Zbufr   r   r   Úsock_recv_into·  s    z$BaseProactorEventLoop.sock_recv_intoc                 Ã   s   | j  ||¡I d H S rB   )ru   r�   )r-   r   rl   r   r   r   Úsock_sendallº  s    z"BaseProactorEventLoop.sock_sendallc                 Ã   s   | j  ||¡I d H S rB   )ru   Zconnect)r-   r   rž   r   r   r   Úsock_connect½  s    z"BaseProactorEventLoop.sock_connectc                 Ã   s   | j  |¡I d H S rB   )ru   ÚacceptrA   r   r   r   Úsock_acceptÀ  s    z!BaseProactorEventLoop.sock_acceptc              
   Ã   s(  z|  ¡ }W n2 ttjfk
r> } zt d¡‚W 5 d }~X Y nX zt |¡j}W n, t	k
r| } zt d¡‚W 5 d }~X Y nX |r†|n|}|s’dS t
|dƒ}|r®t
|| |ƒn|}	t
||ƒ}d}
zLt
|	| |ƒ}|dkrà|
W ¢0S | j ||||¡I d H  ||7 }|
|7 }
qÂW 5 |
dk�r"| |¡ X d S )Nznot a regular filer   l   ÿÿ )r:   ÚAttributeErrorÚioÚUnsupportedOperationr   ZSendfileNotAvailableErrorÚosÚfstatÚst_sizerR   ÚminÚseekru   Úsendfile)r-   r   ÚfileÚoffsetÚcountr:   ÚerrZfsizeZ	blocksizeZend_posZ
total_sentr   r   r   Ú_sock_sendfile_nativeÃ  s0    


z+BaseProactorEventLoop._sock_sendfile_nativec                 Ã   sZ   |  ¡ }| ¡  | ¡ I d H  z | j|j|||dd�I d H W ¢S | ¡  |rT| ¡  X d S )NF)Zfallback)rh   ri   r”   r•   rm   Zsock_sendfiler    )r-   ZtransprÙ   rÚ   rÛ   rm   r   r   r   Ú_sendfile_nativeà  s    ÿz&BaseProactorEventLoop._sendfile_nativec                 C   sL   | j d k	r| j  ¡  d | _ | j ¡  d | _| j ¡  d | _|  jd8  _d S )Nr   )r°   rH   Ú_ssockrI   r¸   Ú_internal_fdsrD   r   r   r   rÈ   ì  s    



z&BaseProactorEventLoop._close_self_pipec                 C   s:   t  ¡ \| _| _| j d¡ | j d¡ |  jd7  _d S )NFr   )r   Z
socketpairrß   r¸   Zsetblockingrà   rD   r   r   r   r²   ö  s    z%BaseProactorEventLoop._make_self_pipec              
   C   s®   z4|d k	r|  ¡  | j|k	r"W d S | j | jd¡}W nb tjk
rL   Y d S  ttfk
rd   ‚ Y nF t	k
r– } z|  
d|| dœ¡ W 5 d }~X Y nX || _| | j¡ d S )Ni   z.Error on reading from the event loop self pipe)rN   rO   r.   )rt   r°   ru   rv   rß   r   ry   rn   ro   rp   rT   rz   Ú_loop_self_reading)r-   rŽ   rU   r   r   r   rá   ý  s$    
ýz(BaseProactorEventLoop._loop_self_readingc                 C   sN   | j }|d krd S z| d¡ W n( tk
rH   | jrDtjddd� Y nX d S )Nó    z3Fail to write a null byte into the self-pipe socketTr   )r¸   r�   rR   Ú_debugr   rS   )r-   Zcsockr   r   r   Ú_write_to_self  s    þz$BaseProactorEventLoop._write_to_selféd   c                    s(   d‡ ‡‡‡‡‡‡fdd„	‰ ˆ  ˆ ¡ d S )Nc              
      s,  zŠ| d k	rn|   ¡ \}}ˆjr,t dˆ||¡ ˆƒ }ˆd k	rXˆj||ˆdd|iˆˆd� nˆj||d|iˆd� ˆ ¡ r|W d S ˆj ˆ¡} W n„ t	k
rð } zHˆ 
¡ dkrÊˆ d|t ˆ¡dœ¡ ˆ ¡  nˆjràtjd	ˆdd
� W 5 d }~X Y n8 tjk
�r   ˆ ¡  Y nX | ˆjˆ 
¡ < |  ˆ ¡ d S )Nz#%r got a new connection from %r: %rTr   )rº   r1   r2   r¼   r½   rÅ   zAccept failed on a socket)rN   rO   r   zAccept failed on socket %rr   )rt   rã   r   rS   r¿   r¹   rÆ   ru   rÎ   rR   r:   rT   r   r   rI   r   ry   r±   rz   )rŽ   Zconnr¥   r/   rU   ©r.   Úprotocol_factoryr-   r2   r   r¼   r¾   r   r   r.   /  s\      ÿ    ý  þý
 ÿz2BaseProactorEventLoop._start_serving.<locals>.loop)N)r*   )r-   rç   r   r¾   r2   Zbacklogr¼   r   ræ   r   Ú_start_serving+  s    %z$BaseProactorEventLoop._start_servingc                 C   s   d S rB   r   )r-   Z
event_listr   r   r   Ú_process_eventsV  s    z%BaseProactorEventLoop._process_eventsc                 C   s&   | j  ¡ D ]}| ¡  q
| j  ¡  d S rB   )r±   ÚvaluesrH   Úclear)r-   Úfuturer   r   r   rÇ   Z  s    
z*BaseProactorEventLoop._stop_accept_futuresc                 C   s6   | j  | ¡ d ¡}|r| ¡  | j |¡ | ¡  d S rB   )r±   Úpopr:   rH   ru   Ú_stop_servingrI   )r-   r   rì   r   r   r   rî   _  s
    z#BaseProactorEventLoop._stop_serving)NNN)N)NNN)NN)NN)NN)N)NNrå   N)r8   r^   r_   r   r¹   r¿   rÀ   rÂ   rÃ   rÄ   rI   rÊ   rË   rÌ   rÍ   rÏ   rÝ   rÞ   rÈ   r²   rá   rä   rè   ré   rÇ   rî   rc   r   r   r3   r   r   k  s\       ÿ
 ÿ  ü     ÿ
  ÿ
  ÿ
  ÿ


      þ
+r   )#r`   Ú__all__rÑ   rÓ   r   ra   r¶   r³   rœ   Ú r   r   r   r   r   r	   r
   r   Úlogr   r   Z_FlowControlMixinZBaseTransportr   ZReadTransportrd   ZWriteTransportr|   r–   rš   Z	Transportr¬   r®   ZBaseEventLoopr   r   r   r   r   Ú<module>   sR   ÿ ÿ ÿn þþ