B
    v9a[ ã               @   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
Z
d dlZd dlZd dlZd dlZd dlZyd dlZW n ek
rœ   dZY nX 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ZdZdZe edƒZ!dZ"dd„ Z#dd„ Z$dd„ Z%d%dd„Z&dd„ Z'e edƒrddd„ Z(ndd„ Z(G dd „ d ej)ƒZ*G d!d"„ d"ej+ƒZ,G d#d$„ d$ej-ƒZ.dS )&é    Né   )Ú	constants)Ú
coroutines)Úevents)Úfutures)Ú	protocols)Ússlproto)Útasks)Ú
transports)Úlogger)ÚBaseEventLoopéd   g      à?ÚAF_INET6i€Q c             C   s0   | j }tt|dd ƒtjƒr$t|jƒS t| ƒS d S )NÚ__self__)Z	_callbackÚ
isinstanceÚgetattrr	   ÚTaskÚreprr   Ústr)ÚhandleÚcb© r   ú!/usr/lib/python3.7/base_events.pyÚ_format_handleA   s    
r   c             C   s(   | t jkrdS | t jkrdS t| ƒS d S )Nz<pipe>z<stdout>)Ú
subprocessÚPIPEÚSTDOUTr   )Úfdr   r   r   Ú_format_pipeJ   s
    

r   c             C   sL   t tdƒstdƒ‚n4y|  tjtjd¡ W n tk
rF   tdƒ‚Y nX d S )NÚSO_REUSEPORTz)reuse_port not supported by socket moduler   zTreuse_port not supported by socket module, SO_REUSEPORT defined but not implemented.)ÚhasattrÚsocketÚ
ValueErrorÚ
setsockoptÚ
SOL_SOCKETr   ÚOSError)Úsockr   r   r   Ú_set_reuseportS   s    

r'   c       	   	   C   sz  t tdƒsd S |dtjtjhks(| d kr,d S |tjkr>tj}n|tjkrPtj}nd S |d krbd}nVt|tƒrz|dkrzd}n>t|tƒr’|dkr’d}n&yt	|ƒ}W n t
tfk
r¶   d S X |tjkrÜtjg}trâ| tj¡ n|g}t| tƒrö|  d¡} d| krd S xp|D ]h}yJt || ¡ trD|tjkrD|||d| |||ffS |||d| |ffS W n tk
rn   Y nX q
W d S )NÚ	inet_ptonr   ó    Ú Zidnaú%)r    r!   ÚIPPROTO_TCPZIPPROTO_UDPÚSOCK_STREAMÚ
SOCK_DGRAMr   Úbytesr   ÚintÚ	TypeErrorr"   Ú	AF_UNSPECÚAF_INETÚ	_HAS_IPv6Úappendr   Údecoder(   r%   )	ÚhostÚportÚfamilyÚtypeÚprotoZflowinfoZscopeidZafsÚafr   r   r   Ú_ipaddr_info^   sL    







r=   c             C   s:   |   ¡ s(|  ¡ }t|tƒr(t|tƒs(d S t | ¡ ¡  d S )N)Ú	cancelledÚ	exceptionr   ÚBaseExceptionÚ	Exceptionr   Z	_get_loopÚstop)ÚfutÚexcr   r   r   Ú_run_until_complete_cb™   s
    rE   ÚTCP_NODELAYc             C   s@   | j tjtjhkr<| jtjkr<| jtjkr<|  tjtj	d¡ d S )Nr   )
r9   r!   r3   r   r:   r-   r;   r,   r#   rF   )r&   r   r   r   Ú_set_nodelay¤   s    rG   c             C   s   d S )Nr   )r&   r   r   r   rG   ª   s    c               @   sT   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d„ Z
dd„ ZdS )Ú_SendfileFallbackProtocolc             C   sh   t |tjƒstdƒ‚|| _| ¡ | _| ¡ | _|j	| _
| ¡  | | ¡ | j
r^| jj ¡ | _nd | _d S )Nz.transport should be _FlowControlMixin instance)r   r
   Z_FlowControlMixinr1   Ú
_transportZget_protocolÚ_protoZ
is_readingÚ_should_resume_readingZ_protocol_pausedÚ_should_resume_writingÚpause_readingÚset_protocolÚ_loopÚcreate_futureÚ_write_ready_fut)ÚselfÚtranspr   r   r   Ú__init__¯   s    


z"_SendfileFallbackProtocol.__init__c             Ã   s2   | j  ¡ rtdƒ‚| j}|d kr$d S |I d H  d S )NzConnection closed by peer)rI   Ú
is_closingÚConnectionErrorrQ   )rR   rC   r   r   r   Údrain½   s    
z_SendfileFallbackProtocol.drainc             C   s   t dƒ‚d S )Nz?Invalid state: connection should have been established already.)ÚRuntimeError)rR   Ú	transportr   r   r   Úconnection_madeÅ   s    z)_SendfileFallbackProtocol.connection_madec             C   s@   | j d k	r0|d kr$| j  tdƒ¡ n| j  |¡ | j |¡ d S )NzConnection is closed by peer)rQ   Zset_exceptionrV   rJ   Úconnection_lost)rR   rD   r   r   r   r[   É   s    
z)_SendfileFallbackProtocol.connection_lostc             C   s    | j d k	rd S | jj ¡ | _ d S )N)rQ   rI   rO   rP   )rR   r   r   r   Úpause_writingÔ   s    
z'_SendfileFallbackProtocol.pause_writingc             C   s$   | j d krd S | j  d¡ d | _ d S )NF)rQ   Ú
set_result)rR   r   r   r   Úresume_writingÙ   s    
z(_SendfileFallbackProtocol.resume_writingc             C   s   t dƒ‚d S )Nz'Invalid state: reading should be paused)rX   )rR   Údatar   r   r   Údata_receivedß   s    z'_SendfileFallbackProtocol.data_receivedc             C   s   t dƒ‚d S )Nz'Invalid state: reading should be paused)rX   )rR   r   r   r   Úeof_receivedâ   s    z&_SendfileFallbackProtocol.eof_receivedc             Ã   sF   | j  | j¡ | jr| j  ¡  | jd k	r2| j ¡  | jrB| j ¡  d S )N)	rI   rN   rJ   rK   Úresume_readingrQ   ÚcancelrL   r^   )rR   r   r   r   Úrestoreå   s    


