
-c`M                 @   s_  d  Z  d g 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 Gd d   d e
 j e
 j  Z Gd d   d e e
 j  Z Gd d   d e e
 j  Z Gd d   d e  Z Gd d   d e e e
 j  Z Gd d   d e e e
 j  Z Gd d   d e j  Z d S)zEvent loop using a proactor and related classes.

A proactor is a "notify-on-completion" multiplexer.  Currently a
proactor is only implemented on Windows with IOCP.
BaseProactorEventLoop    N   )base_events)compat)	constants)futures)sslproto)
transports)loggerc                   s   e  Z d  Z d Z d d d   f d d  Z d d   Z d d   Z d	 d
   Z d d   Z e	 j
 rr d d   Z d d d  Z d d   Z d d   Z d d   Z   S)_ProactorBasePipeTransportz*Base class for pipe and socket transports.Nc                s   t    j | |  |  j |  | |  _ | |  _ | |  _ d  |  _ d  |  _ d  |  _ d |  _	 d |  _
 d |  _ d |  _ |  j d  k	 r |  j j   |  j j |  j j |   | d  k	 r |  j j t j | d   d  S)Nr   F)super__init__
_set_extra_sock	_protocol_server_buffer	_read_fut
_write_fut_pending_write
_conn_lost_closing_eof_writtenZ_attach_loop	call_soonZconnection_mader   Z_set_result_unless_cancelled)selfloopsockprotocolwaiterextraserver)	__class__ -/usr/lib/python3.5/asyncio/proactor_events.pyr      s$    										z#_ProactorBasePipeTransport.__init__c             C   s  |  j  j g } |  j d  k r. | j d  n |  j rD | j d  |  j d  k	 rm | j d |  j j    |  j d  k	 r | j d |  j  |  j d  k	 r | j d |  j  |  j r t	 |  j  } | j d |  |  j
 r | j d  d d	 j |  S)
Nclosedclosingzfd=%szread=%szwrite=%rzwrite_bufsize=%szEOF writtenz<%s> )r"   __name__r   appendr   filenor   r   r   lenr   join)r   infobufsizer#   r#   r$   __repr__/   s"    			z#_ProactorBasePipeTransport.__repr__c             C   s   | |  j  d <d  S)Npipe)_extra)r   r   r#   r#   r$   r   B   s    z%_ProactorBasePipeTransport._set_extrac             C   s   |  j  S)N)r   )r   r#   r#   r$   
is_closingE   s    z%_ProactorBasePipeTransport.is_closingc             C   s}   |  j  r d  Sd |  _  |  j d 7_ |  j rT |  j d  k rT |  j j |  j d   |  j d  k	 ry |  j j   d  |  _ d  S)NTr   )	r   r   r   r   r   r   _call_connection_lostr   cancel)r   r#   r#   r$   closeH   s    		z _ProactorBasePipeTransport.closec             C   s1   |  j  d  k	 r- t j d |  t  |  j   d  S)Nzunclosed transport %r)r   warningswarnResourceWarningr5   )r   r#   r#   r$   __del__W   s    z"_ProactorBasePipeTransport.__del__zFatal error on pipe transportc          	   C   sy   t  | t j  r= |  j j   rh t j d |  | d d n+ |  j j d | d | d |  d |  j i  |  j	 |  d  S)Nz%r: %sexc_infoTmessage	exceptionZ	transportr   )

isinstancer   Z_FATAL_ERROR_IGNOREr   	get_debugr
   debugcall_exception_handlerr   _force_close)r   excr;   r#   r#   r$   _fatal_error\   s    	z'_ProactorBasePipeTransport._fatal_errorc             C   s   |  j  r d  Sd |  _  |  j d 7_ |  j rD |  j j   d  |  _ |  j rc |  j j   d  |  _ d |  _ d  |  _ |  j j |  j	 |  d  S)NTr   r   )
r   r   r   r4   r   r   r   r   r   r3   )r   rB   r#   r#   r$   rA   i   s    								z'_ProactorBasePipeTransport._force_closec             C   s   z |  j  j |  Wd  t |  j d  r< |  j j t j  |  j j   d  |  _ |  j } | d  k	 rz | j	   d  |  _ Xd  S)Nshutdown)
r   Zconnection_losthasattrr   rD   socketZ	SHUT_RDWRr5   r   Z_detach)r   rB   r!   r#   r#   r$   r3   x   s    		
z0_ProactorBasePipeTransport._call_connection_lostc             C   s/   |  j  } |  j d  k	 r+ | t |  j  7} | S)N)r   r   r+   )r   sizer#   r#   r$   get_write_buffer_size   s    	z0_ProactorBasePipeTransport.get_write_buffer_size)r(   
__module____qualname____doc__r   r/   r   r2   r5   r   ZPY34r9   rC   rA   r3   rH   r#   r#   )r"   r$   r      s   	r   c                   sX   e  Z d  Z d Z d d d   f d d  Z d d   Z d d   Z d d	 d
  Z   S)_ProactorReadPipeTransportzTransport for read pipes.Nc                s?   t    j | | | | | |  d |  _ |  j j |  j  d  S)NF)r   r   _pausedr   r   _loop_reading)r   r   r   r   r   r    r!   )r"   r#   r$   r      s    	z#_ProactorReadPipeTransport.__init__c             C   sV   |  j  r t d   |  j r* t d   d |  _ |  j j   rR t j d |   d  S)Nz#Cannot pause_reading() when closingzAlready pausedTz%r pauses reading)r   RuntimeErrorrM   r   r>   r
   r?   )r   r#   r#   r$   pause_reading   s    			z(_ProactorReadPipeTransport.pause_readingc             C   sg   |  j  s t d   d |  _  |  j r+ d  S|  j j |  j |  j  |  j j   rc t j	 d |   d  S)Nz
Not pausedFz%r resumes reading)
rM   rO   r   r   r   rN   r   r>   r
   r?   )r   r#   r#   r$   resume_reading   s    			z)_ProactorReadPipeTransport.resume_readingc             C   s  |  j  r d  Sd  } zy | d  k	 rg |  j | k sR |  j d  k rL |  j sR t  d  |  _ | j   } |  j rz d  } d  S| d k r d  S|  j j j |  j d  |  _ Wn t	 k
 r} zC |  j s |  j
 | d  n" |  j j   r t j d d d WYd  d  } ~ Xn t k
 r?} z |  j |  WYd  d  } ~ Xnh t k
 rs} z |  j
 | d  WYd  d  } ~ Xn4 t j k
 r|  j s  Yn X|  j j |  j  Wd  | r|  j j |  nJ | d  k	 r|  j j   rt j d |   |  j j   } | s|  j   Xd  S)N    i   z"Fatal read error on pipe transportz*Read error on pipe transport while closingr:   Tz%r received EOF)rM   r   r   AssertionErrorresultr   	_proactorrecvr   ConnectionAbortedErrorrC   r>   r
   r?   ConnectionResetErrorrA   OSErrorr   CancelledErroradd_done_callbackrN   r   Zdata_receivedZeof_receivedr5   )r   futdatarB   Z	keep_openr#   r#   r$   rN      sJ    			"	"	z(_ProactorReadPipeTransport._loop_reading)r(   rI   rJ   rK   r   rP   rQ   rN   r#   r#   )r"   r$   rL      s   	
rL   c               @   sX   e  Z d  Z d Z d d   Z d d d d  Z d d   Z d	 d
   Z d d   Z d S)_ProactorBaseWritePipeTransportzTransport for write pipes.c             C   s  t  | t t t f  s- t d t |    |  j rB t d   | sL d  S|  j r |  j t	 j
 k rt t j d  |  j d 7_ d  S|  j d  k r |  j d  k s t  |  j d t |   n? |  j s t |  |  _ |  j   n |  j j |  |  j   d  S)Nz#data argument must be byte-ish (%r)zwrite_eof() already calledzsocket.send() raised exception.r   r]   )r=   bytes	bytearray
memoryview	TypeErrortyper   rO   r   r   Z!LOG_THRESHOLD_FOR_CONNLOST_WRITESr
   warningr   r   rS   _loop_writing_maybe_pause_protocolextend)r   r]   r#   r#   r$   write   s(    			z%_ProactorBaseWritePipeTransport.writeNc             C   s  y+| |  j  k s t  d  |  _  d |  _ | r: | j   | d  k rX |  j } d  |  _ | s |  j r} |  j j |  j d   |  j	 r |  j
 j t j  |  j   n |  j j j |  j
 |  |  _  |  j  j   s|  j d k s t  t |  |  _ |  j  j |  j  |  j   n |  j  j |  j  Wnf t k
 r_} z |  j |  WYd  d  } ~ Xn5 t k
 r} z |  j | d  WYd  d  } ~ Xn Xd  S)Nr   z#Fatal write error on pipe transport)r   rS   r   rT   r   r   r   r   r3   r   r   rD   rF   SHUT_WRZ_maybe_resume_protocolrU   sendZdoner+   r[   re   rf   rX   rA   rY   rC   )r   fr]   rB   r#   r#   r$   re     s4    		
				z-_ProactorBaseWritePipeTransport._loop_writingc             C   s   d S)NTr#   )r   r#   r#   r$   can_write_eof(  s    z-_ProactorBaseWritePipeTransport.can_write_eofc             C   s   |  j    d  S)N)r5   )r   r#   r#   r$   	write_eof+  s    z)_ProactorBaseWritePipeTransport.write_eofc             C   s   |  j  d   d  S)N)rA   )r   r#   r#   r$   abort.  s    z%_ProactorBaseWritePipeTransport.abort)	r(   rI   rJ   rK   rh   re   rl   rm   rn   r#   r#   r#   r$   r^      s   ##r^   c                   s.   e  Z d  Z   f d d   Z d d   Z   S)_ProactorWritePipeTransportc                sH   t    j | |   |  j j j |  j d  |  _ |  j j |  j  d  S)N   )	r   r   r   rU   rV   r   r   r[   _pipe_closed)r   argskw)r"   r#   r$   r   3  s    z$_ProactorWritePipeTransport.__init__c             C   s   | j    r d  S| j   d k s( t  |  j rJ |  j d  k sF t  d  S| |  j k sn t | |  j f   d  |  _ |  j d  k	 r |  j t    n
 |  j   d  S)NrR   )	Z	cancelledrT   rS   r   r   r   rA   BrokenPipeErrorr5   )r   r\   r#   r#   r$   rq   8  s    	$	z(_ProactorWritePipeTransport._pipe_closed)r(   rI   rJ   r   rq   r#   r#   )r"   r$   ro   2  s   ro   c               @   s.   e  Z d  Z d Z d d   Z d d   Z d S)_ProactorDuplexPipeTransportzTransport for duplex pipes.c             C   s   d S)NFr#   )r   r#   r#   r$   rl   M  s    z*_ProactorDuplexPipeTransport.can_write_eofc             C   s
   t   d  S)N)NotImplementedError)r   r#   r#   r$   rm   P  s    z&_ProactorDuplexPipeTransport.write_eofN)r(   rI   rJ   rK   rl   rm   r#   r#   r#   r$   ru   H  s   ru   c               @   s:   e  Z d  Z d Z d d   Z d d   Z d d   Z d S)	_ProactorSocketTransportz Transport for connected sockets.c             C   s   | |  j  d <y | j   |  j  d <Wn@ t j t f k
 rf |  j j   rb t j d | d d Yn Xd |  j  k r y | j	   |  j  d <Wn@ t j t f k
 r |  j j   r t j d | d d Yn Xd  S)NrF   Zsocknamezgetsockname() failed on %rr:   Tpeernamezgetpeername() failed on %r)
r1   ZgetsocknamerF   errorAttributeErrorr   r>   r
   rd   Zgetpeername)r   r   r#   r#   r$   r   Y  s    		z#_ProactorSocketTransport._set_extrac             C   s   d S)NTr#   )r   r#   r#   r$   rl   i  s    z&_ProactorSocketTransport.can_write_eofc             C   sE   |  j  s |  j r d  Sd |  _ |  j d  k rA |  j j t j  d  S)NT)r   r   r   r   rD   rF   ri   )r   r#   r#   r$   rm   l  s
    	z"_ProactorSocketTransport.write_eofN)r(   rI   rJ   rK   r   rl   rm   r#   r#   r#   r$   rw   T  s   rw   c                   sK  e  Z d  Z   f d d   Z d d d d d  Z d d d d d d	 d d
 d d d Z d d d d  Z d d d d  Z d d 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# d$  Z d% d&   Z d d d' d(  Z d) d*   Z d+ d,   Z d- d.   Z   S)/r   c                sb   t    j   t j d | j j  | |  _ | |  _ d  |  _ i  |  _	 | j
 |   |  j   d  S)NzUsing proactor: %s)r   r   r
   r?   r"   r(   rU   	_selector_self_reading_future_accept_futuresZset_loop_make_self_pipe)r   Zproactor)r"   r#   r$   r   v  s    				zBaseProactorEventLoop.__init__Nc             C   s   t  |  | | | | |  S)N)rw   )r   r   r   r   r    r!   r#   r#   r$   _make_socket_transport  s    z,BaseProactorEventLoop._make_socket_transportserver_sideFserver_hostnamer    r!   c      
      C   sY   t  j   s t d   t  j |  | | | | |  }	 t |  | |	 d | d | |	 j S)NzOProactor event loop requires Python 3.5 or newer (ssl.MemoryBIO) to support SSLr    r!   )r   Z_is_sslproto_availablerv   ZSSLProtocolrw   Z_app_transport)
r   Zrawsockr   
sslcontextr   r   r   r    r!   Zssl_protocolr#   r#   r$   _make_ssl_transport  s    z)BaseProactorEventLoop._make_ssl_transportc             C   s   t  |  | | | |  S)N)ru   )r   r   r   r   r    r#   r#   r$   _make_duplex_pipe_transport  s    z1BaseProactorEventLoop._make_duplex_pipe_transportc             C   s   t  |  | | | |  S)N)rL   )r   r   r   r   r    r#   r#   r$   _make_read_pipe_transport  s    z/BaseProactorEventLoop._make_read_pipe_transportc             C   s   t  |  | | | |  S)N)ro   )r   r   r   r   r    r#   r#   r$   _make_write_pipe_transport  s    z0BaseProactorEventLoop._make_write_pipe_transportc                sl   |  j    r t d   |  j   r( d  S|  j   |  j   |  j j   d  |  _ d  |  _ t   j   d  S)Nz!Cannot close a running event loop)	Z
is_runningrO   	is_closed_stop_accept_futures_close_self_piperU   r5   r{   r   )r   )r"   r#   r$   r5     s    

		zBaseProactorEventLoop.closec             C   s   |  j  j | |  S)N)rU   rV   )r   r   nr#   r#   r$   	sock_recv  s    zBaseProactorEventLoop.sock_recvc             C   s   |  j  j | |  S)N)rU   rj   )r   r   r]   r#   r#   r$   sock_sendall  s    z"BaseProactorEventLoop.sock_sendallc             C   s   |  j  j | |  S)N)rU   Zconnect)r   r   Zaddressr#   r#   r$   sock_connect  s    z"BaseProactorEventLoop.sock_connectc             C   s   |  j  j |  S)N)rU   accept)r   r   r#   r#   r$   sock_accept  s    z!BaseProactorEventLoop.sock_acceptc             C   s
   t   d  S)N)rv   )r   r#   r#   r$   _socketpair  s    z!BaseProactorEventLoop._socketpairc             C   sd   |  j  d  k	 r% |  j  j   d  |  _  |  j j   d  |  _ |  j j   d  |  _ |  j d 8_ d  S)Nr   )r|   r4   _ssockr5   _csock_internal_fds)r   r#   r#   r$   r     s    			z&BaseProactorEventLoop._close_self_pipec             C   s[   |  j    \ |  _ |  _ |  j j d  |  j j d  |  j d 7_ |  j |  j  d  S)NFr   )r   r   r   Zsetblockingr   r   _loop_self_reading)r   r#   r#   r$   r~     s
    z%BaseProactorEventLoop._make_self_pipec             C   s   y2 | d  k	 r | j    |  j j |  j d  } Wn\ t j k
 rM d  SYn] t k
 r } z$ |  j d d d | d |  i  WYd  d  } ~ Xn X| |  _ | j	 |  j
  d  S)Ni   r;   z.Error on reading from the event loop self piper<   r   )rT   rU   rV   r   r   rZ   	Exceptionr@   r|   r[   r   )r   rk   rB   r#   r#   r$   r     s    
 	z(BaseProactorEventLoop._loop_self_readingc             C   s   |  j  j d  d  S)Ns    )r   rj   )r   r#   r#   r$   _write_to_self  s    z$BaseProactorEventLoop._write_to_selfc                s5   d         f d d     j     d  S)Nc                s  y |  d  k	 r |  j    \ } }  j r@ t j d  | |     }  d  k	 r  j | |  d d d d | i d  n"  j | | d d | i d   j   r d  S j j   }  Wn t	 k
 rL} zb  j
   d k r j d d	 d
 | d  i   j   n  j r:t j d  d d WYd  d  } ~ Xn? t j k
 rj j   Yn! X|   j  j
   <|  j    d  S)Nz#%r got a new connection from %r: %rr   Tr    rx   r!   r   r;   zAccept failed on a socketr<   rF   zAccept failed on socket %rr:   )rT   Z_debugr
   r?   r   r   r   rU   r   rY   r*   r@   r5   r   rZ   r}   r[   )rk   ZconnZaddrr   rB   )r   protocol_factoryr   r!   r   r   r#   r$   r     s>    						z2BaseProactorEventLoop._start_serving.<locals>.loop)r   )r   r   r   r   r!   r#   )r   r   r   r!   r   r   r$   _start_serving  s    $$z$BaseProactorEventLoop._start_servingc             C   s   d  S)Nr#   )r   Z
event_listr#   r#   r$   _process_events  s    z%BaseProactorEventLoop._process_eventsc             C   s5   x! |  j  j   D] } | j   q W|  j  j   d  S)N)r}   valuesr4   clear)r   Zfuturer#   r#   r$   r     s    z*BaseProactorEventLoop._stop_accept_futuresc             C   s(   |  j    |  j j |  | j   d  S)N)r   rU   _stop_servingr5   )r   r   r#   r#   r$   r     s    
z#BaseProactorEventLoop._stop_serving)r(   rI   rJ   r   r   r   r   r   r   r5   r   r   r   r   r   r   r~   r   r   r   r   r   r   r#   r#   )r"   r$   r   t  s4   

()rK   __all__rF   r6    r   r   r   r   r   r	   logr
   Z_FlowControlMixinZBaseTransportr   ZReadTransportrL   ZWriteTransportr^   ro   Z	Transportru   rw   ZBaseEventLoopr   r#   r#   r#   r$   <module>   s0   	zMS
