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

  \à  ã               @   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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
gZdZdZeeefZe edƒZ!d(Z"dd„ Z#dd„ Z$dd„ Z%dd„ Z&dd„ Z'dd„ Z(d ej)d d dœdd„Z*e edƒ�rNd d!„ Z+nd"d!„ Z+d#d$„ Z,G d%d&„ d&ej-ƒZ.G d'd
„ d
ej/ƒZ0dS ))é    Né   )Úcompat)Ú
coroutines)Úevents)Úfutures)Útasks)Ú	coroutine)ÚloggerÚBaseEventLoopéd   g      à?ÚAF_INET6é   i  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/lib64/python3.6/asyncio/base_events.pyÚ_format_handle?   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_pipeH   s
    

r   c             C   sL   t tdƒstdƒ‚n4y| j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_reuseportQ   s    

r&   c             C   s&   t tdƒr| d@ tjkS | tjkS d S )NÚSOCK_NONBLOCKé   )r   r    ÚSOCK_STREAM)Ú	sock_typer   r   r   Ú_is_stream_socket\   s    
r+   c             C   s&   t tdƒr| d@ tjkS | tjkS d S )Nr'   r(   )r   r    Ú
SOCK_DGRAM)r*   r   r   r   Ú_is_dgram_socketh   s    
r-   c             C   sv  t tdƒsd S |dtjtjhks(| d kr,d S t|ƒr<tj}nt|ƒrLtj}nd S |d kr^d}nVt|tƒrv|dkrvd}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Þ|jtjƒ n|g}t| tƒrò| jdƒ} d| k�r d S xp|D ]h}yJtj|| ƒ t�r@|tjk�r@|||d| |ddffS |||d| |ffS W n tk
�rj   Y nX �qW d S )NÚ	inet_ptonr   ó    Ú Zidnaú%)r   r    ÚIPPROTO_TCPZIPPROTO_UDPr+   r-   r   Úbytesr   ÚintÚ	TypeErrorr!   Ú	AF_UNSPECÚAF_INETÚ	_HAS_IPv6Úappendr   Údecoder.   r$   )ÚhostÚportÚfamilyÚtypeÚprotoZafsÚafr   r   r   Ú_ipaddr_infop   sL    





rA   )r=   r>   r?   Úflagsc      
      C   sZ   | d d… \}}t |||||ƒ}|d k	r@|jƒ }	|	j|gƒ |	S |j||||||d�S d S )Né   )r=   r>   r?   rB   )rA   Úcreate_futureÚ
set_resultÚgetaddrinfo)
Úaddressr=   r>   r?   rB   Úloopr;   r<   ÚinfoÚfutr   r   r   Ú_ensure_resolved«   s    rK   ÚTCP_NODELAYc             C   s>   | j tjtjhkr:t| jƒr:| jtjkr:| jtjtj	dƒ d S )Nr   )
r=   r    r7   r   r+   r>   r?   r2   r"   rL   )r%   r   r   r   Ú_set_nodelayº   s    
rM   c             C   s   d S )Nr   )r%   r   r   r   rM   À   s    c             C   s.   | j }t|tƒr t|tƒ r d S | jjƒ  d S )N)Z
_exceptionr   ÚBaseExceptionÚ	ExceptionÚ_loopÚstop)rJ   Úexcr   r   r   Ú_run_until_complete_cbÄ   s
    
rS   c               @   sH   e Z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S )ÚServerc             C   s   || _ || _d| _g | _d S )Nr   )rP   ÚsocketsÚ_active_countÚ_waiters)ÚselfrH   rU   r   r   r   Ú__init__Ð   s    zServer.__init__c             C   s   d| j j| jf S )Nz<%s sockets=%r>)Ú	__class__Ú__name__rU   )rX   r   r   r   Ú__repr__Ö   s    zServer.__repr__c             C   s   |  j d7  _ d S )Nr   )rV   )rX   r   r   r   Ú_attachÙ   s    zServer._attachc             C   s.   |  j d8  _ | j dkr*| jd kr*| jƒ  d S )Nr   r   )rV   rU   Ú_wakeup)rX   r   r   r   Ú_detachÝ   s    zServer._detachc             C   sH   | j }|d krd S d | _ x|D ]}| jj|ƒ qW | jdkrD| jƒ  d S )Nr   )rU   rP   Z_stop_servingrV   r^   )rX   rU   r%   r   r   r   Úcloseã   s    

zServer.closec             C   s0   | j }d | _ x|D ]}|jƒ s|j|ƒ qW d S )N)rW   ÚdonerE   )rX   ÚwaitersÚwaiterr   r   r   r^   í   s
    
zServer._wakeupc             c   s<   | j d ks| jd krd S | jjƒ }| jj|ƒ |E d H  d S )N)rU   rW   rP   rD   r9   )rX   rc   r   r   r   Úwait_closedô   s
    
