o
    éT•j  ã                   @   sX  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ejƒ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 n tjy(   | j ¡ r&tj	d|dd� Y nw d| jvrIz
| 
¡ | jd< W d S  tjyH   d | jd< Y d S w d S )NÚsocketÚsocknamezgetsockname() failed on %rT©Úexc_infoÚpeername)r   ÚTransportSocketÚ_extraÚgetsocknamer   ÚerrorÚ_loopÚ	get_debugr   ÚwarningÚgetpeername)Ú	transportÚsock© r   ú./usr/lib/python3.10/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| _d| _| jd ur9| j ¡  | j | jj| ¡ |d urQ| j tj|d ¡ d S d S )Nr   F)ÚsuperÚ__init__Ú
_set_extraÚ_sockÚset_protocolÚ_serverÚ_bufferÚ	_read_futÚ
_write_futÚ_pending_writeÚ
_conn_lostÚ_closingÚ_called_connection_lostÚ_eof_writtenÚ_attachr   Ú	call_soonÚ	_protocolÚconnection_mader   Ú_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 u r| d¡ n| jr| d¡ | jd ur(| d| j ¡ › �¡ | jd ur6| d| j›�¡ | jd urD| d| j›�¡ | jrR| dt	| jƒ› �¡ | j
rZ| d¡ d d	 |¡¡S )
NÚclosedÚclosingzfd=zread=zwrite=zwrite_bufsize=zEOF writtenz<{}>ú )r;   Ú__name__r#   Úappendr+   Úfilenor'   r(   r&   Úlenr-   ÚformatÚjoin)r4   Úinfor   r   r   Ú__repr__I   s    






z#_ProactorBasePipeTransport.__repr__c                 C   s   || j d< d S )NÚpipe)r   ©r4   r   r   r   r   r"   [   ó   z%_ProactorBasePipeTransport._set_extrac                 C   s
   || _ d S ©N©r0   )r4   r6   r   r   r   r$   ^   ó   
z'_ProactorBasePipeTransport.set_protocolc                 C   ó   | j S rJ   rK   ©r4   r   r   r   Úget_protocola   ó   z'_ProactorBasePipeTransport.get_protocolc                 C   rM   rJ   )r+   rN   r   r   r   Ú
is_closingd   rP   z%_ProactorBasePipeTransport.is_closingc                 C   s`   | j rd S d| _ |  jd7  _| js| jd u r| j | jd ¡ | jd ur.| j ¡  d | _d S d S )NTr   )	r+   r*   r&   r(   r   r/   Ú_call_connection_lostr'   ÚcancelrN   r   r   r   Úcloseg   s   


þz _ProactorBasePipeTransport.closec                 C   s0   | j d ur|d| ›�t| d� | j  ¡  d S d S )Nzunclosed transport )Úsource)r#   ÚResourceWarningrT   )r4   Ú_warnr   r   r   Ú__del__r   s   
þz"_ProactorBasePipeTransport.__del__úFatal error on pipe transportc              	   C   sn   z0t |tƒr| j ¡ rtjd| |dd� n| j ||| | jdœ¡ W |  |¡ d S W |  |¡ d S |  |¡ w )Nz%r: %sTr   )ÚmessageÚ	exceptionr   r6   )	Ú
isinstanceÚOSErrorr   r   r   ÚdebugÚcall_exception_handlerr0   Ú_force_close)r4   ÚexcrZ   r   r   r   Ú_fatal_errorw   s   

€
ü€ z'_ProactorBasePipeTransport._fatal_errorc                 C   s¦   | j d ur| j  ¡ s|d u r| j  d ¡ n| j  |¡ | jr#| jr#d S d| _|  jd7  _| jr8| j ¡  d | _| j	rC| j	 ¡  d | _	d| _
d | _| j | j|¡ d S )NTr   r   )Ú_empty_waiterÚdoneÚ
set_resultÚset_exceptionr+   r,   r*   r(   rS   r'   r)   r&   r   r/   rR   )r4   ra   r   r   r   r`   †   s"   

