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

  \·l  ã               @   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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dlmZ ddddgZdZdZdZdZdZdZG dd„ de
jƒZG dd„ de
jƒZG dd„ deƒZG dd„ deƒZG dd „ d e ƒZ!G d!d"„ d"ej"ƒZ#G d#d„ dej$ƒZ%G d$d„ dƒZ&G d%d&„ d&e	j'ƒZ(e#Z)G d'd(„ d(ej*ƒZ+e+Z,dS ))z.Selector and proactor event loops for Windows.é    Né   )Úevents)Úbase_subprocess)Úfutures)Úproactor_events)Úselector_events)Útasks)Úwindows_utils)Ú_overlapped)Ú	coroutine)ÚloggerÚSelectorEventLoopÚProactorEventLoopÚIocpProactorÚDefaultEventLoopPolicyl   ÿÿ iÉ  iÔ  gü©ñÒMbP?gš™™™™™¹?c                   s^   e Zd ZdZddœ‡ fdd„
Z‡ fdd„Zdd	„ Z‡ fd
d„Z‡ fdd„Z‡ fdd„Z	‡  Z
S )Ú_OverlappedFuturez†Subclass of Future which represents an overlapped operation.

    Cancelling it will immediately cancel the overlapped operation.
    N)Úloopc               s&   t ƒ j|d� | jr| jd= || _d S )N)r   r   éÿÿÿÿ)ÚsuperÚ__init__Ú_source_tracebackÚ_ov)ÚselfÚovr   )Ú	__class__© ú./usr/lib64/python3.6/asyncio/windows_events.pyr   -   s    z_OverlappedFuture.__init__c                s@   t ƒ jƒ }| jd k	r<| jjr dnd}|jdd|| jjf ƒ |S )NÚpendingZ	completedr   zoverlapped=<%s, %#x>)r   Ú
_repr_infor   r   ÚinsertÚaddress)r   ÚinfoÚstate)r   r   r   r   3   s
    

z_OverlappedFuture._repr_infoc             C   sr   | j d krd S y| j jƒ  W nJ tk
rf } z.d|| dœ}| jrJ| j|d< | jj|ƒ W Y d d }~X nX d | _ d S )Nz&Cancelling an overlapped future failed)ÚmessageÚ	exceptionÚfutureÚsource_traceback)r   ÚcancelÚOSErrorr   Ú_loopÚcall_exception_handler)r   ÚexcÚcontextr   r   r   Ú_cancel_overlapped:   s    

z$_OverlappedFuture._cancel_overlappedc                s   | j ƒ  tƒ jƒ S )N)r-   r   r'   )r   )r   r   r   r'   J   s    z_OverlappedFuture.cancelc                s   t ƒ j|ƒ | jƒ  d S )N)r   Úset_exceptionr-   )r   r$   )r   r   r   r.   N   s    z_OverlappedFuture.set_exceptionc                s   t ƒ j|ƒ d | _d S )N)r   Ú
set_resultr   )r   Úresult)r   r   r   r/   R   s    z_OverlappedFuture.set_result)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r-   r'   r.   r/   Ú__classcell__r   r   )r   r   r   '   s   r   c                   sn   e Zd ZdZddœ‡ fdd„
Zdd„ Z‡ fdd	„Zd
d„ Zdd„ Z‡ fdd„Z	‡ fdd„Z
‡ fdd„Z‡  ZS )Ú_BaseWaitHandleFuturez2Subclass of Future which represents a wait handle.N)r   c               s8   t ƒ j|d� | jr| jd= || _|| _|| _d| _d S )N)r   r   Tr   )r   r   r   r   Ú_handleÚ_wait_handleÚ_registered)r   r   ÚhandleÚwait_handler   )r   r   r   r   Z   s    z_BaseWaitHandleFuture.__init__c             C   s   t j| jdƒt jkS )Nr   )Ú_winapiZWaitForSingleObjectr7   ZWAIT_OBJECT_0)r   r   r   r   Ú_pollh   s    z_BaseWaitHandleFuture._pollc                s\   t ƒ jƒ }|jd| j ƒ | jd k	r>| jƒ r0dnd}|j|ƒ | jd k	rX|jd| j ƒ |S )Nz
handle=%#xZsignaledZwaitingzwait_handle=%#x)r   r   Úappendr7   r=   r8   )r   r!   r"   )r   r   r   r   m   s    



