
\[\F                 @   s3  d  Z  d g 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	 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)	constants)futures)
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 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   n  |  j j |  j j |   | d  k	 r |  j j | j d   n  d  S)Nr   F)super__init__
_set_extra_loop_sock	_protocol_server_buffer	_read_fut
_write_fut_pending_write
_conn_lost_closing_eof_writtenZ_attach	call_soonZconnection_madeZ_set_result_unless_cancelled)selfloopsockprotocolwaiterextraserver)	__class__ -/usr/lib/python3.4/asyncio/proactor_events.pyr      s$    											z#_ProactorBasePipeTransport.__init__c             C   s   |  j  j d |  j j   g } |  j d  k	 rE | j d |  j  n  |  j d  k	 rk | j d |  j  n  |  j r t |  j  } | j d |  n  |  j	 r | j d  n  d d j
 |  S)Nzfd=%szread=%szwrite=%rzwrite_bufsize=%szEOF writtenz<%s> )r    __name__r   filenor   appendr   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   9   s    z%_ProactorBasePipeTransport._set_extrac             C   sz   |  j  r d  Sd |  _  |  j d 7_ |  j rW |  j d  k rW |  j j |  j d   n  |  j d  k	 rv |  j j   n  d  S)NTr   )	r   r   r   r   r   r   _call_connection_lostr   cancel)r   r!   r!   r"   close<   s    		z _ProactorBasePipeTransport.closezFatal error on pipe transportc             C   s   t  | t t f  rC |  j j   rr t j d |  | d d qr n/ |  j j i | d 6| d 6|  d 6|  j d 6 |  j	 |  d  S)Nz%r: %sexc_infoTmessage	exceptionZ	transportr   )

isinstanceBrokenPipeErrorConnectionResetErrorr   	get_debugr   debugcall_exception_handlerr   _force_close)r   excr2   r!   r!   r"   _fatal_errorF   s    z'_ProactorBasePipeTransport._fatal_errorc             C   s   |  j  r d  Sd |  _  |  j d 7_ |  j r> |  j j   n  |  j rW |  j j   n  d  |  _ |  _ d |  _ d  |  _ |  j j |  j	 |  d  S)NTr   r   )
r   r   r   r/   r   r   r   r   r   r.   )r   r;   r!   r!   r"   r:   S   s    						z'_ProactorBasePipeTransport._force_closec             C   s|   z |  j  j |  Wd  t |  j d  r? |  j j t j  n  |  j j   |  j } | d  k	 rw | j	   d  |  _ n  Xd  S)Nshutdown)
r   Zconnection_losthasattrr   r=   socketZ	SHUT_RDWRr0   r   Z_detach)r   r;   r   r!   r!   r"   r.   a   s    	
z0_ProactorBasePipeTransport._call_connection_lostc             C   s2   |  j  } |  j d  k	 r. | t |  j  7} n  | S)N)r   r   r'   )r   sizer!   r!   r"   get_write_buffer_sizeq   s    	z0_ProactorBasePipeTransport.get_write_buffer_size)r$   
__module____qualname____doc__r   r+   r   r0   r<   r:   r.   rA   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   s_   |  j  r t d   n  |  j r0 t d   n  d |  _ |  j j   r[ t j d |   n  d  S)Nz#Cannot pause_reading() when closingzAlready pausedTz%r pauses reading)r   RuntimeErrorrF   r   r7   r   r8   )r   r!   r!   r"   pause_reading   s    			z(_ProactorReadPipeTransport.pause_readingc             C   sm   |  j  s t d   n  d |  _  |  j r. d  S|  j j |  j |  j  |  j j   ri t j	 d |   n  d  S)Nz
Not pausedFz%r resumes reading)
rF   rH   r   r   r   rG   r   r7   r   r8   )r   r!   r!   r"   resume_reading   s    			z)_ProactorReadPipeTransport.resume_readingc             C   s%  |  j  r d  Sd  } zy | d  k	 rj |  j | k sR |  j d  k rL |  j sR t  d  |  _ | j   } n  |  j r} d  } d  S| d k r d  S|  j j j |  j d  |  _ Wn t	 k
 r} zF |  j s |  j
 | d  n% |  j j   rt j d d d n  WYd  d  } ~ Xn t k
 rE} z |  j |  WYd  d  } ~ Xnk t k
 ry} z |  j
 | d  WYd  d  } ~ Xn7 t j k
 r|  j s  n  Yn X|  j j |  j  Wd  | r|  j j |  nS | d  k	 r |  j j   rt j d |   n  |  j j   } | s |  j   q n  Xd  S)N    i   z"Fatal read error on pipe transportz*Read error on pipe transport while closingr1   Tz%r received EOF)rF   r   r   AssertionErrorresultr   	_proactorrecvr   ConnectionAbortedErrorr<   r7   r   r8   r6   r:   OSErrorr   CancelledErroradd_done_callbackrG   r   Zdata_receivedZeof_receivedr0   )r   futdatar;   Z	keep_openr!   r!   r"   rG      sJ    			"	"	z(_ProactorReadPipeTransport._loop_reading)r$   rB   rC   rD   r   rI   rJ   rG   r!   r!   )r    r"   rE   x   s   	