zServer.wait_closedN)r[   Ú
__module__Ú__qualname__rY   r\   r]   r_   r`   r^   r   rd   r   r   r   r   rT   Î   s   
rT   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„Z
dˆdd„Zd‰dd„ZdŠdd„Zed‹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/d0„ Zd1d2„ Zej� rød3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Z d;d<„ Z!d=d>„ Z"d?d@„ Z#dAdB„ Z$dCdD„ Z%dEdF„ Z&dGdH„ Z'dIdJ„ Z(dKdL„ Z)dMdMdMdMdNœdOdP„Z*dŒdQdR„Z+ed�ddMdMdMddddSœdTdU„ƒZ,edŽdVdW„ƒZ-ed�dMdMdMdddddXœdYdZ„ƒZ.ed[d\„ ƒZ/ed�e0j1e0j2dd]dddd^œd_d`„ƒZ3eddaœdbdc„ƒZ4eddde„ ƒZ5edfdg„ ƒZ6dhdi„ Z7ee8j9e8j9e8j9ddjdMdkœdldm„ƒZ:ee8j9e8j9e8j9dddMdkœdndo„ƒZ;dpdq„ Z<drds„ Z=dtdu„ Z>dvdw„ Z?dxdy„ Z@dzd{„ ZAd|d}„ ZBd~d„ ZCd€d�„ ZDd‚dƒ„ ZEd„d…„ ZFdS )‘r
   c             C   s¦   d| _ d| _d| _tjƒ | _g | _d | _d| _d | _	t
jdƒj| _d | _| jtjj odttjjdƒƒƒ d| _d | _d | _d| _ttdƒr–tjƒ | _nd | _d| _d S )Nr   FÚ	monotonicZPYTHONASYNCIODEBUGgš™™™™™¹?Úget_asyncgen_hooks) Ú_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_debugÚsysrB   Úignore_environmentÚboolÚosÚenvironÚgetÚslow_callback_durationÚ_current_handleÚ_task_factoryÚ_coroutine_wrapper_setr   ÚweakrefÚWeakSetÚ
_asyncgensÚ_asyncgens_shutdown_called)rX   r   r   r   rY   ÿ   s(    

zBaseEventLoop.__init__c             C   s    d| j j| jƒ | jƒ | jƒ f S )Nz"<%s running=%s closed=%s debug=%s>)rZ   r[   Ú
is_runningÚ	is_closedÚ	get_debug)rX   r   r   r   r\      s    zBaseEventLoop.__repr__c             C   s   t j| d�S )N)rH   )r   ZFuture)rX   r   r   r   rD   %  s    zBaseEventLoop.create_futurec             C   s@   | j ƒ  | jd kr0tj|| d�}|jr<|jd= n| j| |ƒ}|S )N)rH   r   éÿÿÿÿ)Ú_check_closedr~   r   r   Ú_source_traceback)rX   ÚcoroZtaskr   r   r   Úcreate_task)  s    

zBaseEventLoop.create_taskc             C   s$   |d k	rt |ƒ rtdƒ‚|| _d S )Nz'task factory must be a callable or None)Úcallabler5   r~   )rX   Úfactoryr   r   r   Úset_task_factory7  s    
zBaseEventLoop.set_task_factoryc             C   s   | j S )N)r~   )rX   r   r   r   Úget_task_factoryE  s    zBaseEventLoop.get_task_factoryN)ÚextraÚserverc            C   s   t ‚d S )N)ÚNotImplementedError)rX   r%   Úprotocolrc   r�   r‘   r   r   r   Ú_make_socket_transportI  s    z$BaseEventLoop._make_socket_transportF)Úserver_sideÚserver_hostnamer�   r‘   c      	      C   s   t ‚d S )N)r’   )	rX   Zrawsockr“   Ú
sslcontextrc   r•   r–   r�   r‘   r   r   r   Ú_make_ssl_transportN  s    z!BaseEventLoop._make_ssl_transportc             C   s   t ‚d S )N)r’   )rX   r%   r“   rG   rc   r�   r   r   r   Ú_make_datagram_transportT  s    z&BaseEventLoop._make_datagram_transportc             C   s   t ‚d S )N)r’   )rX   Úpiper“   rc   r�   r   r   r   Ú_make_read_pipe_transportY  s    z'BaseEventLoop._make_read_pipe_transportc             C   s   t ‚d S )N)r’   )rX   rš   r“   rc   r�   r   r   r   Ú_make_write_pipe_transport^  s    z(BaseEventLoop._make_write_pipe_transportc	       
      K   s   t ‚d S )N)r’   )