z _BaseWaitHandleFuture._repr_infoc             C   s
   d | _ d S )N)r   )r   Úfutr   r   r   Ú_unregister_wait_cbw   s    z)_BaseWaitHandleFuture._unregister_wait_cbc             C   s”   | j s
d S d| _ | j}d | _ytj|ƒ W nZ tk
r„ } z>|jtjkrtd|| dœ}| jrd| j|d< | jj	|ƒ d S W Y d d }~X nX | j
d ƒ d S )NFz$Failed to unregister the wait handle)r#   r$   r%   r&   )r9   r8   r
   ZUnregisterWaitr(   ÚwinerrorÚERROR_IO_PENDINGr   r)   r*   r@   )r   r;   r+   r,   r   r   r   Ú_unregister_wait|   s"    
z&_BaseWaitHandleFuture._unregister_waitc                s   | j ƒ  tƒ jƒ S )N)rC   r   r'   )r   )r   r   r   r'   ”   s    z_BaseWaitHandleFuture.cancelc                s   | j ƒ  tƒ j|ƒ d S )N)rC   r   r.   )r   r$   )r   r   r   r.   ˜   s    z#_BaseWaitHandleFuture.set_exceptionc                s   | j ƒ  tƒ j|ƒ d S )N)rC   r   r/   )r   r0   )r   r   r   r/   œ   s    z _BaseWaitHandleFuture.set_result)r1   r2   r3   r4   r   r=   r   r@   rC   r'   r.   r/   r5   r   r   )r   r   r6   W   s   
r6   c                   sF   e Zd ZdZddœ‡ fdd„
Zdd„ Z‡ fdd	„Z‡ fd
d„Z‡  ZS )Ú_WaitCancelFuturezoSubclass of Future which represents a wait for the cancellation of a
    _WaitHandleFuture using an event.
    N)r   c               s   t ƒ j||||d� d | _d S )N)r   )r   r   Ú_done_callback)r   r   Úeventr;   r   )r   r   r   r   ¦   s    z_WaitCancelFuture.__init__c             C   s   t dƒ‚d S )Nz'_WaitCancelFuture must not be cancelled)ÚRuntimeError)r   r   r   r   r'   «   s    z_WaitCancelFuture.cancelc                s$   t ƒ j|ƒ | jd k	r | j| ƒ d S )N)r   r/   rE   )r   r0   )r   r   r   r/   ®   s    
z_WaitCancelFuture.set_resultc                s$   t ƒ j|ƒ | jd k	r | j| ƒ d S )N)r   r.   rE   )r   r$   )r   r   r   r.   ³   s    
z_WaitCancelFuture.set_exception)	r1   r2   r3   r4   r   r'   r/   r.   r5   r   r   )r   r   rD   ¡   s
   rD   c                   s6   e Zd Zddœ‡ fdd„
Z‡ fdd„Zdd„ Z‡  ZS )	Ú_WaitHandleFutureN)r   c               s<   t ƒ j||||d� || _d| _tjd ddd ƒ| _d | _d S )N)r   TF)r   r   Ú	_proactorZ_unregister_proactorr
   ZCreateEventÚ_eventÚ
_event_fut)r   r   r:   r;   Úproactorr   )r   r   r   r   º   s
    z_WaitHandleFuture.__init__c                sF   | j d k	r"tj| j ƒ d | _ d | _| jj| jƒ d | _tƒ j|ƒ d S )N)	rJ   r<   ÚCloseHandlerK   rI   Ú_unregisterr   r   r@   )r   r?   )r   r   r   r@   Á   s    
	z%_WaitHandleFuture._unregister_wait_cbc             C   s¢   | j s