z'_ProactorBasePipeTransport._force_closec              	   C   sÔ   | j rd S z6| j |¡ W t| jdƒr!| j ¡ dkr!| j tj¡ | j 	¡  d | _| j
}|d ur7| ¡  d | _
d| _ d S t| jdƒrP| j ¡ dkrP| j tj¡ | j 	¡  d | _| j
}|d urf| ¡  d | _
d| _ w )NÚshutdownéÿÿÿÿT)r,   r0   Úconnection_lostÚhasattrr#   rA   rg   r   Ú	SHUT_RDWRrT   r%   Ú_detach)r4   ra   r9   r   r   r   rR   š   s,   

ø
z0_ProactorBasePipeTransport._call_connection_lostc                 C   s"   | j }| jd ur|t| jƒ7 }|S rJ   )r)   r&   rB   )r4   Úsizer   r   r   Úget_write_buffer_size®   s   
z0_ProactorBasePipeTransport.get_write_buffer_size©NNN)rY   )r?   Ú
__module__Ú__qualname__Ú__doc__r!   rF   r"   r$   rO   rQ   rT   ÚwarningsÚwarnrX   rb   r`   rR   rn   Ú__classcell__r   r   r:   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„ Zdd„ Z	ddd„Z
‡  ZS )Ú_ProactorReadPipeTransportzTransport for read pipes.Né   c                    sD   d| _ d| _tƒ  ||||||¡ t|ƒ| _| j | j¡ d| _d S )Nrh   TF)	Ú_pending_data_lengthÚ_pausedr    r!   Ú	bytearrayÚ_datar   r/   Ú_loop_reading)r4   r5   r   r6   r7   r8   r9   Úbuffer_sizer:   r   r   r!   ¹   s   

z#_ProactorReadPipeTransport.__init__c                 C   s   | j  o| j S rJ   )ry   r+   rN   r   r   r   Ú
is_readingÃ   s   z%_ProactorReadPipeTransport.is_readingc                 C   s4   | j s| jrd S d| _| j ¡ rt d| ¡ d S d S )NTz%r pauses reading)r+   ry   r   r   r   r^   rN   r   r   r   Úpause_readingÆ   s   
ÿz(_ProactorReadPipeTransport.pause_readingc                 C   s~   | j s| jsd S d| _| jd u r| j | jd ¡ | j}d| _|dkr0| j | j| jd |… |¡ | j 	¡ r=t
 d| ¡ d S d S )NFrh   z%r resumes reading)r+   ry   r'   r   r/   r|   rx   Ú_data_receivedr{   r   r   r^   )r4   Úlengthr   r   r   Úresume_readingÙ   s   

ÿz)_ProactorReadPipeTransport.resume_readingc              
   C   s~   | j  ¡ rt d| ¡ z| j ¡ }W n" ttfy   ‚  ty4 } z|  	|d¡ W Y d }~d S d }~ww |s=|  
¡  d S d S )Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.)r   r   r   r^   r0   Úeof_receivedÚ
SystemExitÚKeyboardInterruptÚBaseExceptionrb   rT   )r4   Ú	keep_openra   r   r   r   Ú_eof_receivedë   s    
ÿ€ýÿz(_ProactorReadPipeTransport._eof_receivedc              
   C   sª   | j r| jdks
J ‚|| _d S |dkr|  ¡  d S t| jtjƒrMz
t | j|¡ W d S  tt	fy4   ‚  t
yL } z|  |d¡ W Y d }~d S d }~ww | j |¡ d S )Nrh   r   z3Fatal error: protocol.buffer_updated() call failed.)ry   rx   rˆ   r\   r0   r   ÚBufferedProtocolÚ_feed_data_to_buffered_protor„   r…   r†   rb   Údata_received)r4   Údatar�   ra   r   r   r   r€   û   s(   ÿ€üz)_ProactorReadPipeTransport._data_receivedc              
   C   sÜ  d}d }zÝza|d urD| j |u s| j d u r| jsJ ‚d | _ | ¡ r@| ¡ }|dkr8W W |dkr6|  ||¡ d S d S | jd |… }n| ¡  | jrWW W |dkrU|  ||¡ d S d S | jse| jj	 
