£Á°èZ¨Ä…–K§‚«“ô4“ÒÙ´dîfUÙÃÅ WKbyÊ¦•êŽ…È®FÒ¿ÊÎóCozá¬S@6{Í:›œêZÌ:Š•_%:¢¾¾~;‘Ã~èŠ©ÊÇí`ÔÑ©úë™µ'5I¿fš×WO%ø9¾«¾DK|€ùÍD”Ýs]nHÕ¶ê×Ó¼ãžªéUWŸÈË%DÒÕ¬ï‘]/Åcx  ‰ï2ß]ä6G[]S£ÔÏ¯rs{úëóµmÒï#UQxo·õÞCe]"±/aÙ&Eã4ú9Jé_ÞåëdãöKë)AÞ                  ¯¹ægƒÛowÐø^d™ý½ßB7áyMä9ÜÖUã
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<html>
B
    YI~d$                 @   s  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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 Zdd ZG dd dejZG dd dejejZG dd deZG dd deZdS ))BaseSelectorEventLoop    N   )base_events)	constants)events)futures)	protocols)sslproto)
transports)loggerc             C   s6   y|  |}W n tk
r"   dS X t|j|@ S d S )NF)get_keyKeyErrorboolr   )selectorfdZeventkey r   </opt/alt/python37/lib64/python3.7/asyncio/selector_events.py_test_selector_event   s
    r   c             C   s    t d k	rt| t jrtdd S )Nz"Socket cannot be of type SSLSocket)ssl
isinstanceZ	SSLSocket	TypeError)sockr   r   r   _check_ssl_socket*   s    r   c                   s  e Zd ZdP fdd	ZdQdddddZdRddddejdd	d
ZdSddZ fddZ	dd Z
dd Zdd Zdd Zdd ZdddejfddZdddejfddZddej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d0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dDdE Z$dFdG Z%dHdI Z&dJdK Z'dLdM Z(dNdO Z)  Z*S )Tr   Nc                sF   t    |d krt }td|jj || _| 	  t
 | _d S )NzUsing selector: %s)super__init__	selectorsZDefaultSelectorr   debug	__class____name__	_selector_make_self_pipeweakrefZWeakValueDictionary_transports)selfr   )r   r   r   r   5   s    
zBaseSelectorEventLoop.__init__)extraserverc            C   s   t | |||||S )N)_SelectorSocketTransport)r$   r   protocolwaiterr%   r&   r   r   r   _make_socket_transport?   s    
z,BaseSelectorEventLoop._make_socket_transportF)server_sideserver_hostnamer%   r&   ssl_handshake_timeoutc         	   C   s0   t j| ||||||	d}
t| ||
||d |
jS )N)r-   )r%   r&   )r	   ZSSLProtocolr'   Z_app_transport)r$   Zrawsockr(   
sslcontextr)   r+   r,   r%   r&   r-   Zssl_protocolr   r   r   _make_ssl_transportD   s    
z)BaseSelectorEventLoop._make_ssl_transportc             C   s   t | |||||S )N)_SelectorDatagramTransport)r$   r   r(   addressr)   r%   r   r   r   _make_datagram_transportQ   s    z.BaseSelectorEventLoop._make_datagram_transportc                sL   |   rtd|  rd S |   t   | jd k	rH| j  d | _d S )Nz!Cannot close a running event loop)Z
is_runningRuntimeError	is_closed_close_self_piper   closer    )r$   )r   r   r   r6   V   s    


zBaseSelectorEventLoop.closec             C   sB   |  | j  | j  d | _| j  d | _|  jd8  _d S )Nr   )_remove_reader_ssockfilenor6   _csock_internal_fds)r$   r   r   r   r5   a   s    

z&BaseSelectorEventLoop._close_self_pipec             C   sN   t  \| _| _| jd | jd |  jd7  _| | j | j d S )NFr   )	socketZ
socketpairr8   r:   setblockingr;   _add_readerr9   _read_from_self)r$   r   r   r   r!   i   s
    z%BaseSelectorEventLoop._make_self_pipec             C   s   d S )Nr   )r$   datar   r   r   _process_self_dataq   s    z(BaseSelectorEventLoop._process_self_datac             C   sV   xPy | j d}|sP | | W q tk
r8   wY q tk
rL   P Y qX qW d S )Ni   )r8   recvrA   InterruptedErrorBlockingIOError)r$   r@   r   r   r   r?   t   s    z%BaseSelectorEventLoop._read_from_selfc             C   sJ   | j }|d k	rFy|d W n( tk
rD   | jr@tjddd Y nX d S )N    z3Fail to write a null byte into the self-pipe socketT)exc_info)r:   sendOSError_debugr   r   )r$   Zcsockr   r   r   _write_to_self   s    z$BaseSelectorEventLoop._write_to_selfd   c          
   C   s"   |  | | j|||||| d S )N)r>   r9   _accept_connection)r$   protocol_factoryr   r.   r&   backlogr-   r   r   r   _start_serving   s    
z$BaseSelectorEventLoop._start_servingc             C   s   xt |D ]}y0| \}}	| jr4td||	| |d W n tttfk
rZ   d S  t	k
r }
 z^|
j
t
jt
jt
jt
jfkr| d|
|d | |  | tj| j|||||| n W d d }
~
X Y qX d|	i}| ||||||}| | qW d S )Nz#%r got a new connection from %r: %rFz&socket.accept() out of system resource)message	exceptionr<   peername)rangeacceptrI   r   r   r=   rD   rC   ConnectionAbortedErrorrH   errnoZEMFILEZENFILEZENOBUFSZENOMEMcall_exception_handlerr7   r9   Z
call_laterr   ZACCEPT_RETRY_DELAYrO   _accept_connection2Zcreate_task)r$   rM   r   r.   r&   rN   r-   _connaddrexcr%   rT   r   r   r   rL      s6    



z(BaseSelectorEventLoop._accept_connectionc          
      s   d }d }yl| }|   }	|r8| j||||	d|||d}n| j|||	||d}y|	I d H  W n   |   Y nX W n\ tk
r }
 z>| jrd|
d}|d k	r||d< |d k	r||d< | | W d d }
~
X Y nX d S )NT)r)   r+   r%   r&   r-   )r)   r%   r&   z3Error on transport creation for incoming connection)rP   rQ   r(   	transport)create_futurer/   r*   r6   	ExceptionrI   rW   )r$   rM   rZ   r%   r.   r&   r-   r(   r]   r)   r\   contextr   r   r   rX      s6    
z)BaseSelectorEventLoop._accept_connection2c          
   C   s   |}t |tsJyt| }W n* tttfk
rH   td|d Y nX y| j| }W n tk
rl   Y nX | st	d|d|d S )NzInvalid file object: zFile descriptor z is used by transport )
r   intr9   AttributeErrorr   
ValueErrorr#   r   
is_closingr3   )r$   r   r9   r]   r   r   r   _ensure_fd_no_transport   s    
z-BaseSelectorEventLoop._ensure_fd_no_transportc       	   	   G   s   |    t||| d }y| j|}W n* tk
rR   | j|tj|d f Y n>X |j|j	 }\}}| j
||tjB ||f |d k	r|  d S )N)_check_closedr   Handler    r   r   registerr   
EVENT_READr@   modifycancel)	r$   r   callbackargshandler   maskreaderwriterr   r   r   r>      s    
z!BaseSelectorEventLoop._add_readerc             C   s   |   rdS y| j|}W n tk
r0   dS X |j|j }\}}|tj M }|sb| j| n| j	||d |f |d k	r|
  dS dS d S )NFT)r4   r    r   r   r   r@   r   ri   
unregisterrj   rk   )r$   r   r   ro   rp   rq   r   r   r   r7     s    z$BaseSelectorEventLoop._remove_readerc       	   	   G   s   |    t||| d }y| j|}W n* tk
rR   | j|tjd |f Y n>X |j|j	 }\}}| j
||tjB ||f |d k	r|  d S )N)rf   r   rg   r    r   r   rh   r   EVENT_WRITEr@   rj   rk   )	r$   r   rl   rm   rn   r   ro   rp   rq   r   r   r   _add_writer   s    
z!BaseSelectorEventLoop._add_writerc             C   s   |   rdS y| j|}W n tk
r0   dS X |j|j }\}}|tj M }|sb| j| n| j	|||d f |d k	r|
  dS dS d S )NFT)r4   r    r   r   r   r@   r   rs   rr   rj   rk   )r$   r   r   ro   rp   rq   r   r   r   _remove_writer/  s    z$BaseSelectorEventLoop._remove_writerc             G   s   |  | | j||f| S )N)re   r>   )r$   r   rl   rm   r   r   r   
add_readerF  s    
z BaseSelectorEventLoop.add_readerc             C   s   |  | | |S )N)re   r7   )r$   r   r   r   r   remove_readerK  s    
z#BaseSelectorEventLoop.remove_readerc             G   s   |  | | j||f| S )N)re   rt   )r$   r   rl   rm   r   r   r   
add_writerP  s    
z BaseSelectorEventLoop.add_writerc             C   s   |  | | |S )N)re   ru   )r$   r   r   r   r   remove_writerU  s    
z#BaseSelectorEventLoop.remove_writerc                sD   t | | jr"| dkr"td|  }| |d || |I d H S )Nr   zthe socket must be non-blocking)r   rI   
gettimeoutrc   r^   
_sock_recv)r$   r   nfutr   r   r   	sock_recvZ  s    zBaseSelectorEventLoop.sock_recvc             C   s   |d k	r|  | | rd S y||}W n` ttfk
rb   | }| || j|||| Y n6 tk
r } z|	| W d d }~X Y nX |
| d S )N)rw   	cancelledrB   rD   rC   r9   rv   r{   r_   set_exception
set_result)r$   r}   registered_fdr   r|   r@   r   r\   r   r   r   r{   h  s    
z BaseSelectorEventLoop._sock_recvc                sD   t | | jr"| dkr"td|  }| |d || |I d H S )Nr   zthe socket must be non-blocking)r   rI   rz   rc   r^   _sock_recv_into)r$   r   bufr}   r   r   r   sock_recv_into}  s    z$BaseSelectorEventLoop.sock_recv_intoc             C   s   |d k	r|  | | rd S y||}W n` ttfk
rb   | }| || j|||| Y n6 tk
r } z|	| W d d }~X Y nX |
| d S )N)rw   r   	recv_intorD   rC   r9   rv   r   r_   r   r   )r$   r}   r   r   r   nbytesr   r\   r   r   r   r     s    
z%BaseSelectorEventLoop._sock_recv_intoc                sT   t | | jr"| dkr"td|  }|r@| |d || n
|d  |I d H S )Nr   zthe socket must be non-blocking)r   rI   rz   rc   r^   _sock_sendallr   )r$   r   r@   r}   r   r   r   sock_sendall  s    	
z"BaseSelectorEventLoop.sock_sendallc          
   C   s   |d k	r|  | | rd S y||}W nF ttfk
rH   d}Y n, tk
rr } z|| d S d }~X Y nX |t|kr|d  n.|r||d  }|	 }| 
|| j|||| d S )Nr   )ry   r   rG   rD   rC   r_   r   lenr   r9   rx   r   )r$   r}   r   r   r@   r|   r\   r   r   r   r   r     s"    

z#BaseSelectorEventLoop._sock_sendallc                s   t | | jr"| dkr"tdttdr8|jtjkrf| j||j|j	| dI d H }|d \}}}}}| 
 }| ||| |I d H S )Nr   zthe socket must be non-blockingAF_UNIX)familyprotoloop)r   rI   rz   rc   hasattrr<   r   r   Z_ensure_resolvedr   r^   _sock_connect)r$   r   r1   ZresolvedrY   r}   r   r   r   sock_connect  s    z"BaseSelectorEventLoop.sock_connectc          
   C   s   |  }y|| W nj ttfk
rV   |t| j| | || j	||| Y n6 t
k
r } z|| W d d }~X Y nX |d  d S )N)r9   ZconnectrD   rC   Zadd_done_callback	functoolspartial_sock_connect_donerx   _sock_connect_cbr_   r   r   )r$   r}   r   r1   r   r\   r   r   r   r     s    z#BaseSelectorEventLoop._sock_connectc             C   s   |  | d S )N)ry   )r$   r   r}   r   r   r   r     s    z(BaseSelectorEventLoop._sock_connect_donec          
   C   s   |  rd S y,|tjtj}|dkr6t|d| W nB ttfk
rP   Y n6 tk
rz } z|	| W d d }~X Y nX |
d  d S )Nr   zConnect call failed )r   Z
getsockoptr<   Z
SOL_SOCKETZSO_ERRORrH   rD   rC   r_   r   r   )r$   r}   r   r1   errr\   r   r   r   r     s    z&BaseSelectorEventLoop._sock_connect_cbc                sB   t | | jr"| dkr"td|  }| |d| |I d H S )Nr   zthe socket must be non-blockingF)r   rI   rz   rc   r^   _sock_accept)r$   r   r}   r   r   r   sock_accept   s    z!BaseSelectorEventLoop.sock_acceptc          
   C   s   |  }|r| | | r"d S y| \}}|d W nV ttfk
rh   | || j|d| Y n: t	k
r } z|
| W d d }~X Y nX |||f d S )NFT)r9   rw   r   rT   r=   rD   rC   rv   r   r_   r   r   )r$   r}   Z
registeredr   r   rZ   r1   r\   r   r   r   r     s    
z"BaseSelectorEventLoop._sock_acceptc          	      sl   | j |j= | }|  | I d H  z| j|j|||ddI d H S |  |rZ|  || j |j< X d S )NF)fallback)	r#   _sock_fd
is_readingpause_reading_make_empty_waiterZsock_sendfile_sock_reset_empty_waiterresume_reading)r$   Ztranspfileoffsetcountr   r   r   r   _sendfile_native  s    
z&BaseSelectorEventLoop._sendfile_nativec             C   s   x~|D ]v\}}|j |j }\}}|tj@ rN|d k	rN|jrD| | n
| | |tj@ r|d k	r|jrr| | q| | qW d S )N)	fileobjr@   r   ri   Z
_cancelledr7   Z_add_callbackrs   ru   )r$   Z
event_listr   ro   r   rp   rq   r   r   r   _process_events-  s    
z%BaseSelectorEventLoop._process_eventsc             C   s   |  |  |  d S )N)r7   r9   r6   )r$   r   r   r   r   _stop_serving;  s    z#BaseSelectorEventLoop._stop_serving)N)N)N)NNN)+r   
__module____qualname__r   r*   r   ZSSL_HANDSHAKE_TIMEOUTr/   r2   r6   r5   r!   rA   r?   rJ   rO   rL   rX   re   r>   r7   rt   ru   rv   rw   rx   ry   r~   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   )r   r   r   /   sX   


+$r   c                   s   e Zd ZdZe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dd ZdddZdd Zdd Zdd Zdd Z  ZS ) _SelectorTransporti   Nc                s   t  || || jd< y| | jd< W n tk
rH   d | jd< Y nX d| jkry| | jd< W n  tjk
r   d | jd< Y nX || _|	 | _
d| _| | || _|  | _d| _d| _| jd k	r| j  | |j| j
< d S )Nr<   ZsocknamerR   Fr   )r   r   _extraZgetsocknamerH   Zgetpeernamer<   errorr   r9   r   _protocol_connectedset_protocol_server_buffer_factory_buffer
_conn_lost_closingZ_attachr#   )r$   r   r   r(   r%   r&   )r   r   r   r   L  s,    






z_SelectorTransport.__init__c             C   s   | j jg}| jd kr |d n| jr0|d |d| j  | jd k	r| j st| jj	| jt
j}|rz|d n
|d t| jj	| jt
j}|rd}nd}|  }|d| d	| d
 dd|S )Nclosedclosingzfd=zread=pollingz	read=idlepollingZidlezwrite=<z
, bufsize=>z<{}> )r   r   r   appendr   r   _loopr4   r   r    r   ri   rs   get_write_buffer_sizeformatjoin)r$   infor   statebufsizer   r   r   __repr__f  s*    



z_SelectorTransport.__repr__c             C   s   |  d  d S )N)_force_close)r$   r   r   r   abort  s    z_SelectorTransport.abortc             C   s   || _ d| _d S )NT)	_protocolr   )r$   r(   r   r   r   r     s    z_SelectorTransport.set_protocolc             C   s   | j S )N)r   )r$   r   r   r   get_protocol  s    z_SelectorTransport.get_protocolc             C   s   | j S )N)r   )r$   r   r   r   rd     s    z_SelectorTransport.is_closingc             C   sT   | j r
d S d| _ | j| j | jsP|  jd7  _| j| j | j| jd  d S )NTr   )	r   r   r7   r   r   r   ru   	call_soon_call_connection_lost)r$   r   r   r   r6     s    z_SelectorTransport.closec             C   s.   | j d k	r*tjd| t| d | j   d S )Nzunclosed transport )source)r   warningswarnResourceWarningr6   )r$   r   r   r   __del__  s    
z_SelectorTransport.__del__Fatal error on transportc             C   sN   t |tr(| j r@tjd| |dd n| j||| | jd | | d S )Nz%r: %sT)rF   )rP   rQ   r]   r(   )	r   rH   r   	get_debugr   r   rW   r   r   )r$   r\   rP   r   r   r   _fatal_error  s    

z_SelectorTransport._fatal_errorc             C   sd   | j r
d S | jr(| j  | j| j | jsBd| _| j| j |  j d7  _ | j| j	| d S )NTr   )
r   r   clearr   ru   r   r   r7   r   r   )r$   r\   r   r   r   r     s    
z_SelectorTransport._force_closec             C   sV   z| j r| j| W d | j  d | _d | _d | _| j}|d k	rP|  d | _X d S )N)r   r   Zconnection_lostr   r6   r   r   Z_detach)r$   r\   r&   r   r   r   r     s    
z(_SelectorTransport._call_connection_lostc             C   s
   t | jS )N)r   r   )r$   r   r   r   r     s    z(_SelectorTransport.get_write_buffer_sizec             G   s"   | j r
d S | jj||f|  d S )N)r   r   r>   )r$   r   rl   rm   r   r   r   r>     s    z_SelectorTransport._add_reader)NN)r   )r   r   r   max_size	bytearrayr   r   r   r   r   r   r   rd   r6   r   r   r   r   r   r>   r   r   r   )r   r   r   @  s    

r   c                   s   e Zd ZdZejjZd# fd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dd Zdd Z fddZdd  Zd!d" Z  ZS )$r'   TNc                s~   d | _ t ||||| d| _d| _d | _t| j | j	
| jj|  | j	
| j| j| j |d k	rz| j	
tj|d  d S )NF)_read_ready_cbr   r   _eof_paused_empty_waiterr   Z_set_nodelayr   r   r   r   connection_mader>   r   _read_readyr   _set_result_unless_cancelled)r$   r   r   r(   r)   r%   r&   )r   r   r   r     s    

z!_SelectorSocketTransport.__init__c                s.   t |tjr| j| _n| j| _t | d S )N)r   r   ZBufferedProtocol_read_ready__get_bufferr   _read_ready__data_receivedr   r   )r$   r(   )r   r   r   r     s    
z%_SelectorSocketTransport.set_protocolc             C   s   | j  o| j S )N)r   r   )r$   r   r   r   r     s    z#_SelectorSocketTransport.is_readingc             C   s>   | j s| jrd S d| _| j| j | j r:td|  d S )NTz%r pauses reading)r   r   r   r7   r   r   r   r   )r$   r   r   r   r     s    
z&_SelectorSocketTransport.pause_readingc             C   s@   | j s| jsd S d| _| | j| j | j r<td|  d S )NFz%r resumes reading)	r   r   r>   r   r   r   r   r   r   )r$   r   r   r   r      s    
z'_SelectorSocketTransport.resume_readingc             C   s   |    d S )N)r   )r$   r   r   r   r     s    z$_SelectorSocketTransport._read_readyc          
   C   s  | j r
d S y | jd}t|s(tdW n. tk
rX } z| |d d S d }~X Y nX y| j|}W nD t	t
fk
r   d S  tk
r } z| |d d S d }~X Y nX |s|   d S y| j| W n0 tk
r  } z| |d W d d }~X Y nX d S )Nz%get_buffer() returned an empty bufferz/Fatal error: protocol.get_buffer() call failed.z$Fatal read error on socket transportz3Fatal error: protocol.buffer_updated() call failed.)r   r   Z
get_bufferr   r3   r_   r   r   r   rD   rC   _read_ready__on_eofZbuffer_updated)r$   r   r\   r   r   r   r   r     s2    z0_SelectorSocketTransport._read_ready__get_bufferc          
   C   s   | j r
d S y| j| j}W nD ttfk
r4   d S  tk
r` } z| |d d S d }~X Y nX |sr|   d S y| j	
| W n. tk
r } z| |d W d d }~X Y nX d S )Nz$Fatal read error on socket transportz2Fatal error: protocol.data_received() call failed.)r   r   rB   r   rD   rC   r_   r   r   r   Zdata_received)r$   r@   r\   r   r   r   r   *  s"    z3_SelectorSocketTransport._read_ready__data_receivedc          
   C   st   | j  rtd|  y| j }W n. tk