d S d| _ | j}d | _ytj|| jƒ W nZ tk
rˆ } z>|jtjkrxd|| dœ}| jrh| j|d< | j	j
|ƒ d S W Y d d }~X nX | jj| j| jƒ| _d S )NFz$Failed to unregister the wait handle)r#   r$   r%   r&   )r9   r8   r
   ZUnregisterWaitExrJ   r(   rA   rB   r   r)   r*   rI   Ú_wait_cancelr@   rK   )r   r;   r+   r,   r   r   r   rC   Ó   s$    

z"_WaitHandleFuture._unregister_wait)r1   r2   r3   r   r@   rC   r5   r   r   )r   r   rH   ¹   s   rH   c               @   s<   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZeZ	dS )Ú
PipeServerzXClass representing a pipe server.

    This is much like a bound, listening socket.
    c             C   s,   || _ tjƒ | _d | _d | _| jdƒ| _d S )NT)Ú_addressÚweakrefÚWeakSetÚ_free_instancesÚ_pipeÚ_accept_pipe_futureÚ_server_pipe_handle)r   r    r   r   r   r   ò   s
    
zPipeServer.__init__c             C   s   | j | jdƒ }| _ |S )NF)rU   rW   )r   Útmpr   r   r   Ú_get_unconnected_pipeü   s    z PipeServer._get_unconnected_pipec          	   C   sr   | j ƒ rd S tjtjB }|r&|tjO }tj| j|tjtjB tj	B tj
tjtjtjtjƒ}tj|ƒ}| jj|ƒ |S )N)Úclosedr<   ZPIPE_ACCESS_DUPLEXZFILE_FLAG_OVERLAPPEDZFILE_FLAG_FIRST_PIPE_INSTANCEZCreateNamedPiperQ   ZPIPE_TYPE_MESSAGEZPIPE_READMODE_MESSAGEZ	PIPE_WAITZPIPE_UNLIMITED_INSTANCESr	   ZBUFSIZEZNMPWAIT_WAIT_FOREVERÚNULLÚ
PipeHandlerT   Úadd)r   ÚfirstÚflagsÚhÚpiper   r   r   rW     s    


zPipeServer._server_pipe_handlec             C   s
   | j d kS )N)rQ   )r   r   r   r   rZ     s    zPipeServer.closedc             C   sV   | j d k	r| j jƒ  d | _ | jd k	rRx| jD ]}|jƒ  q,W d | _d | _| jjƒ  d S )N)rV   r'   rQ   rT   ÚcloserU   Úclear)r   ra   r   r   r   rb     s    