| j| j¡| _ W nb tyŽ } z| jsx|  |d¡ n| j ¡ r„tjddd� W Y d }~nId }~w ty¤ } z|  |¡ W Y d }~n3d }~w ty» } z|  |d¡ W Y d }~nd }~w tjyÈ   | jsÆ‚ Y nw | jsÓ| j  | j¡ W |dkrà|  ||¡ d S d S |dkrí|  ||¡ w w )Nrh   r   z"Fatal read error on pipe transportz*Read error on pipe transport while closingTr   )r'   r+   rd   Úresultr€   r{   rS   ry   r   Ú	_proactorÚ	recv_intor#   ÚConnectionAbortedErrorrb   r   r   r^   ÚConnectionResetErrorr`   r]   r   ÚCancelledErrorÚadd_done_callbackr|   )r4   Úfutr�   rŒ   ra   r   r   r   r|     sh   ÿ"ÿàÿì€
ÿ€€€ÿÿ€ÿÿz(_ProactorReadPipeTransport._loop_reading)NNNrw   rJ   )r?   rp   rq   rr   r!   r~   r   r‚   rˆ   r€   r|   ru   r   r   r:   r   rv   µ   s    ÿ
rv   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|i |¤Ž d | _d S rJ   )r    r!   rc   ©r4   ÚargsÚkwr:   r   r   r!   M  s   
z(_ProactorBaseWritePipeTransport.__init__c                 C   sÚ   t |tttfƒstdt|ƒj› �ƒ‚| jrtdƒ‚| j	d ur"tdƒ‚|s&d S | j
r=| j
tjkr4t d¡ |  j
d7  _
d S | jd u rS| jd u sIJ ‚| jt|ƒd� d S | jsat|ƒ| _|  ¡  d S | 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   )rŒ   )r\   Úbytesrz   Ú
memoryviewÚ	TypeErrorÚtyper?   r-   ÚRuntimeErrorrc   r*   r   Ú!LOG_THRESHOLD_FOR_CONNLOST_WRITESr   r   r(   r&   Ú_loop_writingÚ_maybe_pause_protocolÚextend)r4   rŒ   r   r   r   ÚwriteQ  s2   ÿÿ



z%_ProactorBaseWritePipeTransport.writeNc              
   C   s€  z�|d ur| j d u r| jrW d S || j u sJ ‚d | _ d| _|r#| ¡  |d u r-| j}d | _|sI| jr:| j | jd ¡ | jrD| j	 
tj¡ |  ¡  n.| jj | j	|¡| _ | j  ¡ sp| jdks_J ‚t|ƒ| _| j  | j¡ |  ¡  n| j  | j¡ | jd urŠ| j d u r�| j d ¡ W d S W d S W d S  ty§ } z|  |¡ W Y d }~d S d }~w ty¿ } z|  |d¡ W Y d }~d S d }~ww )Nr   z#Fatal write error on pipe transport)r(   r+   r)   r�   r&   r   r/   rR   r-   r#   rg   r   ÚSHUT_WRÚ_maybe_resume_protocolrŽ   Úsendrd   rB   r“   rŸ   r    rc   re   r‘   r`   r]   rb   )r4   ÚfrŒ   ra   r   r   r   rŸ   w  sD   