z!_SendfileFallbackProtocol.restoreN)Ú__name__Ú
__module__Ú__qualname__rT   rW   rZ   r[   r\   r^   r`   ra   rd   r   r   r   r   rH   ®   s   rH   c               @   sx   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d„ Z
edd„ ƒZdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚServerc             C   s@   || _ || _d| _g | _|| _|| _|| _|| _d| _d | _	d S )Nr   F)
rO   Ú_socketsÚ_active_countÚ_waitersÚ_protocol_factoryÚ_backlogÚ_ssl_contextÚ_ssl_handshake_timeoutÚ_servingÚ_serving_forever_fut)rR   ÚloopÚsocketsÚprotocol_factoryZssl_contextÚbacklogÚssl_handshake_timeoutr   r   r   rT   ô   s    zServer.__init__c             C   s   d| j j› d| j›dS )Nú<z	 sockets=ú>)Ú	__class__re   rs   )rR   r   r   r   Ú__repr__  s    zServer.__repr__c             C   s   |  j d7  _ d S )Nr   )rj   )rR   r   r   r   Ú_attach  s    zServer._attachc             C   s.   |  j d8  _ | j dkr*| jd kr*|  ¡  d S )Nr   r   )rj   ri   Ú_wakeup)rR   r   r   r   Ú_detach  s    zServer._detachc             C   s0   | j }d | _ x|D ]}| ¡ s| |¡ qW d S )N)rk   Údoner]   )rR   ÚwaitersÚwaiterr   r   r   r|     s
    
zServer._wakeupc          	   C   sN   | j r
d S d| _ x8| jD ].}| | j¡ | j | j|| j| | j| j¡ qW d S )NT)	rp   ri   Zlistenrm   rO   Ú_start_servingrl   rn   ro   )rR   r&   r   r   r   r     s    
zServer._start_servingc             C   s   | j S )N)rO   )rR   r   r   r   Úget_loop  s    zServer.get_loopc             C   s   | j S )N)rp   )rR   r   r   r   Ú
is_serving"  s    zServer.is_servingc             C   s   | j d krg S t| j ƒS )N)ri   Úlist)rR   r   r   r   rs   %  s    
zServer.socketsc             C   sr   | j }|d krd S d | _ x|D ]}| j |¡ qW d| _| jd k	r\| j ¡ s\| j ¡  d | _| jdkrn|  ¡  d S )NFr   )	ri   rO   Z_stop_servingrp   rq   r~   rc   rj   r|   )rR   rs   r&   r   r   r   Úclose+  s    




zServer.closec             Ã   s"   |   ¡  tjd| jdI d H  d S )Nr   )rr   )r   r	   ÚsleeprO   )rR   r   r   r   Ústart_serving>  s    zServer.start_servingc          	   Ã   s¢   | j d k	rtd| ›dƒ‚| jd kr4td| ›dƒ‚|  ¡  | j ¡ | _ zLy| j I d H  W n6 tjk
r   z|  ¡  |  	¡ I d H  W d ‚ X Y nX W d d | _ X d S )Nzserver z, is already being awaited on serve_forever()z
 is closed)
rq   rX   ri   r   rO   rP   r   ZCancelledErrorr…   Úwait_closed)rR   r   r   r   Úserve_foreverD  s    

zServer.serve_foreverc             Ã   s<   | j d ks| jd krd S | j ¡ }| j |¡ |I d H  d S )N)ri   rk   rO   rP   r5   )rR   r€   r   r   r   rˆ   Y  s
    
zServer.wait_closedN)re   rf   rg   rT   rz   r{   r}   r|   r   r‚   rƒ   Úpropertyrs   r…   r‡   r‰   rˆ   r   r   r   r   rh   ò   s   
rh   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›dddœdd„Z	dœdddddddœdd„Z
ddd„Zdždd„ZdŸdd„Zd 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d0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zdd:œd;d<„Zdd:œd=d>„Zdd:œd?d@„ZdAdB„ Z dCdD„ Z!dEdF„ Z"dd:œdGdH„Z#dIdJ„ Z$dKdL„ Z%dMdN„ Z&dOdOdOdOdPœdQdR„Z'd¡dSdT„Z(d¢ddUœdVdW„Z)dXdY„ Z*dZd[„ Z+d\d]„ Z,d£ddOdOdOddddd^œd_d`„Z-d¤dadb„Z.d¥ddUœdcdd„Z/dedf„ Z0dgdh„ Z1ddddiœdjdk„Z2d¦dOdOdOdddddlœdmdn„Z3dOe4j5dOdOdPœdodp„Z6dqdr„ Z7d§e4j8e4j9ddsddddddtœ	dudv„Z:dddwœdxdy„Z;dzd{„ Z<d|d}„ Z=d~d„ Z>e?j@e?j@e?j@dddOd€œdd‚„ZAe?j@e?j@e?j@dddOd€œdƒd„„ZBd…d†„ ZCd‡dˆ„ ZDd‰dŠ„ ZEd‹dŒ„ ZFddŽ„ ZGdd„ ZHd‘d’„ ZId“d”„ ZJd•d–„ ZKd—d˜„ ZLd™dš„ ZMdS )¨r   c             C   sˆ   d| _ d| _d| _t ¡ | _g | _d | _d| _d | _	t
 d¡j| _d | _|  t ¡ ¡ d| _d | _d | _d| _d | _t ¡ | _d| _d S )Nr   FÚ	monotonicgš™™™™™¹?)Ú_timer_cancelled_countÚ_closedÚ	_stoppingÚcollectionsÚdequeÚ_readyÚ
_scheduledÚ_default_executorZ_internal_fdsÚ
_thread_idÚtimeZget_clock_infoZ
resolutionÚ_clock_resolutionÚ_exception_handlerÚ	set_debugr   Z_is_debug_modeÚslow_callback_durationÚ_current_handleÚ_task_factoryÚ"_coroutine_origin_tracking_enabledÚ&_coroutine_origin_tracking_saved_depthÚweakrefZWeakSetÚ
_asyncgensÚ_asyncgens_shutdown_called)rR   r   r   r   rT   c  s$    