rE   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  s0 t d t |    n  |  j rH t d   n  | sR d  S|  j r |  j t	 j
 k r} t j d  n  |  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   rU   )r4   bytes	bytearray
memoryview	TypeErrortyper   rH   r   r   Z!LOG_THRESHOLD_FOR_CONNLOST_WRITESr   warningr   r   rL   _loop_writing_maybe_pause_protocolextend)r   rU   r!   r!   r"   write   s(    			z%_ProactorBaseWritePipeTransport.writeNc             C   s  y7| |  j  k s t  d  |  _  d |  _ | r= | j   n  | d  k r^ |  j } d  |  _ n  | s |  j r |  j j |  j d   n  |  j	 r |  j
 j t j  n  |  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
 rk} 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   rL   r   rM   r   r   r   r   r.   r   r   r=   r?   SHUT_WRZ_maybe_resume_protocolrN   sendZdoner'   rS   r]   r^   r6   r:   rQ   r<   )r   frU   r;   r!   r!   r"   r]      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)r0   )r   r!   r!   r"   	write_eof  s    z)_ProactorBaseWritePipeTransport.write_eofc             C   s   |  j  d   d  S)N)r:   )r   r!   r!   r"   abort  s    z%_ProactorBaseWritePipeTransport.abort)	r$   rB   rC   rD   r`   r]   rd   re   rf   r!   r!   r!   r"   rV      s   '#rV   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   rN   rO   r   r   rS   _pipe_closed)r   argskw)r    r!   r"   r     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)NrK   )	Z	cancelledrM   rL   r   r   r   r:   r5   r0   )r   rT   r!   r!   r"   ri   $  s    	$	z(_ProactorWritePipeTransport._pipe_closed)r$   rB   rC   r   ri   r!   r!   )r    r"   rg     s   rg   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"   rd   9  s    z*_ProactorDuplexPipeTransport.can_write_eofc             C   s
   t   d  S)N)NotImplementedError)r   r!   r!   r"   re   <  s    z&_ProactorDuplexPipeTransport.write_eofN)r$   rB   rC   rD   rd   re   r!   r!   r!   r"   rl   4  s   rl   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 <WnC t j t f k
 ri |  j j   re t j d | d d n  Yn Xd |  j  k r y | j	   |  j  d <Wq t j t f k
 r |  j j   r t j d | d d n  Yq Xn  d  S)Nr?   Zsocknamezgetsockname() failed on %rr1   Tpeernamezgetpeername() failed on %r)
r-   Zgetsocknamer?   errorAttributeErrorr   r7   r   r\   Zgetpeername)r   r   r!   r!   r"   r   E  s    		z#_ProactorSocketTransport._set_extrac             C   s   d S)NTr!   )r   r!   r!   r"   rd   U  s    z&_ProactorSocketTransport.can_write_eofc             C   sH   |  j  s |  j r d  Sd |  _ |  j d  k rD |  j j t j  n  d  S)NT)r   r   r   r   r=   r?   ra   )r   r!   r!   r"   re   X  s
    	z"_ProactorSocketTransport.write_eofN)r$   rB   rC   rD   r   rd   re   r!   r!   r!   r"   rn   @  s   rn   c                   s$  e  Z d  Z   f d d   Z 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   r8   r    r$   rN   	_selector_self_reading_future_accept_futuresZset_loop_make_self_pipe)r   Zproactor)r    r!   r"   r   b  s    				zBaseProactorEventLoop.__init__Nc             C   s   t  |  | | | | |  S)N)rn   )r   r   r   r   r   r   r!   r!   r"   _make_socket_transportl  s    z,BaseProactorEventLoop._make_socket_transportc             C   s   t  |  | | | |  S)N)rl   )r   r   r   r   r   r!   r!   r"   _make_duplex_pipe_transportq  s    z1BaseProactorEventLoop._make_duplex_pipe_transportc             C   s   t  |  | | | |  S)N)rE   )r   r   r   r   r   r!   r!   r"   _make_read_pipe_transportv  s    z/BaseProactorEventLoop._make_read_pipe_transportc             C   s   t  |  | | | |  S)N)rg   )r   r   r   r   r   r!   r!   r"   _make_write_pipe_transportz  s    z0BaseProactorEventLoop._make_write_pipe_transportc                sT   |  j    r d  St   j   |  j   |  j   |  j j   d  |  _ d  |  _ d  S)N)	is_closedr
   r0   _stop_accept_futures_close_self_piperN   rr   )r   )r    r!   r"   r0     s    

	zBaseProactorEventLoop.closec             C   s   |  j  j | |  S)N)rN   rO   )r   r   nr!   r!   r"   	sock_recv  s    zBaseProactorEventLoop.sock_recvc             C   s   |  j  j | |  S)N)rN   rb   )r   r   rU   r!   r!   r"   sock_sendall  s    z"BaseProactorEventLoop.sock_sendallc             C   sv   y t  j | |  WnH t k
 r^ } z( t j d |   } | j |  | SWYd  d  } ~ Xn X|  j j | |  Sd  S)Nr   )r   Z_check_resolved_address