rR } z| |d d S d }~X Y nX |rh| j | j	 n| 
  d S )Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.)r   r   r   r   r   Zeof_receivedr_   r   r7   r   r6   )r$   Z	keep_openr\   r   r   r   r   ?  s    
z,_SelectorSocketTransport._read_ready__on_eofc          
   C   s  t |tttfs$tdt|j| jr2td| j	d k	rDtd|sLd S | j
rz| j
tjkrhtd |  j
d7  _
d S | j sy| j|}W nD ttfk
r   Y nB tk
r } z| |d d S d }~X Y nX ||d  }|sd S | j| j| j | j| |   d S )Nz/data argument must be a bytes-like object, not z%Cannot call write() after write_eof()z(unable to write; sendfile is in progresszsocket.send() raised exception.r   z%Fatal write error on socket transport)r   bytesr   
memoryviewr   typer   r   r3   r   r   r   !LOG_THRESHOLD_FOR_CONNLOST_WRITESr   warningr   r   rG   rD   rC   r_   r   r   rt   r   _write_readyextend_maybe_pause_protocol)r$   r@   r|   r\   r   r   r   writeR  s6    

z_SelectorSocketTransport.writec          
   C   s   | j r
d S y| j| j}W nr ttfk
r4   Y n tk
r } z>| j| j	 | j
  | |d | jd k	r~| j| W d d }~X Y njX |r| jd |= |   | js| j| j	 | jd k	r| jd  | jr| d  n| jr| jtj d S )Nz%Fatal write error on socket transport)r   r   rG   r   rD   rC   r_   r   ru   r   r   r   r   r   _maybe_resume_protocolr   r   r   r   shutdownr<   SHUT_WR)r$   r|   r\   r   r   r   r   w  s.    