zBaseEventLoop.__init__c          	   C   s.   d| j j› d|  ¡ › d|  ¡ › d|  ¡ › d	S )Nrw   z	 running=z closed=z debug=rx   )ry   re   Ú
is_runningÚ	is_closedÚ	get_debug)rR   r   r   r   rz     s    zBaseEventLoop.__repr__c             C   s   t j| dS )N)rr   )r   ZFuture)rR   r   r   r   rP   …  s    zBaseEventLoop.create_futurec             C   s@   |   ¡  | jd kr0tj|| d}|jr<|jd= n|  | |¡}|S )N)rr   éÿÿÿÿ)Ú_check_closedr›   r	   r   Ú_source_traceback)rR   ÚcoroZtaskr   r   r   Úcreate_task‰  s    

zBaseEventLoop.create_taskc             C   s"   |d k	rt |ƒstdƒ‚|| _d S )Nz'task factory must be a callable or None)Úcallabler1   r›   )rR   Úfactoryr   r   r   Úset_task_factory—  s    
zBaseEventLoop.set_task_factoryc             C   s   | j S )N)r›   )rR   r   r   r   Úget_task_factory¥  s    zBaseEventLoop.get_task_factoryN)ÚextraÚserverc            C   s   t ‚d S )N)ÚNotImplementedError)rR   r&   Úprotocolr€   r­   r®   r   r   r   Ú_make_socket_transport©  s    z$BaseEventLoop._make_socket_transportFT)Úserver_sideÚserver_hostnamer­   r®   rv   Úcall_connection_madec            C   s   t ‚d S )N)r¯   )rR   Zrawsockr°   Ú
sslcontextr€   r²   r³   r­   r®   rv   r´   r   r   r   Ú_make_ssl_transport®  s    z!BaseEventLoop._make_ssl_transportc             C   s   t ‚d S )N)r¯   )rR   r&   r°   Úaddressr€   r­   r   r   r   Ú_make_datagram_transport·  s    z&BaseEventLoop._make_datagram_transportc             C   s   t ‚d S )N)r¯   )rR   Úpiper°   r€   r­   r   r   r   Ú_make_read_pipe_transport¼  s    z'BaseEventLoop._make_read_pipe_transportc             C   s   t ‚d S )N)r¯   )rR   r¹   r°   r€   r­   r   r   r   Ú_make_write_pipe_transportÁ  s    z(BaseEventLoop._make_write_pipe_transportc	       
      Ë   s   t ‚d S )N)r¯   )
rR   r°   ÚargsÚshellÚstdinÚstdoutÚstderrÚbufsizer­   Úkwargsr   r   r   Ú_make_subprocess_transportÆ  s    z(BaseEventLoop._make_subprocess_transportc             C   s   t ‚d S )N)r¯   )rR   r   r   r   Ú_write_to_selfÌ  s    zBaseEventLoop._write_to_selfc             C   s   t ‚d S )N)r¯   )rR   Ú
event_listr   r   r   Ú_process_eventsÕ  s    zBaseEventLoop._process_eventsc             C   s   | j rtdƒ‚d S )NzEvent loop is closed)r   rX   )rR   r   r   r   r¥   Ù  s    zBaseEventLoop._check_closedc             C   s*   | j  |¡ |  ¡ s&|  | j| ¡ ¡ d S )N)rŸ   Údiscardr¢   Úcall_soon_threadsafer¨   Úaclose)rR   Úagenr   r   r   Ú_asyncgen_finalizer_hookÝ  s    z&BaseEventLoop._asyncgen_finalizer_hookc             C   s.   | j rtjd|›dt| d | j |¡ d S )Nzasynchronous generator z3 was scheduled after loop.shutdown_asyncgens() call)Úsource)r    ÚwarningsÚwarnÚResourceWarningrŸ   Úadd)rR   rÊ   r   r   r   Ú_asyncgen_firstiter_hookâ  s
    

z&BaseEventLoop._asyncgen_firstiter_hookc             Ã   sˆ   d| _ t| jƒsd S t| jƒ}| j ¡  tjdd„ |D ƒd| dœŽI d H }x8t||ƒD ]*\}}t|t	ƒrV|  
d|›||dœ¡ qVW d S )NTc             S   s   g | ]}|  ¡ ‘qS r   )rÉ   )Ú.0Zagr   r   r   ú
<listcomp>ø  s    z4BaseEventLoop.shutdown_asyncgens.<locals>.<listcomp>)Zreturn_exceptionsrr   z;an error occurred during closing of asynchronous generator )Úmessager?   Zasyncgen)r    ÚlenrŸ   r„   Úclearr	   ÚgatherÚzipr   rA   Úcall_exception_handler)rR   Zclosing_agensÚresultsÚresultrÊ   r   r   r   Úshutdown_asyncgensë  s    



z BaseEventLoop.shutdown_asyncgensc          	   C   s²   |   ¡  |  ¡ rtdƒ‚t ¡ d k	r,tdƒ‚|  | j¡ t ¡ | _	t
 ¡ }t
j| j| jd z$t | ¡ x|  ¡  | jrjP qjW W d d| _d | _	t d ¡ |  d¡ t
j|Ž  X d S )Nz"This event loop is already runningz7Cannot run the event loop while another loop is running)Ú	firstiterÚ	finalizerF)r¥   r¡   rX   r   Z_get_running_loopÚ_set_coroutine_origin_trackingÚ_debugÚ	threadingÚ	get_identr”   ÚsysÚget_asyncgen_hooksÚset_asyncgen_hooksrÑ   rË   Z_set_running_loopÚ	_run_oncerŽ   )rR   Zold_agen_hooksr   r   r   Úrun_forever  s,    





zBaseEventLoop.run_foreverc          	   C   s˜   |   ¡  t |¡ }tj|| d}|r,d|_| t¡ z<y|  ¡  W n*   |rh| 	¡ rh| 
¡ sh| ¡  ‚ Y nX W d | t¡ X | 	¡ stdƒ‚| ¡ S )N)rr   Fz+Event loop stopped before Future completed.)r¥   r   Zisfuturer	   Zensure_futureZ_log_destroy_pendingZadd_done_callbackrE   rç   r~   r>   r?   Zremove_done_callbackrX   rÛ   )rR   ZfutureZnew_taskr   r   r   Úrun_until_complete   s     
z BaseEventLoop.run_until_completec             C   s
   d| _ d S )NT)rŽ   )rR   r   r   r   rB   E  s    zBaseEventLoop.stopc             C   sj   |   ¡ rtdƒ‚| jrd S | jr,t d| ¡ d| _| j ¡  | j ¡  | j	}|d k	rfd | _	|j