rX   r“   ÚargsÚshellÚstdinÚstdoutÚstderrÚbufsizer�   Úkwargsr   r   r   Ú_make_subprocess_transportc  s    z(BaseEventLoop._make_subprocess_transportc             C   s   t ‚d S )N)r’   )rX   r   r   r   Ú_write_to_selfj  s    zBaseEventLoop._write_to_selfc             C   s   t ‚d S )N)r’   )rX   Ú
event_listr   r   r   Ú_process_eventss  s    zBaseEventLoop._process_eventsc             C   s   | j rtdƒ‚d S )NzEvent loop is closed)rj   ÚRuntimeError)rX   r   r   r   rˆ   w  s    zBaseEventLoop._check_closedc             C   s*   | j j|ƒ | jƒ s&| j| j|jƒ ƒ d S )N)r‚   Údiscardr…   Úcall_soon_threadsafer‹   Úaclose)rX   Úagenr   r   r   Ú_asyncgen_finalizer_hook{  s    z&BaseEventLoop._asyncgen_finalizer_hookc             C   s,   | j rtjdj|ƒt| d� | jj|ƒ d S )NzNasynchronous generator {!r} was scheduled after loop.shutdown_asyncgens() call)Úsource)rƒ   ÚwarningsÚwarnÚformatÚResourceWarningr‚   Úadd)rX   r¬   r   r   r   Ú_asyncgen_firstiter_hook€  s    
z&BaseEventLoop._asyncgen_firstiter_hookc             c   s˜   d| _ | jd kst| jƒ r d S t| jƒ}| jjƒ  tjdd„ |D ƒd| dœŽ}|E d H }x8t||ƒD ]*\}}t|t	ƒrf| j
dj|ƒ||dœƒ qfW d S )NTc             S   s   g | ]}|j ƒ ‘qS r   )r«   )Ú.0Zagr   r   r   ú
<listcomp>—  s    z4BaseEventLoop.shutdown_asyncgens.<locals>.<listcomp>)Zreturn_exceptionsrH   z?an error occurred during closing of asynchronous generator {!r})ÚmessageÚ	exceptionZasyncgen)rƒ   r‚   ÚlenÚlistÚclearr   ÚgatherÚzipr   rO   Úcall_exception_handlerr±   )rX   Zclosing_agensZshutdown_coroZresultsÚresultr¬   r   r   r   Úshutdown_asyncgens‰  s"    




z BaseEventLoop.shutdown_asyncgensc             C   sÆ   | j ƒ  | jƒ rtdƒ‚tjƒ d k	r,tdƒ‚| j| jƒ tjƒ | _	| j
d k	rftjƒ }tj| j| jd� z$tj| ƒ x| jƒ  | jrtP qtW W d d| _d | _	tjd ƒ | jdƒ | j
d k	rÀ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„   r¨   r   Z_get_running_loopÚ_set_coroutine_wrapperÚ_debugÚ	threadingÚ	get_identrq   r‚   rv   rh   Úset_asyncgen_hooksr´   r­   Z_set_running_loopÚ	_run_oncerk   )rX   Zold_agen_hooksr   r   r   Úrun_forever¥  s0    







zBaseEventLoop.run_foreverc             C   sš   | j ƒ  tj|ƒ }tj|| d�}|r,d|_|jtƒ z>y| jƒ  W n,   |rj|j	ƒ rj|j
ƒ  rj|jƒ  ‚ Y nX W d |jtƒ X |j	ƒ s’tdƒ‚|jƒ S )N)rH   Fz+Event loop stopped before Future completed.)rˆ   r   Zisfuturer   Zensure_futureZ_log_destroy_pendingZadd_done_callbackrS   rÉ   ra   Z	cancelledr¸   Zremove_done_callbackr¨   r¿   )rX   ZfutureZnew_taskr   r   r   Úrun_until_completeÁ  s     
z BaseEventLoop.run_until_completec             C   s
   d| _ d S )NT)rk   )rX   r   r   r   rQ   æ  s    zBaseEventLoop.stopc             C   sj   | j ƒ rtdƒ‚| jrd S | jr,tjd| ƒ d| _| jjƒ  | jjƒ  | j	}|d k	rfd | _	|j
dd� d S )Nz!Cannot close a running event loopzClose %rTF)Úwait)r„   r¨   rj   rÄ   r	   Údebugrn   r»   ro   rp   Zshutdown)rX   Úexecutorr   r   r   r`   î  s    

zBaseEventLoop.closec             C   s   | j S )N)rj   )rX   r   r   r   r…     s    zBaseEventLoop.is_closedc             C   s0   | j ƒ s,tjd|  t| d� | jƒ s,| jƒ  d S )Nzunclosed event loop %r)r®   )r…   r¯   r°   r²   r„   r`   )rX   r   r   r   Ú__del__  s
    zBaseEventLoop.__del__c             C   s
   | j d k	S )N)rq   )rX   r   r   r   r„     s    zBaseEventLoop.is_runningc             C   s   t jƒ S )N)rr   rg   )rX   r   r   r   rr     s    zBaseEventLoop.timec             G   s,   | j | jƒ | |f|žŽ }|jr(|jd= |S )Nr   r‡   )Úcall_atrr   r‰   )rX   ZdelayÚcallbackr�   Útimerr   r   r   Ú