ValueErrorr   ZFutureZset_exceptionrN   Zconnect)r   r   ZaddresserrrT   r!   r!   r"   sock_connect  s    z"BaseProactorEventLoop.sock_connectc             C   s   |  j  j |  S)N)rN   accept)r   r   r!   r!   r"   sock_accept  s    z!BaseProactorEventLoop.sock_acceptc             C   s
   t   d  S)N)rm   )r   r!   r!   r"   _socketpair  s    z!BaseProactorEventLoop._socketpairc             C   sg   |  j  d  k	 r( |  j  j   d  |  _  n  |  j j   d  |  _ |  j j   d  |  _ |  j d 8_ d  S)Nr   )rs   r/   _ssockr0   _csock_internal_fds)r   r!   r!   r"   r|     s    		z&BaseProactorEventLoop._close_self_pipec             C   sd   |  j    \ |  _ |  _ |  j j d  |  j j d  |  j d 7_ |  j |  j f  d d d  S)NFr   Z
check_loop)r   r   r   Zsetblockingr   Z
_call_soon_loop_self_reading)r   r!   r!   r"   ru     s
    z%BaseProactorEventLoop._make_self_pipec          	   C   sj   y5 | d  k	 r | j    n  |  j j |  j d  } Wn |  j     Yn X| |  _ | j |  j  d  S)Ni   )rM   rN   rO   r   r0   rs   rS   r   )r   rc   r!   r!   r"   r     s    
	z(BaseProactorEventLoop._loop_self_readingc             C   s   |  j  j d  d  S)Ns    )r   rb   )r   r!   r!   r"   _write_to_self  s    z$BaseProactorEventLoop._write_to_selfc                sG   | r t  d   n  d        f d d     j    d  S)Nz'IocpEventLoop is incompatible with SSL.c                sb  y |  d  k	 rr |  j    \ } }  j rC t j d  | |  n     }  j | | d i | d 6d  n   j   r d  S j j   }  Wn t k
 r} zh  j	   d k r  j
 i d d 6| d 6 d	 6  j   n"  j rt j d
  d d n  WYd  d  } ~ Xn? t j k
 r= j   Yn! X|   j  j	   <|  j    d  S)Nz#%r got a new connection from %r: %rr   ro   r   r   zAccept failed on a socketr2   r3   r?   zAccept failed on socket %rr1   T)rM   Z_debugr   r8   rv   rz   rN   r   rQ   r%   r9   r0   r   rR   rt   rS   )rc   ZconnZaddrr   r;   )r   protocol_factoryr   r   r   r!   r"   r     s6    							"z2BaseProactorEventLoop._start_serving.<locals>.loop)r   r   )r   r   r   Zsslr   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)rt   valuesr/   clear)r   Zfuturer!   r!   r"   r{     s    z*BaseProactorEventLoop._stop_accept_futuresc             C   s(   |  j    |  j j |  | j   d  S)N)r{   rN   _stop_servingr0   )r   r   r!   r!   r"   r     s    
z#BaseProactorEventLoop._stop_serving)r$   rB   rC   r   rv   rw   rx   ry   r0   r~   r   r   r   r   r|   ru   r   r   r   r   r{   r   r!   r!   )r    r"   r   `  s.   




%)rD   __all__r?    r   r   r   r   logr   Z_FlowControlMixinZBaseTransportr	   ZReadTransportrE   ZWriteTransportrV   rg   Z	Transportrl   rn   ZBaseEventLoopr   r!   r!   r!   r"   <module>   s*   	eMW