dd d S )Nz!Cannot close a running event loopzClose %rTF)Úwait)r¡   rX   r   rà   r   Údebugr‘   rÖ   r’   r“   Zshutdown)rR   Úexecutorr   r   r   r…   M  s    

zBaseEventLoop.closec             C   s   | j S )N)r   )rR   r   r   r   r¢   c  s    zBaseEventLoop.is_closedc             C   s2   |   ¡ s.tjd| ›t| d |  ¡ s.|  ¡  d S )Nzunclosed event loop )rÌ   )r¢   rÍ   rÎ   rÏ   r¡   r…   )rR   r   r   r   Ú__del__g  s
    zBaseEventLoop.__del__c             C   s
   | j d k	S )N)r”   )rR   r   r   r   r¡   n  s    zBaseEventLoop.is_runningc             C   s   t  ¡ S )N)r•   r‹   )rR   r   r   r   r•   r  s    zBaseEventLoop.time)Úcontextc            G   s2   | j |  ¡ | |f|žd|iŽ}|jr.|jd= |S )Nrí   r¤   )Úcall_atr•   r¦   )rR   ZdelayÚcallbackrí   r¼   Útimerr   r   r   Ú
call_later{  s
    zBaseEventLoop.call_laterc            G   sZ   |   ¡  | jr"|  ¡  |  |d¡ t |||| |¡}|jrB|jd= t | j	|¡ d|_	|S )Nrî   r¤   T)
r¥   rà   Ú_check_threadÚ_check_callbackr   ZTimerHandler¦   ÚheapqÚheappushr’   )rR   Úwhenrï   rí   r¼   rð   r   r   r   rî   ‘  s    zBaseEventLoop.call_atc            G   sB   |   ¡  | jr"|  ¡  |  |d¡ |  |||¡}|jr>|jd= |S )NÚ	call_soonr¤   )r¥   rà   rò   ró   Ú
_call_soonr¦   )rR   rï   rí   r¼   r   r   r   r   r÷   ¡  s    
zBaseEventLoop.call_soonc             C   sD   t  |¡st  |¡r$td|› dƒ‚t|ƒs@td|› d|›ƒ‚d S )Nzcoroutines cannot be used with z()z"a callable object was expected by z(), got )r   ZiscoroutineZiscoroutinefunctionr1   r©   )rR   rï   Úmethodr   r   r   ró   ´  s    

zBaseEventLoop._check_callbackc             C   s.   t  ||| |¡}|jr|jd= | j |¡ |S )Nr¤   )r   ZHandler¦   r‘   r5   )rR   rï   r¼   rí   r   r   r   r   rø   ¾  s
    zBaseEventLoop._call_soonc             C   s,   | j d krd S t ¡ }|| j kr(tdƒ‚d S )NzMNon-thread-safe operation invoked on an event loop other than the current one)r”   rá   râ   rX   )rR   Z	thread_idr   r   r   rò   Å  s    	

zBaseEventLoop._check_threadc            G   sB   |   ¡  | jr|  |d¡ |  |||¡}|jr6|jd= |  ¡  |S )NrÈ   r¤   )r¥   rà   ró   rø   r¦   rÄ   )rR   rï   rí   r¼   r   r   r   r   rÈ   Ö  s    z"BaseEventLoop.call_soon_threadsafec             G   sZ   |   ¡  | jr|  |d¡ |d kr@| j}|d kr@tj ¡ }|| _tj|j|f|žŽ | dS )NÚrun_in_executor)rr   )	r¥   rà   ró   r“   Ú
concurrentr   ZThreadPoolExecutorZwrap_futureZsubmit)rR   rë   Úfuncr¼   r   r   r   rú   á  s    
zBaseEventLoop.run_in_executorc             C   s
   || _ d S )N)r“   )rR   rë   r   r   r   Úset_default_executorí  s    z"BaseEventLoop.set_default_executorc             C   sÞ   |› d|›g}|r$|  d|›¡ |r8|  d|›¡ |rL|  d|›¡ |r`|  d|›¡ d |¡}t d|¡ |  ¡ }t ||||||¡}	|  ¡ | }
d|› d	|
d
 d›d|	›}|
| jkrÐt |¡ n
t |¡ |	S )Nú:zfamily=ztype=zproto=zflags=z, zGet address info %szGetting address info z took g     @@z.3fzms: )	r5   Újoinr   rê   r•   r!   Úgetaddrinfor™   Úinfo)rR   r7   r8   r9   r:   r;   ÚflagsÚmsgÚt0ZaddrinfoÚdtr   r   r   Ú_getaddrinfo_debugð  s&    


z BaseEventLoop._getaddrinfo_debugr   )r9   r:   r;   r  c         
   Ã   s2   | j r| j}ntj}|  d |||||||¡I d H S )N)rà   r  r!   r   rú   )rR   r7   r8   r9   r:   r;   r  Zgetaddr_funcr   r   r   r     s
    zBaseEventLoop.getaddrinfoc             Ã   s   |   d tj||¡I d H S )N)rú   r!   Úgetnameinfo)rR   Zsockaddrr  r   r   r   r    s    zBaseEventLoop.getnameinfo)Úfallbackc         
   Ã   s‚   | j r| ¡ dkrtdƒ‚|  ||||¡ y|  ||||¡I d H S  tjk