call_later   s    zBaseEventLoop.call_laterc             G   sX   | j ƒ  | jr"| jƒ  | j|dƒ tj|||| ƒ}|jr@|jd= tj| j	|ƒ d|_	|S )NrÏ   r   Tr‡   )
rˆ   rÄ   Ú_check_threadÚ_check_callbackr   ZTimerHandler‰   ÚheapqÚheappushro   )rX   ÚwhenrÐ   r�   rÑ   r   r   r   rÏ   5  s    zBaseEventLoop.call_atc             G   s@   | j ƒ  | jr"| jƒ  | j|dƒ | j||ƒ}|jr<|jd= |S )NÚ	call_soonr   r‡   )rˆ   rÄ   rÓ   rÔ   Ú
_call_soonr‰   )rX   rÐ   r�   r   r   r   r   rØ   E  s    
zBaseEventLoop.call_soonc             C   s>   t j|ƒst j|ƒr"tdj|ƒƒ‚t|ƒs:tdj||ƒƒ‚d S )Nz#coroutines cannot be used with {}()z0a callable object was expected by {}(), got {!r})r   ZiscoroutineZiscoroutinefunctionr5   r±   rŒ   )rX   rÐ   Úmethodr   r   r   rÔ   X  s    

zBaseEventLoop._check_callbackc             C   s,   t j||| ƒ}|jr|jd= | jj|ƒ |S )Nr   r‡   )r   ZHandler‰   rn   r9   )rX   rÐ   r�   r   r   r   r   rÙ   c  s
    zBaseEventLoop._call_soonc             C   s,   | j d krd S tjƒ }|| j kr(tdƒ‚d S )NzMNon-thread-safe operation invoked on an event loop other than the current one)rq   rÅ   rÆ   r¨   )rX   Z	thread_idr   r   r   rÓ   j  s    	

zBaseEventLoop._check_threadc             G   s@   | j ƒ  | jr| j|dƒ | j||ƒ}|jr4|jd= | jƒ  |S )Nrª   r   r‡   )rˆ   rÄ   rÔ   rÙ   r‰   r¥   )rX   rÐ   r�   r   r   r   r   rª   {  s    z"BaseEventLoop.call_soon_threadsafec             G   sZ   | j ƒ  | jr| j|dƒ |d kr@| j}|d kr@tjjƒ }|| _tj|j|f|žŽ | d�S )NÚrun_in_executor)rH   )	rˆ   rÄ   rÔ   rp   Ú
concurrentr   ZThreadPoolExecutorZwrap_futureZsubmit)rX   rÍ   Úfuncr�   r   r   r   rÛ   †  s    
zBaseEventLoop.run_in_executorc             C   s
   || _ d S )N)rp   )rX   rÍ   r   r   r   Úset_default_executor‘  s    z"BaseEventLoop.set_default_executorc             C   sÊ   d||f g}|r |j d| ƒ |r2|j d| ƒ |rD|j d| ƒ |rV|j d| ƒ dj|ƒ}tjd|ƒ | jƒ }tj||||||ƒ}	| jƒ | }
d||
d	 |	f }|
| jkr¼tj|ƒ n
tj|ƒ |	S )
Nz%s:%rz	family=%rztype=%rzproto=%rzflags=%rz, zGet address info %sz(Getting address info %s took %.3f ms: %rg     @�@)	r9   Újoinr	   rÌ   rr   r    rF   r|   rI   )rX   r;   r<   r=   r>   r?   rB   ÚmsgÚt0ZaddrinfoÚdtr   r   r   Ú_getaddrinfo_debug”  s(    


z BaseEventLoop._getaddrinfo_debugr   )r=   r>   r?   rB   c         	   C   s>   | j r | jd | j||||||ƒS | jd tj||||||ƒS d S )N)rÄ   rÛ   rã   r    rF   )rX   r;   r<   r=   r>   r?   rB   r   r   r   rF   ­  s
    