ÿ€€ÿz-_ProactorBaseWritePipeTransport._loop_writingc                 C   ó   dS ©NTr   rN   r   r   r   Úcan_write_eof   ó   z-_ProactorBaseWritePipeTransport.can_write_eofc                 C   s   |   ¡  d S rJ   )rT   rN   r   r   r   Ú	write_eof£  s   z)_ProactorBaseWritePipeTransport.write_eofc                 C   ó   |   d ¡ d S rJ   ©r`   rN   r   r   r   Úabort¦  rI   z%_ProactorBaseWritePipeTransport.abortc                 C   s:   | j d ur	tdƒ‚| j ¡ | _ | jd u r| j  d ¡ | j S )NzEmpty waiter is already set)rc   r�   r   Úcreate_futurer(   re   rN   r   r   r   Ú_make_empty_waiter©  s   

z2_ProactorBaseWritePipeTransport._make_empty_waiterc                 C   s
   d | _ d S rJ   )rc   rN   r   r   r   Ú_reset_empty_waiter±  rL   z3_ProactorBaseWritePipeTransport._reset_empty_waiter©NN)r?   rp   rq   rr   Ú_start_tls_compatibler!   r¢   rŸ   r©   r«   r®   r°   r±   ru   r   r   r:   r   r•   G  s    
&)r•   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú_ProactorWritePipeTransportc                    s8   t ƒ j|i |¤Ž | jj | jd¡| _| j | j¡ d S )Né   )	r    r!   r   rŽ   Úrecvr#   r'   r“   Ú_pipe_closedr–   r:   r   r   r!   ¶  s   z$_ProactorWritePipeTransport.__init__c                 C   sx   |  ¡ rd S | ¡ dksJ ‚| jr| jd u sJ ‚d S || ju s&J || jfƒ‚d | _| jd ur6|  tƒ ¡ d S |  ¡  d S )Nó    )Ú	cancelledr�   r+   r'   r(   r`   ÚBrokenPipeErrorrT   )r4   r”   r   r   r   r·   »  s   
z(_ProactorWritePipeTransport._pipe_closed)r?   rp   rq   r!   r·   ru   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
„ 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)r7   r8   )
Ú_addressrc   r    r!   ÚcollectionsÚdequer&   r   r/   r|   )r4   r5   r   r6   Úaddressr7   r8   r:   r   r   r!   Î  s
   
z#_ProactorDatagramTransport.__init__c                 C   ó   t | |ƒ d S rJ   ©r   rH   r   r   r   r"   Ú  rI   z%_ProactorDatagramTransport._set_extrac                 C   s   t dd„ | jD ƒƒS )Nc                 s   s   � | ]	\}}t |ƒV  qd S rJ   )rB   )Ú.0rŒ   Ú_r   r   r   Ú	<genexpr>Þ  s   € zC_ProactorDatagramTransport.get_write_buffer_size.<locals>.<genexpr>)Úsumr&   rN   r   r   r   rn   Ý  s   z0_ProactorDatagramTransport.get_write_buffer_sizec                 C   r¬   rJ   r­   rN   r   r   r   r®   à  rI   z _ProactorDatagramTransport.abortc                 C   s´   t |tttfƒstdt|ƒƒ‚|sd S | jd ur'|d | jfvr'td| j› �ƒ‚| jrA| jrA| jt	j
kr8t d¡ |  jd7  _d S | j t|ƒ|f¡ | jd u rT|  ¡  |  ¡  d S )Nz,data argument must be bytes-like object (%r)z!Invalid address: must be None or z!socket.sendto() raised exception.r   )r\   r™   rz   rš   r›   rœ   r¼   Ú
ValueErrorr*   r   rž   r   r   r&   r@   r(   rŸ   r    )r4   rŒ   Úaddrr   r   r   Úsendtoã  s&   ÿ
ÿ

z!_ProactorDatagramTransport.sendtoc              
   C   s"  zR| j rW d S || ju sJ ‚d | _|r| ¡  | jr | j r.| jr.| jr+| j | jd ¡ W d S | j 	¡ \}}| jd urE| jj
 | j|¡| _n| jj
j| j||d�| _W n1 tyk } z| j |¡ W Y d }~d S d }~w tyƒ } z|  |d¡ W Y d }~d S d }~ww | j | j¡ |  ¡  d S )N)rÇ   z'Fatal write error on datagram transport)r*   r(   r�   r&   r¼   r+   r   r/   rR   ÚpopleftrŽ   r¥   r#   rÈ   r]   r0   Úerror_receivedÚ	Exceptionrb   r“   rŸ   r¤   )r4   r”   rŒ   rÇ   ra   r   r   r   rŸ   ÿ  s<   
ÿþ€€€ÿz(_ProactorDatagramTransport._loop_writingc              
   C   sœ  d }zÀz€| j rW W |r| j ||¡ d S d S | j|u s%| jd u r#| js%J ‚d | _|d urT| ¡ }| jrDd }W W |rB| j ||¡ d S d S | jd urP|| j}}n|\}}| j rfW W |rd| j ||¡ d S d S | jd urw| jj 	| j