rj } z
|sZ‚ W d d }~X Y nX |  ||||¡I d H S )Nr   zthe socket must be non-blocking)rà   Z
gettimeoutr"   Ú_check_sendfile_paramsÚ_sock_sendfile_nativer   ÚSendfileNotAvailableErrorÚ_sock_sendfile_fallback)rR   r&   ÚfileÚoffsetÚcountr  rD   r   r   r   Úsock_sendfile  s    zBaseEventLoop.sock_sendfilec             Ã   s   t  d|›d¡‚d S )Nz-syscall sendfile is not available for socket z and file {file!r} combination)r   r  )rR   r&   r  r  r  r   r   r   r
  $  s    z#BaseEventLoop._sock_sendfile_nativec       
   
   Ã   sÌ   |r|  |¡ |rt|tjƒntj}t|ƒ}d}ztxn|rPt|| |ƒ}|dkrPP t|ƒd |… }|  d |j|¡I d H }	|	s|P |  ||d |	… ¡I d H  ||	7 }q4W |S |dkrÆt	|dƒrÆ|  || ¡ X d S )Nr   Úseek)
r  Úminr   Z!SENDFILE_FALLBACK_READBUFFER_SIZEÚ	bytearrayÚ
memoryviewrú   ÚreadintoZsock_sendallr    )
rR   r&   r  r  r  Ú	blocksizeÚbufÚ
total_sentÚviewÚreadr   r   r   r  +  s(    
z%BaseEventLoop._sock_sendfile_fallbackc             C   s”   dt |ddƒkrtdƒ‚|jtjks,tdƒ‚|d k	rbt|tƒsLtd |¡ƒ‚|dkrbtd |¡ƒ‚t|tƒsztd |¡ƒ‚|dk rtd |¡ƒ‚d S )NÚbÚmodez$file should be opened in binary modez+only SOCK_STREAM type sockets are supportedz+count must be a positive integer (got {!r})r   z0offset must be a non-negative integer (got {!r}))	r   r"   r:   r!   r-   r   r0   r1   Úformat)rR   r&   r  r  r  r   r   r   r	  E  s&    

z$BaseEventLoop._check_sendfile_params)Ússlr9   r;   r  r&   Ú
local_addrr³   rv   c            ƒ   s   |
d k	r|st dƒ‚|
d kr0|r0|s,t dƒ‚|}
|d k	rD|sDt dƒ‚|d k	sV|d k	r†|d k	rft dƒ‚| j||f|tj||| dI d H }|s”tdƒ‚|	d k	rÆ| j|	|tj||| dI d H }|sÆtdƒ‚g }xæ|D ]J\}}}}}yÚtj|||d}| d¡ |	d k	r’xˆ|D ]r\}}}}}y| |¡ P W nP tk
r| } z0d	|›d
|j ¡ › }t|j	|ƒ}| 
|¡ W d d }~X Y nX qW | ¡  d }wÒ| jr¨t d||¡ |  ||¡I d H  W n^ tk
rü } z |d k	râ| ¡  | 
|¡ W d d }~X Y qÒ   |d k	r| ¡  ‚ Y qÒX P qÒW t|ƒdkr:|d ‚nJt|d ƒ‰ t‡ fdd„|D ƒƒrf|d ‚td d dd„ |D ƒ¡¡ƒ‚n.|d kr˜t dƒ‚|jtjkr´t d|›ƒ‚| j||||
|dI d H \}}| jrø| d¡}t d|||||¡ ||fS )Nz+server_hostname is only meaningful with sslz:You must set server_hostname when using ssl without a hostz1ssl_handshake_timeout is only meaningful with sslz8host/port and sock can not be specified at the same time)r9   r:   r;   r  rr   z!getaddrinfo() returned empty list)r9   r:   r;   Fz*error while attempting to bind on address z: zconnect %r to %rr   r   c             3   s   | ]}t |ƒˆ kV  qd S )N)r   )rÒ   rD   )Úmodelr   r   ú	<genexpr>¾  s    z2BaseEventLoop.create_connection.<locals>.<genexpr>zMultiple exceptions: {}z, c             s   s   | ]}t |ƒV  qd S )N)r   )rÒ   rD   r   r   r   r!  Ã  s    z5host and port was not specified and no sock specifiedz"A Stream Socket was expected, got )rv   r!   z%r connected to %s:%r: (%r, %r))r"   Ú_ensure_resolvedr!   r-   r%   ÚsetblockingÚbindÚstrerrorÚlowerÚerrnor5   r…   rà   r   rê   Úsock_connectrÕ   r   Úallr  rÿ   r:   Ú_create_connection_transportÚget_extra_info)rR   rt   r7   r8   r  r9   r;   r  r&   r  r³   rv   ÚinfosZladdr_infosÚ
exceptionsr:   Zcnamer·   Ú_ZladdrrD   r  rY   r°   r   )r   r   Úcreate_connectionZ  s–    


"




zBaseEventLoop.create_connectionc          	   Ã   s„   |  d¡ |ƒ }|  ¡ }|rHt|tƒr*d n|}	| j|||	||||d}
n|  |||¡}
y|I d H  W n   |
 ¡  ‚ Y nX |
|fS )NF)r²   r³   rv   )r#  rP   r   Úboolr¶   r±   r…   )rR   r&   rt   r  r³   r²   rv   r°   r€   rµ   rY   r   r   r   r*  Þ  s     

z*BaseEventLoop._create_connection_transportc         
   Ã   s°   |  ¡ rtdƒ‚t|dtjjƒ}|tjjkr:td|›ƒ‚|tjjkrˆy|  ||||¡I d H S  tj	k
r† } z
|sv‚ W d d }~X Y nX |sštd|›ƒ‚|  
||||¡I d H S )NzTransport is closingZ_sendfile_compatiblez(sendfile is not supported for transport zHfallback is disabled and native sendfile is not supported for transport )rU   rX   r   r   Z_SendfileModeZUNSUPPORTEDZ
TRY_NATIVEÚ_sendfile_nativer   r  Ú_sendfile_fallback)rR   rY   r  r  r  r  r  rD   r   r   r   Úsendfileø  s&    
zBaseEventLoop.sendfilec             Ã   s   t  d¡‚d S )Nz!sendfile syscall is not supported)r   r  )rR   rS   r  r  r  r   r   r   r1  '  s    zBaseEventLoop._sendfile_nativec          
   Ã   sè   |r|  |¡ |rt|dƒnd}t|ƒ}d}t|ƒ}z~xx|rVt|| |ƒ}|dkrV|S t|ƒd |… }	|  d |j|	¡I d H }