zPipeServer.closeN)
r1   r2   r3   r4   r   rY   rW   rZ   rb   Ú__del__r   r   r   r   rP   í   s   
rP   c               @   s   e Zd ZdZdd„ ZdS )Ú_WindowsSelectorEventLoopz'Windows version of selector event loop.c             C   s   t jƒ S )N)r	   Ú
socketpair)r   r   r   r   Ú_socketpair+  s    z%_WindowsSelectorEventLoop._socketpairN)r1   r2   r3   r4   rg   r   r   r   r   re   (  s   re   c                   sP   e Zd ZdZd‡ fdd„	Zdd„ Zedd„ ƒZed	d
„ ƒZeddd„ƒZ	‡  Z
S )r   z2Windows version of proactor event loop using IOCP.Nc                s   |d krt ƒ }tƒ j|ƒ d S )N)r   r   r   )r   rL   )r   r   r   r   2  s    zProactorEventLoop.__init__c             C   s   t jƒ S )N)r	   rf   )r   r   r   r   rg   7  s    zProactorEventLoop._socketpairc             c   s8   | j j|ƒ}|E d H }|ƒ }| j||d|id�}||fS )NÚaddr)Úextra)rI   Úconnect_pipeÚ_make_duplex_pipe_transport)r   Úprotocol_factoryr    Úfra   ÚprotocolÚtransr   r   r   Úcreate_pipe_connection:  s    
z(ProactorEventLoop.create_pipe_connectionc                s.   t ˆ ƒ‰d‡ ‡‡‡‡fdd„	‰ˆjˆƒ ˆgS )Nc                s  d }yj| rL| j ƒ }ˆjj|ƒ ˆjƒ r2|jƒ  d S ˆƒ }ˆj||dˆ id� ˆjƒ }|d kr`d S ˆjj|ƒ} W n„ t	k
rÒ } zH|r¬|j
ƒ d	kr¬ˆjd||dœƒ |jƒ  nˆjrÂtjd|dd� W Y d d }~X n2 tjk
rò   |rî|jƒ  Y nX | ˆ_| jˆƒ d S )
Nrh   )ri   r   zPipe accept failed)r#   r$   ra   zAccept pipe failed on pipe %rT)Úexc_infor   )r0   rT   ÚdiscardrZ   rb   rk   rY   rI   Úaccept_piper(   Úfilenor*   Z_debugr   Zwarningr   ÚCancelledErrorrV   Úadd_done_callback)rm   ra   rn   r+   )r    Úloop_accept_piperl   r   Úserverr   r   rw   G  s<    

z>ProactorEventLoop.start_serving_pipe.<locals>.loop_accept_pipe)N)rP   Z	call_soon)r   rl   r    r   )r    rw   rl   r   rx   r   Ústart_serving_pipeC  s    (
z$ProactorEventLoop.start_serving_pipec	             k   sŒ   | j ƒ }
t| |||||||f|
|dœ|	—Ž}y|
E d H  W n& tk
r` } z
|}W Y d d }~X nX d }|d k	rˆ|jƒ  |jƒ E d H  |‚|S )N)Úwaiterri   )Úcreate_futureÚ_WindowsSubprocessTransportÚ	Exceptionrb   Z_wait)r   rn   ÚargsÚshellÚstdinÚstdoutÚstderrÚbufsizeri   Úkwargsrz   Ztranspr+   Úerrr   r   r   Ú_make_subprocess_transportr  s    

z,ProactorEventLoop._make_subprocess_transport)N)N)r1   r2   r3   r4   r   rg   r   rp   ry   r†   r5   r   r   )r   r   r   /  s   	/c               @   sÐ   e Zd ZdZd1dd„Zdd„ Zdd„ Zd2d
d„Zdd„ Zd3dd„Z	d4dd„Z
dd„ Zdd„ Zdd„ Zedd„ ƒZd5dd„Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd6d)d*„Zd+d,„ Zd-d.„ Zd/d0„ Zd	S )7r   z#Proactor implementation using IOCP.ì   ÿÿ c             C   sD   d | _ g | _tjtjtd|ƒ| _i | _tj	ƒ | _
g | _tj	ƒ | _d S )Nr   )r)   Ú_resultsr
   ÚCreateIoCompletionPortÚINVALID_HANDLE_VALUEr[   Ú_iocpÚ_cacherR   rS   r9   Ú_unregisteredÚ_stopped_serving)r   Zconcurrencyr   r   r   r   �  s    
zIocpProactor.__init__c             C   s   d| j jt| jƒt| jƒf S )Nz<%s overlapped#=%s result#=%s>)r   r1   ÚlenrŒ   rˆ   )r   r   r   r   Ú__repr__™  s    zIocpProactor.__repr__c             C   s
   || _ d S )N)r)   )r   r   r   r   r   Úset_loopž  s    zIocpProactor.set_loopNc             C   s    | j s| j|ƒ | j }g | _ |S )N)rˆ   r=   )r   ÚtimeoutrX   r   r   r   Úselect¡  s
    
zIocpProactor.selectc             C   s   | j jƒ }|j|ƒ |S )N)r)   r{   r/   )r   Úvaluer?   r   r   r   Ú_result¨  s    