zBaseEventLoop.getaddrinfoc             C   s   | j d tj||ƒS )N)rÛ   r    Úgetnameinfo)rX   ZsockaddrrB   r   r   r   rä   ¶  s    zBaseEventLoop.getnameinfo)Ússlr=   r?   rB   r%   Ú
local_addrr–   c            #   s  |
d k	r| rt dƒ‚|
d kr2|r2|s.t dƒ‚|}
|d k	sD|d k	�rž|d k	rTt dƒ‚t||f|tj||| d�}|g}|	d k	ržt|	|tj||| d�}|j|ƒ nd }tj|| d�E d H  |jƒ }|sÊtdƒ‚|d k	ræ|jƒ }|sætdƒ‚g }�xÜ|D �]B\}}}}}yÒtj|||d�}|j	dƒ |d k	�rªx€|D ]j\}}}}}y|j
|ƒ P W nH tk
�r” } z*t|jd	j||jjƒ ƒƒ}|j|ƒ W Y d d }~X nX �q.W |jƒ  d }wò| j�rÀtjd
||ƒ | j||ƒE d H  W n^ tk
�r } z"|d k	�rú|jƒ  |j|ƒ W Y d d }~X qò   |d k	�r,|jƒ  ‚ Y qòX P qòW t|ƒdk�rR|d ‚nJt|d ƒ‰ t‡ fdd„|D ƒƒ�r~|d ‚tdjdjdd„ |D ƒƒƒƒ‚n,|d k�r°t dƒ‚t|jƒ�sÊt dj|ƒƒ‚| j||||
ƒE d H \}}| j�r
|jdƒ}tjd|||||ƒ ||fS )Nz+server_hostname is only meaningful with sslz:You must set server_hostname when using ssl without a hostz8host/port and sock can not be specified at the same time)r=   r>   r?   rB   rH   )rH   z!getaddrinfo() returned empty list)r=   r>   r?   Fz2error while attempting to bind on address {!r}: {}zconnect %r to %rr   r   c             3   s   | ]}t |ƒˆ kV  qd S )N)r   )rµ   rR   )Úmodelr   r   ú	<genexpr>  s    z2BaseEventLoop.create_connection.<locals>.<genexpr>zMultiple exceptions: {}z, c             s   s   | ]}t |ƒV  qd S )N)r   )rµ   rR   r   r   r   rè   #  s    z5host and port was not specified and no sock specifiedz&A Stream Socket was expected, got {!r}r    z%r connected to %s:%r: (%r, %r))r!   rK   r    r)   r9   r   rË   r¿   r$   ÚsetblockingÚbindÚerrnor±   ÚstrerrorÚlowerr`   rÄ   r	   rÌ   Úsock_connectr¹   r   Úallrß   r+   r>   Ú_create_connection_transportÚget_extra_info)rX   Úprotocol_factoryr;   r<   rå   r=   r?   rB   r%   ræ   r–   Úf1ÚfsÚf2ÚinfosZladdr_infosÚ
exceptionsr>   ZcnamerG   Ú_ZladdrrR   Ú	transportr“   r   )rç   r   Úcreate_connection¹  sœ    





"




zBaseEventLoop.create_connectionc       
   	   c   s‚   |j dƒ |ƒ }| jƒ }|rFt|tƒr*d n|}| j||||||d�}	n| j|||ƒ}	y|E d H  W n   |	jƒ  ‚ Y nX |	|fS )NF)r•   r–   )ré   rD   r   rx   r˜   r”   r`   )
rX   r%   rò   rå   r–   r•   r“   rc   r—   rù   r   r   r   rð   =  s    
z*BaseEventLoop._create_connection_transport)r=   r?   rB   Úreuse_addressÚ
reuse_portÚallow_broadcastr%   c            #   s8  |
d k	r�t |
jƒs tdj|
ƒƒ‚ˆ s@ˆs@|s@|s@|s@|s@|s@|	r~tˆ ˆ||||||	d�}djdd„ |jƒ D ƒƒ}tdj|ƒƒ‚|
jdƒ d }�n*ˆ p–ˆs¸|dkr¨td	ƒ‚||fdff}nÂtj	ƒ }x’dˆ fd
ˆffD ]~\}}|d k	rÒt
||tj||| d�E d H }|�stdƒ‚xB|D ]:\}}}}}||f}||k�r>d d g||< ||| |< �qW qÒW ‡ ‡fdd„|jƒ D ƒ}|�sztdƒ‚g }|d k�ržtjdk�oœtjdk}�x|D �]\\}}\}}d }
d }yŠtj|tj|d�}
|�rì|
jtjtjd
ƒ |�rút|
ƒ |	�r|
jtjtjd
ƒ |
jdƒ ˆ �r,|
j|ƒ ˆ�rH| j|
|ƒE d H  |}W n^ tk
�rŠ } z"|
d k	�rp|
jƒ  |j|ƒ W Y d d }~X n"   |
d k	�r¢|
jƒ  ‚ Y nX P �q¦W |d ‚|ƒ }| jƒ }| j|
|||ƒ}| j�r
ˆ �rútjdˆ ˆ||ƒ ntj dˆ||ƒ y|E d H  W n   |jƒ  ‚ Y nX ||fS )Nz#A UDP Socket was expected, got {!r})ræ   Úremote_addrr=   r?   rB   rû   rü   rý   z, c             s   s"   | ]\}}|rd j ||ƒV  qdS )z{}={}N)r±   )rµ   ÚkÚvr   r   r   rè   i  s    z9BaseEventLoop.create_datagram_endpoint.<locals>.<genexpr>zNsocket modifier keyword arguments can not be used when sock is specified. ({})Fr   zunexpected address familyr   )r=   r>   r?   rB   rH   z!getaddrinfo() returned empty listc                s8   g | ]0\}}ˆ r|d  dkp*ˆo*|d dks||f‘qS )r   Nr   r   )rµ   ÚkeyZ	addr_pair)ræ   rþ   r   r   r¶   Š  s    z:BaseEventLoop.create_datagram_endpoint.<locals>.<listcomp>zcan not get address informationÚposixÚcygwin)r=   r>   r?   z@Datagram endpoint local_addr=%r remote_addr=%r created: (%r, %r)z2Datagram endpoint remote_addr=%r created: (%r, %r))NN)!r-   r>   r!   r±   Údictrß   Úitemsré   rl   ÚOrderedDictrK   r    r,   r$   ry   Únamerv   Úplatformr"   r#   ÚSO_REUSEADDRr&   ZSO_BROADCASTrê   rî   r`   r9   rD   r™   rÄ   r	   rI   rÌ   )rX   rò   ræ   rþ   r=   r?   rB   rû   rü   rý   r%   ZoptsZproblemsZr_addrZaddr_pairs_infoZ
addr_infosÚidxZaddrrö   Zfamrø   ZprorG   r  r÷   Zlocal_addressZremote_addressrR   r“   rc   rù   r   )ræ   rþ   r   Úcreate_datagram_endpointU  s°    