|
s„|S | ¡ I d H  | |	d |
… ¡ ||
7 }q8W W d |dkrÔt	|dƒrÔ|  || ¡ | 
¡ I d H  X d S )Ni @  r   r  )r  r  r  rH   r  rú   r  rW   Úwriter    rd   )rR   rS   r  r  r  r  r  r  r;   r  r  r   r   r   r2  +  s,    
z BaseEventLoop._sendfile_fallback)r²   r³   rv   c         
   Ã   sØ   t d krtdƒ‚t|t jƒs*td|›ƒ‚t|ddƒsFtd|›dƒ‚|  ¡ }tj| ||||||dd}| 	¡  | 
|¡ |  |j|¡}	|  |j¡}
y|I d H  W n. tk
rÐ   | ¡  |	 ¡  |
 ¡  ‚ Y nX |jS )Nz"Python ssl module is not availablez@sslcontext is expected to be an instance of ssl.SSLContext, got Z_start_tls_compatibleFz
transport z  is not supported by start_tls())rv   r´   )r  rX   r   Z
SSLContextr1   r   rP   r   ZSSLProtocolrM   rN   r÷   rZ   rb   rA   r…   rc   Z_app_transport)rR   rY   r°   rµ   r²   r³   rv   r€   Zssl_protocolZ
conmade_cbZ	resume_cbr   r   r   Ú	start_tlsD  s4    	
zBaseEventLoop.start_tls)r9   r;   r  Úreuse_addressÚ
reuse_portÚallow_broadcastr&   c            ƒ   s¢  |
d k	r”|
j tjkr"td|
›ƒ‚ˆ sBˆsB|sB|sB|sB|sB|sB|	r‚tˆ ˆ||||||	d}d dd„ | ¡ D ƒ¡}td|› dƒ‚|
 d¡ d }nˆ s¾ˆs¾|d	kr¬td
ƒ‚||fdff}n ttdƒr|tj	krx*ˆ ˆfD ]}|d k	ràt
|tƒsàtdƒ‚qàW ||fˆ ˆfff}nÈt ¡ }x˜d	ˆ fdˆffD ]„\}}|d k	r0| j||tj||| dI d H }|sntdƒ‚xB|D ]:\}}}}}||f}||kr d d g||< ||| |< qtW q0W ‡ ‡fdd„| ¡ D ƒ}|sÞtdƒ‚g }|d krtjdko tjdk}x|D ]\\}}\}}d }
d }ytj|tj|d}
|rP|
 tjtjd¡ |r^t|
ƒ |	rv|
 tjtjd¡ |
 d¡ ˆ r|
 |¡ ˆr²|	s®|  |
|¡I d H  |}W n^ tk
rô } z |
d k	rÚ|
 ¡  | |¡ W d d }~X Y n"   |
d k	r|
 ¡  ‚ Y nX P q
W |d	 ‚|ƒ }|  ¡ }|  |
|||¡}| j rtˆ rdt! "dˆ ˆ||¡ nt! #dˆ||¡ y|I d H  W n   | ¡  ‚ Y nX ||fS )NzA UDP Socket was expected, got )r  Úremote_addrr9   r;   r  r6  r7  r8  z, c             s   s$   | ]\}}|r|› d |› V  qdS )ú=Nr   )rÒ   ÚkÚvr   r   r   r!  „  s    z9BaseEventLoop.create_datagram_endpoint.<locals>.<genexpr>zKsocket modifier keyword arguments can not be used when sock is specified. (ú)Fr   zunexpected address family)NNÚAF_UNIXzstring is expectedr   )r9   r:   r;   r  rr   z!getaddrinfo() returned empty listc                s8   g | ]0\}}ˆ r|d  dksˆr,|d dks||f‘qS )r   Nr   r   )rÒ   ÚkeyZ	addr_pair)r  r9  r   r   rÓ   «  s    z:BaseEventLoop.create_datagram_endpoint.<locals>.<listcomp>zcan not get address informationÚposixÚcygwin)r9   r:   r;   z@Datagram endpoint local_addr=%r remote_addr=%r created: (%r, %r)z2Datagram endpoint remote_addr=%r created: (%r, %r))$r:   r!   r.   r"   Údictrÿ   Úitemsr#  r    r>  r   r   r1   r   ÚOrderedDictr"  r%   ÚosÚnamerã   Úplatformr#   r$   ÚSO_REUSEADDRr'   ZSO_BROADCASTr$  r(  r…   r5   rP   r¸   rà   r   r  rê   )rR   rt   r  r9  r9   r;   r  r6  r7  r8  r&   ZoptsZproblemsZr_addrZaddr_pairs_infoZaddrZ
addr_infosÚidxr,  Zfamr.  Zpror·   r?  r-  Zlocal_addressZremote_addressrD   r°   r€   rY   r   )r  r9  r   Úcreate_datagram_endpointr  sº    








z&BaseEventLoop.create_datagram_endpointc      
      Ã   s\   |d d… \}}t |||||f|dd … žŽ }	|	d k	r<|	gS |j||||||dI d H S d S )Né   )r9   r:   r;   r  )r=   r   )