zIocpProactor._resultr   c             C   sz   | j |ƒ tjtƒ}y4t|tjƒr6|j|jƒ ||ƒ n|j|jƒ |ƒ W n t	k
rb   | j
dƒS X dd„ }| j|||ƒS )Nó    c             S   sJ   y|j ƒ S  tk
rD } z |jtjkr2t|jŽ ‚n‚ W Y d d }~X nX d S )N)Ú	getresultr(   rA   r
   ÚERROR_NETNAME_DELETEDÚConnectionResetErrorr~   )ro   Úkeyr   r+   r   r   r   Úfinish_recv¸  s    z&IocpProactor.recv.<locals>.finish_recv)Ú_register_with_iocpr
   Ú
Overlappedr[   Ú
isinstanceÚsocketZWSARecvrt   ZReadFileÚBrokenPipeErrorr•   Ú	_register)r   ÚconnÚnbytesr_   r   r›   r   r   r   Úrecv­  s    

	zIocpProactor.recvc             C   sZ   | j |ƒ tjtƒ}t|tjƒr4|j|jƒ ||ƒ n|j|jƒ |ƒ dd„ }| j	|||ƒS )Nc             S   sJ   y|j ƒ S  tk
rD } z |jtjkr2t|jŽ ‚n‚ W Y d d }~X nX d S )N)r—   r(   rA   r
   r˜   r™   r~   )ro   rš   r   r+   r   r   r   Úfinish_sendË  s    z&IocpProactor.send.<locals>.finish_send)
rœ   r
   r�   r[   rž   rŸ   ZWSASendrt   Z	WriteFiler¡   )r   r¢   Úbufr_   r   r¥   r   r   r   ÚsendÃ  s    

	zIocpProactor.sendc                sz   | j ˆƒ | jˆjƒ‰ tjtƒ}|jˆjƒ ˆ jƒ ƒ ‡ ‡fdd„}tdd„ ƒ}| j	|ˆ|ƒ}||ˆ ƒ}t
j|| jd� |S )Nc                sD   |j ƒ  tjdˆjƒ ƒ}ˆ jtjtj|ƒ ˆ j	ˆj
ƒ ƒ ˆ ˆ jƒ fS )Nz@P)r—   ÚstructZpackrt   Ú
setsockoptrŸ   Ú
SOL_SOCKETr
   ZSO_UPDATE_ACCEPT_CONTEXTÚ
settimeoutZ
gettimeoutZgetpeername)ro   rš   r   r¦   )r¢   Úlistenerr   r   Úfinish_acceptÜ  s    
z*IocpProactor.accept.<locals>.finish_acceptc             s   s4   y| E d H  W n  t jk
r.   |jƒ  ‚ Y nX d S )N)r   ru   rb   )r%   r¢   r   r   r   Úaccept_coroå  s
    z(IocpProactor.accept.<locals>.accept_coro)r   )rœ   Ú_get_accept_socketÚfamilyr
   r�   r[   ZAcceptExrt   r   r¡   r   Zensure_futurer)   )r   r¬   r   r­   r®   r%   Úcoror   )r¢   r¬   r   ÚacceptÖ  s    

		
zIocpProactor.acceptc                s˜   | j ˆ ƒ ytjˆ jƒ ˆ jƒ W nB tk
rb } z&|jtjkr@‚ ˆ j	ƒ d dkrR‚ W Y d d }~X nX tj
tƒ}|jˆ jƒ |ƒ ‡ fdd„}| j|ˆ |ƒS )Nr   r   c                s   |j ƒ  ˆ jtjtjdƒ ˆ S )Nr   )r—   r©   rŸ   rª   r
   ZSO_UPDATE_CONNECT_CONTEXT)ro   rš   r   )r¢   r   r   Úfinish_connect  s    
z,IocpProactor.connect.<locals>.finish_connect)rœ   r
   Z	BindLocalrt   r°   r(   rA   ÚerrnoZ	WSAEINVALZgetsocknamer�   r[   Z	ConnectExr¡   )r   r¢   r    Úer   r³   r   )r¢   r   Úconnectó  s    