| j¡| _n| jj | j
| j¡| _W n% ty› } z| j |¡ W Y d }~nd }~w tjy¨   | js¦‚ Y nw | jd urµ| j | j¡ W |rÁ| j ||¡ d S d S |rÍ| j ||¡ w w rJ   )r*   r0   Údatagram_receivedr'   r+   r�   r¼   r   rŽ   r¶   r#   Úmax_sizeÚrecvfromr]   rÊ   r   r’   r“   r|   )r4   r”   rŒ   rÇ   Úresra   r   r   r   r|      sf   $ÿÞÿÿ
êÿ
ñÿÿ€€ÿÿ
€ÿÿz(_ProactorDatagramTransport._loop_readingro   rJ   )r?   rp   rq   rÍ   r!   r"   rn   r®   rÈ   rŸ   r|   ru   r   r   r:   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   r§   )NFr   rN   r   r   r   r©   Q  rª   z*_ProactorDuplexPipeTransport.can_write_eofc                 C   s   t ‚rJ   )ÚNotImplementedErrorrN   r   r   r   r«   T  rª   z&_ProactorDuplexPipeTransport.write_eofN)r?   rp   rq   rr   r©   r«   r   r   r   r   rÐ   L  s    rÐ   c                       sF   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 rJ   )r    r!   r   Ú_set_nodelayr3   r:   r   r   r!   _  s   z!_ProactorSocketTransport.__init__c                 C   rÀ   rJ   rÁ   rH   r   r   r   r"   d  rI   z#_ProactorSocketTransport._set_extrac                 C   r§   r¨   r   rN   r   r   r   r©   g  rª   z&_ProactorSocketTransport.can_write_eofc                 C   s6   | j s| jrd S d| _| jd u r| j tj¡ d S d S r¨   )r+   r-   r(   r#   rg   r   r£   rN   r   r   r   r«   j  s   
ÿz"_ProactorSocketTransport.write_eofro   )r?   rp   rq   rr   r   Ú_SendfileModeÚ
TRY_NATIVEÚ_sendfile_compatibler!   r"   r©   r«   ru   r   r   r:   r   rÒ   X  s    ÿrÒ   c                       s  e Zd Z‡ fdd„Z		d3dd„Z	d4ddddddœdd	„Z	d3d
d„Z		d5dd„Z		d5dd„Z		d5d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d4d&d'„Zd(d)„ Z	*	d6d+d,„Zd-d.„ Zd/d0„ Zd1d2„ Z‡  ZS )7r   c                    sl   t ƒ  ¡  t d|jj¡ || _|| _d | _i | _	| 
| ¡ |  ¡  t ¡ t ¡ u r4t | j ¡ ¡ d S d S )NzUsing proactor: %s)r    r!   r   r^   r;   r?   rŽ   Ú	_selectorÚ_self_reading_futureÚ_accept_futuresÚset_loopÚ_make_self_pipeÚ	threadingÚcurrent_threadÚmain_threadÚsignalÚset_wakeup_fdÚ_csockrA   )r4   Úproactorr:   r   r   r!   t  s   

þzBaseProactorEventLoop.__init__Nc                 C   ó   t | |||||ƒS rJ   )rÒ   )r4   r   r6   r7   r8   r9   r   r   r   Ú_make_socket_transport�  ó   
ÿz,BaseProactorEventLoop._make_socket_transportF)Úserver_sideÚserver_hostnamer8   r9   Ússl_handshake_timeoutc             	   C   s0   t j| ||||||	d�}
t| ||
||d� |
jS )N)rè   ©r8   r9   )r	   ÚSSLProtocolrÒ   Ú_app_transport)r4   Úrawsockr6   Ú
sslcontextr7   ræ   rç   r8   r9   rè   Ússl_protocolr   r   r   Ú_make_ssl_transport†  s   ýÿz)BaseProactorEventLoop._make_ssl_transportc                 C   rã   rJ   )r»   )r4   r   r6   r¿   r7   r8   r   r   r   Ú_make_datagram_transport“  rå   z.BaseProactorEventLoop._make_datagram_transportc                 C   ó   t | ||||ƒS rJ   )rÐ   ©r4   r   r6   r7   r8   r   r   r   Ú_make_duplex_pipe_transport˜  s   ÿz1BaseProactorEventLoop._make_duplex_pipe_transportc                 C   rñ   rJ   )rv   rò   r   r   r   Ú_make_read_pipe_transport�  s   z/BaseProactorEventLoop._make_read_pipe_transportc                 C   rñ   rJ   )r´   rò   r   r   r   Ú_make_write_pipe_transport¡  s   ÿz0BaseProactorEventLoop._make_write_pipe_transportc                    sj   |   ¡ rtdƒ‚|  ¡ rd S t ¡ t ¡ u rt d¡ |  ¡  |  	¡  | j
 ¡  d | _