z&BaseEventLoop.create_datagram_endpointc             c   s4   t ||f|tj|| d�E d H }|s0tdj|ƒƒ‚|S )N)r=   r>   rB   rH   z%getaddrinfo({!r}) returned empty list)rK   r    r)   r$   r±   )rX   r;   r<   r=   rB   rö   r   r   r   Ú_create_server_getaddrinfoÏ  s    
z(BaseEventLoop._create_server_getaddrinfor   )r=   rB   r%   Úbacklogrå   rû   rü   c             #   sš  t |tƒrtdƒ‚|d k	s$ˆd k	�r|d k	r4tdƒ‚|	d krPtjdkoNtjdk}	g }|dkrdd g}n$t |tƒs|t |t	j
ƒ r„|g}n|}‡ ‡‡‡fdd„|D ƒ}tj|dˆiŽE d H }ttjj|ƒƒ}d	}�z �x|D �]
}|\}}}}}ytj|||ƒ}W n6 tjk
�r2   ˆj�r,tjd
|||dd� wÖY nX |j|ƒ |	�rV|jtjtjdƒ |
�rdt|ƒ t�r”|tjk�r”ttdƒ�r”|jtjtjdƒ y|j |ƒ W qÖ t!k
�rà } z t!|j"d||j#j$ƒ f ƒ‚W Y d d }~X qÖX qÖW d}W d |�sx|D ]}|j%ƒ  �qúW X n2|d k�r"tdƒ‚t&|j'ƒ�s<tdj(|ƒƒ‚|g}t)ˆ|ƒ}x4|D ],}|j*|ƒ |j+d	ƒ ˆj,|||||ƒ �qRW ˆj�r–tj-d|ƒ |S )Nz*ssl argument must be an SSLContext or Nonez8host/port and sock can not be specified at the same timer  r  r0   c                s   g | ]}ˆj |ˆˆ ˆd �‘qS ))r=   rB   )r  )rµ   r;   )r=   rB   r<   rX   r   r   r¶     s   z/BaseEventLoop.create_server.<locals>.<listcomp>rH   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}z%r is serving).r   rx   r5   r!   ry   r  rv   r  r   rl   ÚIterabler   r¼   ÚsetÚ	itertoolsÚchainÚfrom_iterabler    ÚerrorrÄ   r	   Úwarningr9   r"   r#   r	  r&   r8   r   r   r  ZIPV6_V6ONLYrê   r$   rë   rì   rí   r`   r+   r>   r±   rT   Zlistenré   Z_start_servingrI   )rX   rò   r;   r<   r=   rB   r%   r  rå   rû   rü   rU   Zhostsrô   rö   Z	completedÚresr@   Zsocktyper?   Z	canonnameZsaÚerrr‘   r   )r=   rB   r<   rX   r   Úcreate_serverØ  s‚    


(





zBaseEventLoop.create_server)rå   c            c   s^   t |jƒstdj|ƒƒ‚| j|||ddd�E d H \}}| jrV|jdƒ}tjd|||ƒ ||fS )Nz&A Stream Socket was expected, got {!r}r0   T)r•   r    z%r handled: (%r, %r))	r+   r>   r!   r±   rð   rÄ   rñ   r	   rÌ   )rX   rò   r%   rå   rù   r“   r   r   r   Úconnect_accepted_socketA  s    