zIocpProactor.connectc                sJ   | j ˆ ƒ tjtƒ}|jˆ jƒ ƒ}|r0| jˆ ƒS ‡ fdd„}| j|ˆ |ƒS )Nc                s   |j ƒ  ˆ S )N)r—   )ro   rš   r   )ra   r   r   Úfinish_accept_pipe  s    z4IocpProactor.accept_pipe.<locals>.finish_accept_pipe)rœ   r
   r�   r[   ZConnectNamedPipert   r•   r¡   )r   ra   r   Z	connectedr·   r   )ra   r   rs   
  s    


zIocpProactor.accept_pipec             c   sz   t }xjytj|ƒ}P W n0 tk
rF } z|jtjkr6‚ W Y d d }~X nX t|d tƒ}tj	|| j
d�E d H  qW tj|ƒS )Né   )r   )ÚCONNECT_PIPE_INIT_DELAYr
   ZConnectPiper(   rA   ZERROR_PIPE_BUSYÚminÚCONNECT_PIPE_MAX_DELAYr   Zsleepr)   r	   r\   )r   r    Zdelayr:   r+   r   r   r   rj     s    
zIocpProactor.connect_pipec             C   s   | j ||dƒS )z°Wait for a handle.

        Return a Future object. The result of the future is True if the wait
        completed, or False if the wait did not complete (on timeout).
        F)Ú_wait_for_handle)r   r:   r’   r   r   r   Úwait_for_handle/  s    zIocpProactor.wait_for_handlec             C   s   | j |d dƒ}||_|S )NT)r¼   rE   )r   rF   Zdone_callbackr?   r   r   r   rO   7  s    zIocpProactor._wait_cancelc                sš   |d krt j}ntj|d ƒ}tjtƒ}tj|| j|j	|ƒ}|rTt
|||| jd�‰ nt|||| | jd�‰ ˆ jrvˆ jd= ‡ fdd„}ˆ |d|f| j|j	< ˆ S )Ng     @�@)r   r   c                s   ˆ j ƒ S )N)r=   )ro   rš   r   )rm   r   r   Úfinish_wait_for_handleR  s    z=IocpProactor._wait_for_handle.<locals>.finish_wait_for_handler   r   )r<   ÚINFINITEÚmathÚceilr
   r�   r[   ZRegisterWaitWithQueuer‹   r    rD   r)   rH   r   rŒ   )r   r:   r’   Z
_is_cancelÚmsr   r;   r¾   r   )rm   r   r¼   >  s    


	zIocpProactor._wait_for_handlec             C   s0   || j kr,| j j|ƒ tj|jƒ | jddƒ d S )Nr   )r9   r]   r
   r‰   rt   r‹   )r   Úobjr   r   r   rœ   ^  s    
z IocpProactor._register_with_iocpc             C   s‚   t || jd�}|jr|jd= |jsjy|d d |ƒ}W n, tk
r^ } z|j|ƒ W Y d d }~X nX |j|ƒ ||||f| j|j< |S )N)r   r   r   )	r   r)   r   r   r(   r.   r/   rŒ   r    )r   r   rÃ   Úcallbackrm   r”   rµ   r   r   r   r¡   h  s    

zIocpProactor._registerc             C   s   | j j|ƒ dS )a  Unregister an overlapped object.

        Call this method when its future has been cancelled. The event can
        already be signalled (pending in the proactor event queue). It is also
        safe if the event is never signalled (because it was cancelled).
        N)r�   r>   )r   r   r   r   r   rN   †  s    zIocpProactor._unregisterc             C   s   t j |ƒ}|jdƒ |S )Nr   )rŸ   r«   )r   r°   Úsr   r   r   r¯   �  s    