z%_SelectorSocketTransport._write_readyc             C   s.   | j s| jrd S d| _| js*| jtj d S )NT)r   r   r   r   r   r<   r   )r$   r   r   r   	write_eof  s
    z"_SelectorSocketTransport.write_eofc             C   s   dS )NTr   )r$   r   r   r   can_write_eof  s    z&_SelectorSocketTransport.can_write_eofc                s*   t  | | jd k	r&| jtd d S )NzConnection is closed by peer)r   r   r   r   ConnectionError)r$   r\   )r   r   r   r     s    
z._SelectorSocketTransport._call_connection_lostc             C   s6   | j d k	rtd| j | _ | js0| j d  | j S )NzEmpty waiter is already set)r   r3   r   r^   r   r   )r$   r   r   r   r     s    
z+_SelectorSocketTransport._make_empty_waiterc             C   s
   d | _ d S )N)r   )r$   r   r   r   r     s    z,_SelectorSocketTransport._reset_empty_waiter)NNN)r   r   r   Z_start_tls_compatibler   Z_SendfileModeZ
TRY_NATIVEZ_sendfile_compatibler   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r'     s&    %r'   c                   sF   e Zd ZejZd fdd	Zdd Zdd Zddd	Z	d
d Z
  ZS )r0   Nc                s^   t  |||| || _| j| jj|  | j| j| j| j	 |d k	rZ| jt