d | _tƒ  ¡  d S )Nz!Cannot close a running event looprh   )Ú
is_runningr�   Ú	is_closedrÜ   rÝ   rÞ   rß   rà   Ú_stop_accept_futuresÚ_close_self_piperŽ   rT   r×   r    rN   r:   r   r   rT   §  s   

zBaseProactorEventLoop.closec                 Ã   ó   �| j  ||¡I d H S rJ   )rŽ   r¶   )r4   r   Únr   r   r   Ú	sock_recv»  ó   €zBaseProactorEventLoop.sock_recvc                 Ã   rú   rJ   )rŽ   r�   )r4   r   Úbufr   r   r   Úsock_recv_into¾  rý   z$BaseProactorEventLoop.sock_recv_intoc                 Ã   rú   rJ   )rŽ   r¥   )r4   r   rŒ   r   r   r   Úsock_sendallÁ  rý   z"BaseProactorEventLoop.sock_sendallc                 Ã   rú   rJ   )rŽ   Úconnect)r4   r   r¿   r   r   r   Úsock_connectÄ  rý   z"BaseProactorEventLoop.sock_connectc                 Ã   s   �| j  |¡I d H S rJ   )rŽ   ÚacceptrH   r   r   r   Úsock_acceptÇ  s   €z!BaseProactorEventLoop.sock_acceptc              
   Ã   s  �z|  ¡ }W n ttjfy } zt d¡‚d }~ww zt |¡j}W n t	y0   t d¡‚w |r5|n|}|s;dS t
|dƒ}|rIt
|| |ƒn|}	t
||ƒ}d}
z.	 t
|	| |ƒ}|dkrl|
W |
dkrk| |¡ S S | j ||||¡I d H  ||7 }|
|7 }
qT|
dkr‹| |¡ w w )Nznot a regular filer   l   ÿÿ )rA   ÚAttributeErrorÚioÚUnsupportedOperationr   ÚSendfileNotAvailableErrorÚosÚfstatÚst_sizer]   ÚminÚseekrŽ   Úsendfile)r4   r   ÚfileÚoffsetÚcountrA   ÚerrÚfsizeÚ	blocksizeÚend_posÚ
total_sentr   r   r   Ú_sock_sendfile_nativeÊ  sD   €
€ÿ
ÿ

ÿüúÿz+BaseProactorEventLoop._sock_sendfile_nativec                 Ã   sn   �|  ¡ }| ¡  | ¡ I d H  z| j|j|||dd�I d H W | ¡  |r*| ¡  S S | ¡  |r6| ¡  w w )NF)Úfallback)r~   r   r°   Úsock_sendfiler#   r±   r‚   )r4   Útranspr  r  r  r‚   r   r   r   Ú_sendfile_nativeç  s    €ÿ
ÿÿ
ÿz&BaseProactorEventLoop._sendfile_nativec                 C   sL   | j d ur| j  ¡  d | _ | j ¡  d | _| j ¡  d | _|  jd8  _d S )Nr   )rØ   rS   Ú_ssockrT   rá   Ú_internal_fdsrN   r   r   r   rù   ó  s   



z&BaseProactorEventLoop._close_self_pipec                 C   s:   t  ¡ \| _| _| j d¡ | j d¡ |  jd7  _d S )NFr   )r   Ú
socketpairr  rá   Úsetblockingr  rN   r   r   r   rÛ   ý  s   z%BaseProactorEventLoop._make_self_pipec              
   C   sª   z|d ur	|  ¡  | j|urW d S | j | jd¡}W n/ tjy%   Y d S  ttfy.   ‚  t	yI } z|  