rR   r·   r9   r:   r;   r  rr   r7   r8   r  r   r   r   r"  ñ  s    zBaseEventLoop._ensure_resolvedc             Ã   s8   | j ||f|tj|| dI d H }|s4td|›dƒ‚|S )N)r9   r:   r  rr   zgetaddrinfo(z) returned empty list)r"  r!   r-   r%   )rR   r7   r8   r9   r  r,  r   r   r   Ú_create_server_getaddrinfoý  s    z(BaseEventLoop._create_server_getaddrinfor   )	r9   r  r&   ru   r  r6  r7  rv   r‡   c   	         ƒ   sÄ  t |tƒrtdƒ‚|d k	r*|d kr*tdƒ‚|d k	s<ˆd k	r*|d k	rLtdƒ‚|	d krhtjdkoftjdk}	g }|dkr|d g}n$t |tƒs”t |t	j
jƒsœ|g}n|}‡ ‡‡‡fdd„|D ƒ}tj|d	ˆiŽI d H }ttj |¡ƒ}d
}z"x|D ]}|\}}}}}yt |||¡}W n6 tjk
rJ   ˆjrDtjd|||dd wîY nX | |¡ |	rn| tjtjd¡ |
r|t|ƒ tr¬|tjkr¬ttdƒr¬| tjtj d¡ y| !|¡ W qî t"k
rú } z t"|j#d||j$ %¡ f ƒd ‚W d d }~X Y qîX qîW d}W d |s&x|D ]}| &¡  qW X n4|d kr<tdƒ‚|j'tj(krXtd|›ƒ‚|g}x|D ]}| )d
¡ qdW t*ˆ|||||ƒ}|r¬| +¡  tj,dˆdI d H  ˆjrÀt -d|¡ |S )Nz*ssl argument must be an SSLContext or Nonez1ssl_handshake_timeout is only meaningful with sslz8host/port and sock can not be specified at the same timer@  rA  r*   c                s   g | ]}ˆj |ˆˆ ˆd ‘qS ))r9   r  )rL  )rÒ   r7   )r9   r  r8   rR   r   r   rÓ   7  s   z/BaseEventLoop.create_server.<locals>.<listcomp>rr   Fz:create_server() failed to create socket.socket(%r, %r, %r)T)Úexc_infoÚIPPROTO_IPV6z0error while attempting to bind on address %r: %sz)Neither host/port nor sock were specifiedz"A Stream Socket was expected, got r   )rr   z%r is serving).r   r0  r1   r"   rE  rF  rã   rG  r   r   ÚabcÚIterabler	   r×   ÚsetÚ	itertoolsÚchainÚfrom_iterabler!   Úerrorrà   r   Úwarningr5   r#   r$   rH  r'   r4   r   r    rN  ZIPV6_V6ONLYr$  r%   r'  r%  r&  r…   r:   r-   r#  rh   r   r†   r  )rR   rt   r7   r8   r9   r  r&   ru   r  r6  r7  rv   r‡   rs   ZhostsZfsr,  Z	completedZresr<   Zsocktyper;   Z	canonnameZsaÚerrr®   r   )r9   r  r8   rR   r   Úcreate_server  sŠ    


*



zBaseEventLoop.create_server)r  rv   c            Ã   sv   |j tjkrtd|›ƒ‚|d k	r.|s.tdƒ‚| j|||dd|dI d H \}}| jrn| d¡}t d|||¡ ||fS )Nz"A Stream Socket was expected, got z1ssl_handshake_timeout is only meaningful with sslr*   T)r²   rv   r!   z%r handled: (%r, %r))	r:   r!   r-   r"   r*  rà   r+  r   rê   )rR   rt   r&   r  rv   rY   r°   r   r   r   Úconnect_accepted_socketz  s    

z%BaseEventLoop.connect_accepted_socketc             Ã   sd   |ƒ }|   ¡ }|  |||¡}y|I d H  W n   | ¡  ‚ Y nX | jr\t d| ¡ ||¡ ||fS )Nz Read pipe %r connected: (%r, %r))rP   rº   r…   rà   r   rê   Úfileno)rR   rt   r¹   r°   r€   rY   r   r   r   Úconnect_read_pipe—  s    zBaseEventLoop.connect_read_pipec             Ã   sd   |ƒ }|   ¡ }|  |||¡}y|I d H  W n   | ¡  ‚ Y nX | jr\t d| ¡ ||¡ ||fS )Nz!Write pipe %r connected: (%r, %r))rP   r»   r…   rà   r   rê   rZ  )rR   rt   r¹   r°   r€   rY   r   r   r   Úconnect_write_pipe§  s    z BaseEventLoop.connect_write_pipec             C   s–   |g}|d k	r"|  dt|ƒ› ¡ |d k	rJ|tjkrJ|  dt|ƒ› ¡ n8|d k	rf|  dt|ƒ› ¡ |d k	r‚|  dt|ƒ› ¡ t d |¡¡ d S )Nzstdin=zstdout=stderr=zstdout=zstderr=ú )r5   r   r   r   r   rê   rÿ   )rR   r  r¾   r¿   rÀ   r  r   r   r   Ú_log_subprocess·  s    zBaseEventLoop._log_subprocess)r¾   r¿   rÀ   Úuniversal_newlinesr½   rÁ   c            Ë   sª   t |ttfƒstdƒ‚|r"tdƒ‚|s.tdƒ‚|dkr>tdƒ‚|ƒ }
d }| jrfd| }|  ||||¡ | j|
|d||||f|	ŽI d H }| jr¢|d k	r¢t d||¡ ||
fS )	Nzcmd must be a stringz universal_newlines must be Falsezshell must be Truer   zbufsize must be 0zrun shell command %rTz%s: %r)	r   r/   r   r"   rà   r^  rÃ   r   r  )rR   rt   Úcmdr¾   r¿   rÀ   r_  r½   rÁ   rÂ   r°   Ú	debug_logrY   r   r   r   Úsubprocess_shellÄ  s$    zBaseEventLoop.subprocess_shellc            Ï   sÐ   |rt dƒ‚|rt dƒ‚|dkr(t dƒ‚|f|	 }x.|D ]&}t|ttfƒs8tdt|ƒj› ƒ‚q8W |ƒ }d }| jrŒd|›}|  ||||¡ | j	||d||||f|
ŽI d H }| jrÈ|d k	rÈt
 d||¡ ||fS )	Nz universal_newlines must be Falsezshell must be Falser   zbufsize must be 0z6program arguments must be a bytes or text string, not zexecute program Fz%s: %r)r"   r   r   r/   r1   r:   re   rà   r^  rÃ   r   r  )rR   rt   Zprogramr¾   r¿   rÀ   r_  r½   rÁ   r¼   rÂ   Z
popen_argsÚargr°   ra  rY   r   r   r   Úsubprocess_execà  s,    