j|d  d S )N)r   r   _addressr   r   r   r   r>   r   r   r   r   )r$   r   r   r(   r1   r)   r%   )r   r   r   r     s    

z#_SelectorDatagramTransport.__init__c             C   s   t dd | jD S )Nc             s   s   | ]\}}t |V  qd S )N)r   ).0r@   rY   r   r   r   	<genexpr>  s    zC_SelectorDatagramTransport.get_write_buffer_size.<locals>.<genexpr>)sumr   )r$   r   r   r   r     s    z0_SelectorDatagramTransport.get_write_buffer_sizec          
   C   s   | j r
d S y| j| j\}}W np ttfk
r8   Y nh tk
rd } z| j| W d d }~X Y n< t	k
r } z| 
|d W d d }~X Y nX | j|| d S )Nz&Fatal read error on datagram transport)r   r   Zrecvfromr   rD   rC   rH   r   error_receivedr_   r   Zdatagram_received)r$   r@   r[   r\   r   r   r   r     s    z&_SelectorDatagramTransport._read_readyc          
   C   sd  t |tttfs$tdt|j|s,d S | jrV|d | jfkrPtd| j | j}| j	r| jr| j	t
jkrxtd |  j	d7  _	d S | jsDy*| jd r| j| n| j|| d S  ttfk
r   | j| j| j Y n^ tk
r } z| j| d S d }~X Y n0 tk
rB } z| |d d S d }~X Y nX | jt||f |   d S )Nz/data argument must be a bytes-like object, not z!Invalid address: must be None or zsocket.send() raised exception.r   rR   z'Fatal write error on datagram transport) r   r   r   r   r   r   r   r   rc   r   r   r   r   r   r   r   r   rG   sendtorD   rC   r   rt   r   _sendto_readyrH   r   r   r_   r   r   r   )r$   r@   r[   r\   r   r   r   r     s>    

z!_SelectorDatagramTransport.sendtoc          
   C   s   x| j r| j  \}}y*| jd r0| j| n| j|| W q ttfk
rj   | j ||f P Y q t	k
r } z| j
| d S d }~X Y q tk
r } z| |d d S d }~X Y qX qW |   | j s| j| j | jr| d  d S )NrR   z'Fatal write error on datagram transport)r   popleftr   r   rG   r   rD   rC   
appendleftrH   r   r   r_   r   r   r   ru   r   r   r   )r$   r@   r[   r\   r   r   r   r     s*    
z(_SelectorDatagramTransport._sendto_ready)NNN)N)r   r   r   collectionsdequer   r   r   r   r   r   r   r   r   )r   r   r0     s    
)r0   )__all__r   rV   r   r   r<   r   r"   r   ImportError r   r   r   r   r   r	   r
   logr   r   r   ZBaseEventLoopr   Z_FlowControlMixinZ	Transportr   r'   r0   r   r   r   r   <module>   s@   
      _