z%BaseEventLoop.connect_accepted_socketc             c   sd   |ƒ }| j ƒ }| j|||ƒ}y|E d H  W n   |jƒ  ‚ Y nX | jr\tjd|jƒ ||ƒ ||fS )Nz Read pipe %r connected: (%r, %r))rD   r›   r`   rÄ   r	   rÌ   Úfileno)rX   rò   rš   r“   rc   rù   r   r   r   Úconnect_read_pipeX  s    zBaseEventLoop.connect_read_pipec             c   sd   |ƒ }| j ƒ }| j|||ƒ}y|E d H  W n   |jƒ  ‚ Y nX | jr\tjd|jƒ ||ƒ ||fS )Nz!Write pipe %r connected: (%r, %r))rD   rœ   r`   rÄ   r	   rÌ   r  )rX   rò   rš   r“   rc   rù   r   r   r   Úconnect_write_pipei  s    z BaseEventLoop.connect_write_pipec             C   sŽ   |g}|d k	r |j dt|ƒ ƒ |d k	rF|tjkrF|j dt|ƒ ƒ n4|d k	r`|j dt|ƒ ƒ |d k	rz|j dt|ƒ ƒ tjdj|ƒƒ d S )Nzstdin=%szstdout=stderr=%sz	stdout=%sz	stderr=%sú )r9   r   r   r   r	   rÌ   rß   )rX   rà   rŸ   r    r¡   rI   r   r   r   Ú_log_subprocessz  s    zBaseEventLoop._log_subprocessT)rŸ   r    r¡   Úuniversal_newlinesrž   r¢   c            k   sª   t |ttfƒstdƒ‚|r"tdƒ‚|s.tdƒ‚|dkr>tdƒ‚|ƒ }
d }| jrfd| }| j||||ƒ | j|
|d||||f|	ŽE d H }| jr¢|d k	r¢tj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   r3   r   r!   rÄ   r  r¤   r	   rI   )rX   rò   ÚcmdrŸ   r    r¡   r   rž   r¢   r£   r“   Ú	debug_logrù   r   r   r   Úsubprocess_shell‡  s$    zBaseEventLoop.subprocess_shellc            o   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||||ƒ | j	||d||||f|
ŽE d H }| jrÄ|d k	rÄt
jd||ƒ ||fS )	Nz universal_newlines must be Falsezshell must be Falser   zbufsize must be 0z8program arguments must be a bytes or text string, not %szexecute program %rFz%s: %r)r!   r   r   r3   r5   r>   r[   rÄ   r  r¤   r	   rI   )rX   rò   ZprogramrŸ   r    r¡   r   rž   r¢   r�   r£   Z
popen_argsÚargr“   r"  rù   r   r   r   Úsubprocess_exec¡  s,    

zBaseEventLoop.subprocess_execc             C   s   | j S )N)rt   )rX   r   r   r   Úget_exception_handlerÀ  s    z#BaseEventLoop.get_exception_handlerc             C   s*   |d k	r t |ƒ r tdj|ƒƒ‚|| _d S )Nz/A callable object or None is expected, got {!r})rŒ   r5   r±   rt   )rX   Zhandlerr   r   r   Úset_exception_handlerÅ  s    z#BaseEventLoop.set_exception_handlerc       	      C   s  |j dƒ}|sd}|j 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jtj|ƒƒ}d}||j	ƒ 7 }n2|dkrÚdjtj|ƒƒ}d	}||j	ƒ 7 }nt
|ƒ}|jd
j||ƒƒ qpW tjdj|ƒ|d� d S )Nr·   z!Unhandled exception in event loopr¸   FZsource_tracebackZhandle_tracebackr0   z+Object created at (most recent call last):
z+Handle created at (most recent call last):
z{}: {}Ú
)r  >   r·   r¸   )r{   r>   Ú__traceback__r}   r‰   Úsortedrß   Ú	tracebackÚformat_listÚrstripr   r9   r±   r	   r  )	rX   Úcontextr·   r¸   r  Z	log_linesr  ÚvalueÚtbr   r   r   Údefault_exception_handlerÖ  s6    


z'BaseEventLoop.default_exception_handlerc             C   s°   | j d kr>y| j|ƒ W q¬ tk
r:   tjddd� Y q¬X nny| j | |ƒ W n\ tk
rª } z@y| jd||dœƒ W n" tk
r˜   tjddd� Y nX W Y d d }~X nX d S )Nz&Exception in default exception handlerT)r  z$Unhandled error in exception handler)r·   r¸   r.  zeException in default exception handler while handling an unexpected error in custom exception handler)rt   r1  rO   r	   r  )rX   r.  rR   r   r   r   r¾     s"    
z$BaseEventLoop.call_exception_handlerc             C   s   |j r
d S | jj|ƒ d S )N)Ú
_cancelledrn   r9   )rX   r   r   r   r   Ú_add_callback9  s    zBaseEventLoop._add_callbackc             C   s   | j |ƒ | jƒ  d S )N)r3  r¥   )rX   r   r   r   r   Ú_add_callback_signalsafeA  s    
z&BaseEventLoop._add_callback_signalsafec             C   s   |j r|  jd7  _d S )Nr   )ro   ri   )rX   r   r   r   r   Ú_timer_handle_cancelledF  s    z%BaseEventLoop._timer_handle_cancelledc             C   s˜  t | jƒ}|tkrd| j| tkrdg }x&| jD ]}|jr>d|_q,|j|ƒ q,W tj|ƒ || _d| _n8x6| jrš| jd jrš|  jd8  _tj	| jƒ}d|_qfW d }| j
s¬| jr²d}n*| jrÜ| jd j}ttd|| jƒ  ƒtƒ}| joè|dk�r’| jƒ }| jj|ƒ}| jƒ | }|dk�rtj}	ntj}	t |ƒ}
|d k�rLtj|	d|d |
ƒ nD|
�rntj|	d|d |d |
ƒ n"|dk�ržtj|	d|d |d ƒ n| jj|ƒ}| j|ƒ | jƒ | j }xD| j�rú| jd }|j|k�rØP tj	| jƒ}d|_| j
j|ƒ �q¸W t | j
ƒ}xˆt|ƒD ]|}| j
jƒ }|j�r*�q| j�r‚zD|| _| jƒ }|jƒ  | jƒ | }|| jk�rttj d	t!|ƒ|ƒ W d d | _X n|jƒ  �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¹   ro   Ú_MIN_SCHEDULED_TIMER_HANDLESri   Ú%_MIN_CANCELLED_TIMER_HANDLES_FRACTIONr2  r9   rÕ   ÚheapifyÚheappoprn   rk   Z_whenÚminÚmaxrr   ÚMAXIMUM_SELECT_TIMEOUTrÄ   Z	_selectorZselectÚloggingÚINFOÚDEBUGr	   Úlogr§   rs   ÚrangeÚpopleftr}   Z_runr|   r  r   )rX   Zsched_countZnew_scheduledr   Ztimeoutr×   rá   r¦   râ   ÚlevelZneventZend_timeZntodoÚir   r   r   rÈ   K  sˆ    











zBaseEventLoop._run_oncec             C   sª   yt j}t j}W n tk
r$   d S X t|ƒ}| j|kr<d S tj}|ƒ }|rz|d |fkrjtj	d| t
ƒ q¦||ƒ d| _n,|d |fkr˜tj	d| t
ƒ n|d ƒ d| _d S )Nz[loop.set_debug(True): cannot set debug coroutine wrapper; another wrapper is already set %rTzWloop.set_debug(False): cannot unset debug coroutine wrapper; another wrapper was set %rF)rv   Úset_coroutine_wrapperÚget_coroutine_wrapperÚAttributeErrorrx   r   r   Zdebug_wrapperr¯   r°   ÚRuntimeWarning)rX   ÚenabledZset_wrapperZget_wrapperÚwrapperZcurrent_wrapperr   r   r   rÃ   ®  s.    

z$BaseEventLoop._set_coroutine_wrapperc             C   s   | j S )N)rÄ   )rX   r   r   r   r†   Ï  s    zBaseEventLoop.get_debugc             C   s   || _ | jƒ r| j|ƒ d S )N)rÄ   r„   rÃ   )rX   rI  r   r   r   ru   Ò  s    zBaseEventLoop.set_debug)N)N)NNN)NN)NN)N)r   )NN)F)NN)NN)Gr[   re   rf   rY   r\   rD   r‹   rŽ   r�   r”   r˜   r™   r›   rœ   r   r¤   r¥   r§   rˆ   r­   r´   rÀ   rÉ   rÊ   rQ   r`   r…   r   ZPY34rÎ   r„   rr   rÒ   rÏ   rØ   rÔ   rÙ   rÓ   rª   rÛ   rÞ   rã   rF   rä   rú   rð   r  r  r    r6   Z
AI_PASSIVEr  r  r  r  r  r   r   r#  r%  r&  r'  r1  r¾   r3  r4  r5  rÈ   rÃ   r†   ru   r   r   r   r   r
   ý   s¶   !
 
 
		%	

 u	`12c!i€Q )1rl   Zconcurrent.futuresrÜ   rÕ   Úinspectr  r=  ry   r    r   rÅ   rr   r+  rv   r¯   r€   r0   r   r   r   r   r   r   r@  r	   Ú__all__r6  r7  ÚBrokenPipeErrorÚConnectionResetErrorÚConnectionAbortedErrorZ_FATAL_ERROR_IGNOREr   r8   r<  r   r   r&   r+   r-   rA   r)   rK   rM   rS   ZAbstractServerrT   ZAbstractEventLoopr
   r   r   r   r   Ú<module>   sT   
		;

/