zBaseEventLoop.subprocess_execc             C   s   | j S )N)r—   )rR   r   r   r   Úget_exception_handlerþ  s    z#BaseEventLoop.get_exception_handlerc             C   s(   |d k	rt |ƒstd|›ƒ‚|| _d S )Nz+A callable object or None is expected, got )r©   r1   r—   )rR   Zhandlerr   r   r   Úset_exception_handler  s    z#BaseEventLoop.set_exception_handlerc       	      C   s  |  d¡}|sd}|  d¡}|d k	r6t|ƒ||jf}nd}d|kr`| jd k	r`| jjr`| jj|d< |g}x’t|ƒD ]†}|dkr~qp|| }|dkr°d t |¡¡}d	}|| 	¡ 7 }n2|dkrÚd t |¡¡}d
}|| 	¡ 7 }nt
|ƒ}| |› d|› ¡ qpW tjd |¡|d d S )NrÔ   z!Unhandled exception in event loopr?   FZsource_tracebackZhandle_traceback>   r?   rÔ   r*   z+Object created at (most recent call last):
z+Handle created at (most recent call last):
z: Ú
)rM  )Úgetr:   Ú__traceback__rš   r¦   Úsortedrÿ   Ú	tracebackÚformat_listÚrstripr   r5   r   rU  )	rR   rí   rÔ   r?   rM  Z	log_linesr?  ÚvalueÚtbr   r   r   Údefault_exception_handler  s6    


z'BaseEventLoop.default_exception_handlerc             C   s°   | j d kr>y|  |¡ W q¬ tk
r:   tjddd Y q¬X nny|   | |¡ W n\ tk
rª } z>y|  d||dœ¡ W n" tk
r˜   tjddd Y nX W d d }~X Y nX d S )Nz&Exception in default exception handlerT)rM  z$Unhandled error in exception handler)rÔ   r?   rí   zeException in default exception handler while handling an unexpected error in custom exception handler)r—   rp  rA   r   rU  )rR   rí   rD   r   r   r   rÙ   F  s"    
z$BaseEventLoop.call_exception_handlerc             C   s   |j r
d S | j |¡ d S )N)Ú
_cancelledr‘   r5   )rR   r   r   r   r   Ú_add_callbacky  s    zBaseEventLoop._add_callbackc             C   s   |   |¡ |  ¡  d S )N)rr  rÄ   )rR   r   r   r   r   Ú_add_callback_signalsafe  s    
z&BaseEventLoop._add_callback_signalsafec             C   s   |j r|  jd7  _d S )Nr   )r’   rŒ   )rR   r   r   r   r   Ú_timer_handle_cancelled†  s    z%BaseEventLoop._timer_handle_cancelledc          	   C   sš  t | jƒ}|tkrd| j| tkrdg }x&| jD ]}|jr>d|_q,| |¡ q,W t |¡ || _d| _n8x6| jrš| jd jrš|  jd8  _t 	| j¡}d|_qfW d }| j
s¬| jr²d}n*| jrÜ| jd j}ttd||  ¡  ƒtƒ}| jr”|dkr”|  ¡ }| j |¡}|  ¡ | }|dkr tj}	ntj}	t |ƒ}
|d krNt |	d|d |
¡ nD|
rpt |	d|d |d |
¡ n"|dkr t |	d|d |d ¡ n| j |¡}|  |¡ |  ¡ | j }xD| jrü| jd }|j|krÚP t 	| j¡}d|_| j
 |¡ qºW t | j
ƒ}xˆt|ƒD ]|}| j
 ¡ }|jr,q| jr„zD|| _|  ¡ }| ¡  |  ¡ | }|| jkrvt  d	t!|ƒ|¡ W d d | _X n| ¡  qW d }d S )
NFr   r   g      ð?zpoll took %.3f ms: %s eventsg     @@z$poll %.3f ms took %.3f ms: %s eventsz"poll %.3f ms took %.3f ms: timeoutzExecuting %s took %.3f seconds)"rÕ   r’   Ú_MIN_SCHEDULED_TIMER_HANDLESrŒ   Ú%_MIN_CANCELLED_TIMER_HANDLES_FRACTIONrq  r5   rô   ÚheapifyÚheappopr‘   rŽ   Z_whenr  Úmaxr•   ÚMAXIMUM_SELECT_TIMEOUTrà   Z	_selectorZselectÚloggingÚINFOÚDEBUGr   ÚlogrÆ   r–   ÚrangeÚpopleftrš   Z_runr™   rV  r   )rR   Zsched_countZnew_scheduledr   Ztimeoutrö   r  rÅ   r  ÚlevelZneventZend_timeZntodoÚir   r   r   ræ   ‹  sˆ    











zBaseEventLoop._run_oncec             C   sH   t |ƒt | jƒkrd S |r2t ¡ | _t tj¡ nt | j¡ || _d S )N)r0  rœ   rã   Ú#get_coroutine_origin_tracking_depthr   Ú#set_coroutine_origin_tracking_depthr   ZDEBUG_STACK_DEPTH)rR   Úenabledr   r   r   rß   î  s    

z,BaseEventLoop._set_coroutine_origin_trackingc             C   s   | j S )N)rà   )rR   r   r   r   r£   ý  s    zBaseEventLoop.get_debugc             C   s    || _ |  ¡ r|  | j|¡ d S )N)rà   r¡   rÈ   rß   )rR   r…  r   r   r   r˜      s    zBaseEventLoop.set_debug)N)N)NNN)NN)NN)N)r   )r   N)NN)FN)r   N)NN)NN)Nre   rf   rg   rT   rz   rP   r¨   r«   r¬   r±   r¶   r¸   rº   r»   rÃ   rÄ   rÆ   r¥   rË   rÑ   rÜ   rç   rè   rB   r…   r¢   rì   r¡   r•   rñ   rî   r÷   ró   rø   rò   rÈ   rú   rý   r  r   r  r  r
  r  r	  r/  r*  r3  r1  r2  r5  rJ  r!   r-   r"  rL  r2   Z
AI_PASSIVErX  rY  r[  r\  r^  r   r   rb  rd  re  rf  rp  rÙ   rr  rs  rt  ræ   rß   r£   r˜   r   r   r   r   r   a  sÔ   
 
 

		%	
	
  
.,|
	l23cr   )r   r   )/r   Zcollections.abcÚconcurrent.futuresrû   rô   rR  r{  rE  r!   r   rá   r•   rk  rã   rÍ   rž   r  ÚImportErrorr*   r   r   r   r   r   r   r	   r
   r~  r   Ú__all__ru  rv  r    r4   rz  r   r   r'   r=   rE   rG   ZProtocolrH   ZAbstractServerrh   ZAbstractEventLoopr   r   r   r   r   Ú<module>   sV   

		
;

Do