zIocpProactor._get_accept_socketc             C   sŒ  |d krt }n0|dk r tdƒ‚ntj|d ƒ}|t kr>tdƒ‚�xtj| j|ƒ}|d krZP d}|\}}}}y| jj|ƒ\}}	}
}W nV t	k
rØ   | j
jƒ rº| j
jdd||||f dœƒ |dtjfkrÒtj|ƒ wBY nX |
| jkrî|jƒ  qB|jƒ sBy||||	ƒ}W n: tk
�r@ } z|j|ƒ | jj|ƒ W Y d d }~X qBX |j|ƒ | jj|ƒ qBW x | jD ]}	| jj|	jd ƒ �qdW | jjƒ  d S )Nr   znegative timeoutg     @�@ztimeout too bigz8GetQueuedCompletionStatus() returned an unexpected eventz)err=%s transferred=%s key=%#x address=%#x)r#   Ústatus)r¿   Ú
ValueErrorrÀ   rÁ   r
   ZGetQueuedCompletionStatusr‹   rŒ   ÚpopÚKeyErrorr)   Z	get_debugr*   rŠ   r<   rM   rŽ   r'   Údoner(   r.   rˆ   r>   r/   r�   r    rc   )r   r’   rÂ   rÆ   r…   Ztransferredrš   r    rm   r   rÃ   rÄ   r”   rµ   r   r   r   r=   ”  sJ    






zIocpProactor._pollc             C   s   | j j|ƒ d S )N)rŽ   r]   )r   rÃ   r   r   r   Ú_stop_servingË  s    zIocpProactor._stop_servingc             C   sâ   xšt | jjƒ ƒD ]ˆ\}\}}}}|jƒ r*qt|tƒr6qy|jƒ  W q tk
r– } z8| jd k	r†d||dœ}|j	rz|j	|d< | jj
|ƒ W Y d d }~X qX qW x| jrº| jdƒsžtjdƒ qžW g | _| jd k	rÞtj| jƒ d | _d S )NzCancelling a future failed)r#   r$   r%   r&   r   z"taking long time to close proactor)ÚlistrŒ   ÚitemsZ	cancelledrž   rD   r'   r(   r)   r   r*   r=   r   Údebugrˆ   r‹   r<   rM   )r   r    r?   r   rÃ   rÄ   r+   r,   r   r   r   rb   Ñ  s,     


"

zIocpProactor.closec             C   s   | j ƒ  d S )N)rb   )r   r   r   r   rd   ñ  s    zIocpProactor.__del__)r‡   )N)r   )r   )N)N)r1   r2   r3   r4   r   r�   r‘   r“   r•   r¤   r§   r²   r¶   rs   r   rj   r½   rO   r¼   rœ   r¡   rN   r¯   r=   rË   rb   rd   r   r   r   r   r   Œ  s.   





 
	
7 c               @   s   e Zd Zdd„ ZdS )r|   c       
         sP   t j|f|||||dœ|—Žˆ _‡ fdd„}ˆ jjjtˆ jjƒƒ}	|	j|ƒ d S )N)r   r€   r�   r‚   rƒ   c                s   ˆ j jƒ }ˆ j|ƒ d S )N)Ú_procZpollZ_process_exited)rm   Ú
returncode)r   r   r   rÄ   ü  s    
z4_WindowsSubprocessTransport._start.<locals>.callback)	r	   ÚPopenrÏ   r)   rI   r½   Úintr7   rv   )
r   r~   r   r€   r�   r‚   rƒ   r„   rÄ   rm   r   )r   r   Ú_start÷  s    z"_WindowsSubprocessTransport._startN)r1   r2   r3   rÓ   r   r   r   r   r|   õ  s   r|   c               @   s   e Zd ZeZdS )Ú_WindowsDefaultEventLoopPolicyN)r1   r2   r3   r   Z_loop_factoryr   r   r   r   rÔ     s   rÔ   )-r4   r<   r´   rÀ   rŸ   r¨   rR   Ú r   r   r   r   r   r   r	   r
   Z
coroutinesr   Úlogr   Ú__all__r[   r¿   ZERROR_CONNECTION_REFUSEDZERROR_CONNECTION_ABORTEDr¹   r»   ZFuturer   r6   rD   rH   ÚobjectrP   ZBaseSelectorEventLoopre   ZBaseProactorEventLoopr   r   ZBaseSubprocessTransportr|   r   ZBaseDefaultEventLoopPolicyrÔ   r   r   r   r   r   Ú<module>   sL   0J4;]  k