d|| dœ¡ W Y d }~d S d }~ww || _| | j¡ d S )Ni   z.Error on reading from the event loop self pipe)rZ   r[   r5   )r�   rØ   rŽ   r¶   r  r   r’   r„   r…   r†   r_   r“   Ú_loop_self_reading)r4   r¦   ra   r   r   r   r     s(   
ý€ÿz(BaseProactorEventLoop._loop_self_readingc                 C   sR   | j }|d u r	d S z| d¡ W d S  ty(   | jr%tjddd� Y d S Y d S w )Nó    z3Fail to write a null byte into the self-pipe socketTr   )rá   r¥   r]   Ú_debugr   r^   )r4   Úcsockr   r   r   Ú_write_to_self   s   þÿÿz$BaseProactorEventLoop._write_to_selféd   c                    s(   d‡ ‡‡‡‡‡‡fdd„	‰ ˆ  ˆ ¡ d S )Nc              
      sJ  zE| d ur7|   ¡ \}}ˆjrt dˆ||¡ ˆƒ }ˆd ur,ˆj||ˆdd|iˆˆd� nˆj||d|iˆd� ˆ ¡ r>W d S ˆj ˆ¡} W nQ t	yˆ } z7ˆ 
¡ dkrdˆ d|t ˆ¡dœ¡ ˆ ¡  nˆjrvtjd	ˆdd
� W Y d }~d S W Y d }~d S W Y d }~d S d }~w tjy–   ˆ ¡  Y d S w | ˆjˆ 
¡ < |  ˆ ¡ d S )Nz#%r got a new connection from %r: %rTr   )ræ   r8   r9   rè   ré   rh   zAccept failed on a socket)rZ   r[   r   zAccept failed on socket %rr   )r�   r"  r   r^   rï   rä   r÷   rŽ   r  r]   rA   r_   r   r   rT   r   r’   rÙ   r“   )r¦   ÚconnrÇ   r6   ra   ©r5   Úprotocol_factoryr4   r9   r   rè   rí   r   r   r5   6  sR   ÿýþý
ÿÿÿ€ÿz2BaseProactorEventLoop._start_serving.<locals>.looprJ   )r/   )r4   r(  r   rí   r9   Úbacklogrè   r   r'  r   Ú_start_serving2  s   %z$BaseProactorEventLoop._start_servingc                 C   s   d S rJ   r   )r4   Ú
event_listr   r   r   Ú_process_events]  s   z%BaseProactorEventLoop._process_eventsc                 C   s&   | j  ¡ D ]}| ¡  q| j  ¡  d S rJ   )rÙ   ÚvaluesrS   Úclear)r4   Úfuturer   r   r   rø   a  s   
z*BaseProactorEventLoop._stop_accept_futuresc                 C   s6   | j  | ¡ d ¡}|r| ¡  | j |¡ | ¡  d S rJ   )rÙ   ÚpoprA   rS   rŽ   Ú_stop_servingrT   )r4   r   r/  r   r   r   r1  f  s
   z#BaseProactorEventLoop._stop_servingro   rJ   r²   )NNr%  N)r?   rp   rq   r!   rä   rï   rð   ró   rô   rõ   rT   rü   rÿ   r   r  r  r  r  rù   rÛ   r   r$  r*  r,  rø   r1  ru   r   r   r:   r   r   r  sP    
ÿÿü
ÿ
ÿ
ÿ
ÿ


þ+r   )$rr   Ú__all__r  r	  r   rs   rß   rÜ   r½   Ú r   r   r   r   r   r	   r
   r   Úlogr   r   Ú_FlowControlMixinÚBaseTransportr   ÚReadTransportrv   ÚWriteTransportr•   r´   ÚDatagramTransportr»   Ú	TransportrÐ   rÒ   ÚBaseEventLoopr   r   r   r   r   Ú<module>   sX    ÿ ÿ ÿnÿ þþ