B
    Å S]v  ã               @   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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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+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)Úlogger)ÚSelectorEventLoopÚProactorEventLoopÚIocpProactorÚDefaultEventLoopPolicyÚWindowsSelectorEventLoopPolicyÚWindowsProactorEventLoopPolicyl   ÿÿ 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   éÿÿÿÿ)ÚsuperÚ__init__Ú_source_tracebackÚ_ov)ÚselfÚovr   )Ú	__class__© ú'lib/python3.7/asyncio/windows_events.pyr   0   s    z_OverlappedFuture.__init__c                sH   t ƒ  ¡ }| jd k	rD| jjr dnd}| dd|› d| jjd›d¡ |S )NÚpendingZ	completedr   zoverlapped=<z, z#xú>)r   Ú
_repr_infor   r   ÚinsertÚaddress)r   ÚinfoÚstate)r   r   r   r   6   s
    

 z_OverlappedFuture._repr_infoc          
   C   sr   | j d krd S y| j  ¡  W nJ tk
rf } z,d|| dœ}| jrJ| j|d< | j |¡ W d d }~X Y 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   |   ¡  tƒ  ¡ S )N)r.   r   r(   )r   )r   r   r   r(   M   s    z_OverlappedFuture.cancelc                s   t ƒ  |¡ |  ¡  d S )N)r   Úset_exceptionr.   )r   r%   )r   r   r   r/   Q   s    z_OverlappedFuture.set_exceptionc                s   t ƒ  |¡ d | _d S )N)r   Ú
set_resultr   )r   Úresult)r   r   r   r0   U   s    z_OverlappedFuture.set_result)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r.   r(   r/   r0   Ú__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   T)r   r   r   r   Ú_handleÚ_wait_handleÚ_registered)r   r   ÚhandleÚwait_handler   )r   r   r   r   ]   s    z_BaseWaitHandleFuture.__init__c             C   s   t  | jd¡t jkS )Nr   )Ú_winapiZWaitForSingleObjectr8   ZWAIT_OBJECT_0)r   r   r   r   Ú_pollk   s    z_BaseWaitHandleFuture._pollc                sd   t ƒ  ¡ }| d| jd›¡ | jd k	rB|  ¡ r4dnd}| |¡ | jd k	r`| d| jd›¡ |S )Nzhandle=z#xZsignaledZwaitingzwait_handle=)r   r   Úappendr8   r>   r9   )r   r"   r#   )r   r   r   r   p   s    



z _BaseWaitHandleFuture._repr_infoc             C   s
   d | _ d S )N)r   )r   Úfutr   r   r   Ú_unregister_wait_cbz   s    z)_BaseWaitHandleFuture._unregister_wait_cbc          
   C   s”   | j s
d S d| _ | j}d | _yt |¡ W nZ tk
r„ } z<|jtjkrtd|| dœ}| jrd| j|d< | j 	|¡ d S W d d }~X Y nX |  
d ¡ d S )NFz$Failed to unregister the wait handle)r$   r%   r&   r'   )r:   r9   Ú_overlappedZUnregisterWaitr)   ÚwinerrorÚERROR_IO_PENDINGr   r*   r+   rA   )r   r<   r,   r-   r   r   r   Ú_unregister_wait   s"    
z&_BaseWaitHandleFuture._unregister_waitc                s   |   ¡  tƒ  ¡ S )N)rE   r   r(   )r   )r   r   r   r(   —   s    z_BaseWaitHandleFuture.cancelc                s   |   ¡  tƒ  |¡ d S )N)rE   r   r/   )r   r%   )r   r   r   r/   ›   s    z#_BaseWaitHandleFuture.set_exceptionc                s   |   ¡  tƒ  |¡ d S )N)rE   r   r0   )r   r1   )r   r   r   r0   Ÿ   s    z _BaseWaitHandleFuture.set_result)r2   r3   r4   r5   r   r>   r   rA   rE   r(   r/   r0   r6   r   r   )r   r   r7   Z   s   
r7   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d k	r |  | ¡ d S )N)r   r0   rG   )r   r1   )r   r   r   r0   ±   s    
z_WaitCancelFuture.set_resultc                s$   t ƒ  |¡ | jd k	r |  | ¡ d S )N)r   r/   rG   )r   r%   )r   r   r   r/   ¶   s    
z_WaitCancelFuture.set_exception)	r2   r3   r4   r5   r   r(   r0   r/   r6   r   r   )r   r   rF   ¤   s
   rF   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 d ddd ¡| _d | _d S )N)r   TF)r   r   Ú	_proactorZ_unregister_proactorrB   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 ¡ d | _ d | _| j | j¡ d | _tƒ  |¡ d S )N)	rL   r=   ÚCloseHandlerM   rK   Ú_unregisterr   r   rA   )r   r@   )r   r   r   rA   Ä   s    
	z%_WaitHandleFuture._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rxd|| dœ}| jrh| j|d< | j	 
|¡ d S W d d }~X Y nX | j | j| j¡| _d S )NFz$Failed to unregister the wait handle)r$   r%   r&   r'   )r:   r9   rB   ZUnregisterWaitExrL   r)   rC   rD   r   r*   r+   rK   Ú_wait_cancelrA   rM   )r   r<   r,   r-   r   r   r   rE   Ö   s$    

z"_WaitHandleFuture._unregister_wait)r2   r3   r4   r   rA   rE   r6   r   r   )r   r   rJ   ¼   s   rJ   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 ¡ | _d | _d | _|  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 |  d¡ }| _ |S )NF)rW   rY   )r   Útmpr   r   r   Ú_get_unconnected_pipeÿ   s    z PipeServer._get_unconnected_pipec          
   C   sr   |   ¡ rd S tjtjB }|r&|tjO }t | j|tjtjB tj	B tj
tjtjtjtj¡}t |¡}| j |¡ |S )N)Úclosedr=   ZPIPE_ACCESS_DUPLEXZFILE_FLAG_OVERLAPPEDZFILE_FLAG_FIRST_PIPE_INSTANCEZCreateNamedPiperS   ZPIPE_TYPE_MESSAGEZPIPE_READMODE_MESSAGEZ	PIPE_WAITZPIPE_UNLIMITED_INSTANCESr	   ZBUFSIZEZNMPWAIT_WAIT_FOREVERÚNULLÚ
PipeHandlerV   Úadd)r   ÚfirstÚflagsÚhÚpiper   r   r   rY     s    


zPipeServer._server_pipe_handlec             C   s
   | j d kS )N)rS   )r   r   r   r   r\     s    zPipeServer.closedc             C   sV   | j d k	r| j  ¡  d | _ | jd k	rRx| jD ]}| ¡  q,W d | _d | _| j ¡  d S )N)rX   r(   rS   rV   ÚcloserW   Úclear)r   rc   r   r   r   rd     s    


zPipeServer.closeN)
r2   r3   r4   r5   r   r[   rY   r\   rd   Ú__del__r   r   r   r   rR   ð   s   
rR   c               @   s   e Zd ZdZdS )Ú_WindowsSelectorEventLoopz'Windows version of selector event loop.N)r2   r3   r4   r5   r   r   r   r   rg   +  s   rg   c                   s<   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zdd	d
„Z‡  ZS )r   z2Windows version of proactor event loop using IOCP.Nc                s   |d krt ƒ }tƒ  |¡ d S )N)r   r   r   )r   rN   )r   r   r   r   2  s    zProactorEventLoop.__init__c             Ã   s8   | j  |¡}|I d H }|ƒ }| j||d|id}||fS )NÚaddr)Úextra)rK   Úconnect_pipeÚ_make_duplex_pipe_transport)r   Úprotocol_factoryr!   Úfrc   ÚprotocolÚtransr   r   r   Úcreate_pipe_connection7  s    
z(ProactorEventLoop.create_pipe_connectionc             ƒ   s.   t ˆ ƒ‰d‡ ‡‡‡‡fdd„	‰ˆ ˆ¡ ˆgS )Nc          
      s  d }yj| rL|   ¡ }ˆj |¡ ˆ ¡ r2| ¡  d S ˆƒ }ˆj||dˆ id ˆ ¡ }|d kr`d S ˆj |¡} W n„ t	k
rÒ } zF|r¬| 
¡ dkr¬ˆ d||dœ¡ | ¡  nˆjrÂtjd|dd W d d }~X Y n2 tjk
rò   |rî| ¡  Y nX | ˆ_|  ˆ¡ d S )	Nrh   )ri   r   zPipe accept failed)r$   r%   rc   zAccept pipe failed on pipe %rT)Úexc_info)r1   rV   Údiscardr\   rd   rk   r[   rK   Úaccept_piper)   Úfilenor+   Z_debugr
   Zwarningr   ÚCancelledErrorrX   Úadd_done_callback)rm   rc   rn   r,   )r!   Úloop_accept_piperl   r   Úserverr   r   rw   B  s<    

z>ProactorEventLoop.start_serving_pipe.<locals>.loop_accept_pipe)N)rR   Z	call_soon)r   rl   r!   r   )r!   rw   rl   r   rx   r   Ústart_serving_pipe?  s    (
z$ProactorEventLoop.start_serving_pipec	          	   Ë   sl   |   ¡ }
t| |||||||f|
|dœ|	—Ž}y|
I d H  W n, tk
rf   | ¡  | ¡ I d H  ‚ Y nX |S )N)Úwaiterri   )Úcreate_futureÚ_WindowsSubprocessTransportÚ	Exceptionrd   Z_wait)r   rn   ÚargsÚshellÚstdinÚstdoutÚstderrÚbufsizeri   Úkwargsrz   Ztranspr   r   r   Ú_make_subprocess_transportm  s    

z,ProactorEventLoop._make_subprocess_transport)N)N)	r2   r3   r4   r5   r   rp   ry   r…   r6   r   r   )r   r   r   /  s
   0r   c               @   sæ   e Zd ZdZd7dd„Zdd„ Zdd„ Zd	d
„ Zd8dd„Zdd„ Z	d9dd„Z
d:dd„Zd;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d+d,„ Zd-d.„ Zd=d/d0„Zd1d2„ Zd3d4„ Zd5d6„ ZdS )>r   z#Proactor implementation using IOCP.ì   ÿÿ c             C   sD   d | _ g | _t tjtd|¡| _i | _t 	¡ | _
g | _t 	¡ | _d S )Nr   )r*   Ú_resultsrB   ÚCreateIoCompletionPortÚINVALID_HANDLE_VALUEr]   Ú_iocpÚ_cacherT   rU   r:   Ú_unregisteredÚ_stopped_serving)r   Zconcurrencyr   r   r   r   ‚  s    
zIocpProactor.__init__c             C   s   | j d krtdƒ‚d S )NzIocpProactor is closed)rŠ   rI   )r   r   r   r   Ú_check_closedŒ  s    
zIocpProactor._check_closedc             C   sF   dt | jƒ dt | jƒ g}| jd kr0| d¡ d| jjd |¡f S )Nzoverlapped#=%sz
result#=%sr\   z<%s %s>ú )Úlenr‹   r‡   rŠ   r?   r   r2   Újoin)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 }g | _ |S )N)r‡   r>   )r   ÚtimeoutrZ   r   r   r   Úselectš  s
    
zIocpProactor.selectc             C   s   | j  ¡ }| |¡ |S )N)r*   r{   r0   )r   Úvaluer@   r   r   r   Ú_result¡  s    

zIocpProactor._resultr   c             C   sz   |   |¡ t t¡}y4t|tjƒr6| | ¡ ||¡ n| | ¡ |¡ W n t	k
rb   |  
d¡S X dd„ }|  |||¡S )Nó    c          
   S   sP   y|  ¡ S  tk
rJ } z$|jtjtjfkr8t|jŽ ‚n‚ W d d }~X Y nX d S )N)Ú	getresultr)   rC   rB   ÚERROR_NETNAME_DELETEDÚERROR_OPERATION_ABORTEDÚConnectionResetErrorr~   )ro   Úkeyr   r,   r   r   r   Úfinish_recv±  s    
z&IocpProactor.recv.<locals>.finish_recv)Ú_register_with_iocprB   Ú
Overlappedr]   Ú
isinstanceÚsocketZWSARecvrt   ZReadFileÚBrokenPipeErrorr—   Ú	_register)r   ÚconnÚnbytesra   r   rž   r   r   r   Úrecv¦  s    


zIocpProactor.recvc             C   sz   |   |¡ t t¡}y4t|tjƒr6| | ¡ ||¡ n| | ¡ |¡ W n t	k
rb   |  
d¡S X dd„ }|  |||¡S )Nr˜   c          
   S   sP   y|  ¡ S  tk
rJ } z$|jtjtjfkr8t|jŽ ‚n‚ W d d }~X Y nX d S )N)r™   r)   rC   rB   rš   r›   rœ   r~   )ro   r   r   r,   r   r   r   rž   È  s    
z+IocpProactor.recv_into.<locals>.finish_recv)rŸ   rB   r    r]   r¡   r¢   ZWSARecvIntort   ZReadFileIntor£   r—   r¤   )r   r¥   Úbufra   r   rž   r   r   r   Ú	recv_into½  s    


zIocpProactor.recv_intoc             C   sZ   |   |¡ t t¡}t|tjƒr4| | ¡ ||¡ n| | ¡ |¡ dd„ }|  	|||¡S )Nc          
   S   sP   y|  ¡ S  tk
rJ } z$|jtjtjfkr8t|jŽ ‚n‚ W d d }~X Y nX d S )N)r™   r)   rC   rB   rš   r›   rœ   r~   )ro   r   r   r,   r   r   r   Úfinish_sendÜ  s    
z&IocpProactor.send.<locals>.finish_send)
rŸ   rB   r    r]   r¡   r¢   ZWSASendrt   Z	WriteFiler¤   )r   r¥   r¨   ra   r   rª   r   r   r   ÚsendÔ  s    


zIocpProactor.sendc                sv   |   ˆ¡ |  ˆj¡‰ t t¡}| ˆ ¡ ˆ  ¡ ¡ ‡ ‡fdd„}dd„ }|  |ˆ|¡}||ˆ ƒ}t	j
|| jd |S )Nc                sD   |  ¡  t dˆ ¡ ¡}ˆ  tjtj|¡ ˆ  	ˆ 
¡ ¡ ˆ ˆ  ¡ fS )Nz@P)r™   ÚstructZpackrt   Ú
setsockoptr¢   Ú
SOL_SOCKETrB   ZSO_UPDATE_ACCEPT_CONTEXTÚ
settimeoutZ
gettimeoutZgetpeername)ro   r   r   r¨   )r¥   Úlistenerr   r   Úfinish_acceptî  s    
z*IocpProactor.accept.<locals>.finish_acceptc             Ó   s4   y| I d H  W n  t jk
r.   | ¡  ‚ Y nX d S )N)r   ru   rd   )r&   r¥   r   r   r   Úaccept_coro÷  s
    z(IocpProactor.accept.<locals>.accept_coro)r   )rŸ   Ú_get_accept_socketÚfamilyrB   r    r]   ZAcceptExrt   r¤   r   Zensure_futurer*   )r   r°   r   r±   r²   r&   Úcoror   )r¥   r°   r   Úacceptè  s    

	
zIocpProactor.acceptc          
      s˜   |   ˆ ¡ yt ˆ  ¡ ˆ j¡ W nB tk
rb } z$|jtjkr@‚ ˆ  	¡ d dkrR‚ W d d }~X Y nX t 
t¡}| ˆ  ¡ |¡ ‡ fdd„}|  |ˆ |¡S )Nr   r   c                s   |  ¡  ˆ  tjtjd¡ ˆ S )Nr   )r™   r­   r¢   r®   rB   ZSO_UPDATE_CONNECT_CONTEXT)ro   r   r   )r¥   r   r   Úfinish_connect  s    
z,IocpProactor.connect.<locals>.finish_connect)rŸ   rB   Z	BindLocalrt   r´   r)   rC   ÚerrnoZ	WSAEINVALZgetsocknamer    r]   Z	ConnectExr¤   )r   r¥   r!   Úer   r·   r   )r¥   r   Úconnect  s    

zIocpProactor.connectc       	   	   C   sb   |   |¡ t t¡}|d@ }|d? d@ }| | ¡ t | ¡ ¡|||dd¡ dd„ }|  |||¡S )Nl   ÿÿ é    r   c          
   S   sP   y|  ¡ S  tk
rJ } z$|jtjtjfkr8t|jŽ ‚n‚ W d d }~X Y nX d S )N)r™   r)   rC   rB   rš   r›   rœ   r~   )ro   r   r   r,   r   r   r   Úfinish_sendfile%  s    
z.IocpProactor.sendfile.<locals>.finish_sendfile)	rŸ   rB   r    r]   ZTransmitFilert   ÚmsvcrtZget_osfhandler¤   )	r   ZsockÚfileÚoffsetÚcountr   Z
offset_lowZoffset_highr¼   r   r   r   Úsendfile  s    



	zIocpProactor.sendfilec                sJ   |   ˆ ¡ t t¡}| ˆ  ¡ ¡}|r0|  ˆ ¡S ‡ fdd„}|  |ˆ |¡S )Nc                s   |  ¡  ˆ S )N)r™   )ro   r   r   )rc   r   r   Úfinish_accept_pipe;  s    z4IocpProactor.accept_pipe.<locals>.finish_accept_pipe)rŸ   rB   r    r]   ZConnectNamedPipert   r—   r¤   )r   rc   r   Z	connectedrÂ   r   )rc   r   rs   0  s    


zIocpProactor.accept_pipec          
   Ã   sz   t }xjyt |¡}P W n0 tk
rF } z|jtjkr6‚ W d d }~X Y nX t|d tƒ}tj	|| j
dI d H  qW t |¡S )Né   )r   )ÚCONNECT_PIPE_INIT_DELAYrB   ZConnectPiper)   rC   ZERROR_PIPE_BUSYÚminÚCONNECT_PIPE_MAX_DELAYr   Zsleepr*   r	   r^   )r   r!   Zdelayr;   r,   r   r   r   rj   A  s    
zIocpProactor.connect_pipec             C   s   |   ||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_handleT  s    zIocpProactor.wait_for_handlec             C   s   |   |d d¡}||_|S )NT)rÇ   rG   )r   rH   Zdone_callbackr@   r   r   r   rQ   \  s    zIocpProactor._wait_cancelc                s¢   |   ¡  |d krtj}nt |d ¡}t t¡}t || j	|j
|¡}|r\t|||| jd‰ nt|||| | jd‰ ˆ jr~ˆ jd= ‡ fdd„}ˆ |d|f| j|j
< ˆ S )Ng     @@)r   r   c                s   ˆ   ¡ S )N)r>   )ro   r   r   )rm   r   r   Úfinish_wait_for_handley  s    z=IocpProactor._wait_for_handle.<locals>.finish_wait_for_handler   )rŽ   r=   ÚINFINITEÚmathÚceilrB   r    r]   ZRegisterWaitWithQueuerŠ   r!   rF   r*   rJ   r   r‹   )r   r;   r”   Z
_is_cancelÚmsr   r<   rÉ   r   )rm   r   rÇ   c  s     


	zIocpProactor._wait_for_handlec             C   s0   || j kr,| j  |¡ t | ¡ | jdd¡ d S )Nr   )r:   r_   rB   rˆ   rt   rŠ   )r   Úobjr   r   r   rŸ   …  s    
z IocpProactor._register_with_iocpc          
   C   sŠ   |   ¡  t|| jd}|jr$|jd= |jsry|d d |ƒ}W n, tk
rf } z| |¡ W d d }~X Y nX | |¡ ||||f| j|j	< |S )N)r   r   )
rŽ   r   r*   r   r   r)   r/   r0   r‹   r!   )r   r   rÎ   Úcallbackrm   r–   r¹   r   r   r   r¤     s    

zIocpProactor._registerc             C   s   |   ¡  | 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   r   rP   ¯  s    zIocpProactor._unregisterc             C   s   t   |¡}| 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 |d ¡}|t kr>tdƒ‚xt | j|¡}|d krZP d}|\}}}}y| j |¡\}}	}
}W nV t	k
rØ   | j
 ¡ rº| j
 dd||||f dœ¡ |dtjfkrÒt |¡ wBY nX |
| jkrî| ¡  qB| ¡ sBy||||	ƒ}W n: tk
r@ } z| |¡ | j |¡ W d d }~X Y qBX | |¡ | j |¡ qBW x | jD ]}	| j |	jd ¡ qdW | 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Ì   rB   ZGetQueuedCompletionStatusrŠ   r‹   ÚpopÚKeyErrorr*   Z	get_debugr+   r‰   r=   rO   r   r(   Zdoner)   r/   r‡   r?   r0   rŒ   r!   re   )r   r”   rÍ   rÑ   ÚerrZtransferredr   r!   rm   r   rÎ   rÏ   r–   r¹   r   r   r   r>   ¾  sJ    






zIocpProactor._pollc             C   s   | j  |¡ d S )N)r   r_   )r   rÎ   r   r   r   Ú_stop_servingõ  s    zIocpProactor._stop_servingc             C   s   | j d krd S xšt| j ¡ ƒD ]ˆ\}\}}}}| ¡ r8qt|tƒrDqy| ¡  W q tk
r¤ } z6| j	d k	r”d||dœ}|j
rˆ|j
|d< | j	 |¡ W d d }~X Y qX qW d}t ¡ }	|	| }
xD| jr|
t ¡ kröt d| t ¡ |	 ¡ t ¡ | }
|  |¡ qÀW g | _t | j ¡ d | _ d S )NzCancelling a future failed)r$   r%   r&   r'   g      ð?z,%r is running after closing for %.1f seconds)rŠ   Úlistr‹   ÚitemsZ	cancelledr¡   rF   r(   r)   r*   r   r+   ÚtimeZ	monotonicr
   Údebugr>   r‡   r=   rO   )r   r!   r@   r   rÎ   rÏ   r,   r-   Z
msg_updateZ
start_timeZnext_msgr   r   r   rd   û  s:    
 


"
zIocpProactor.closec             C   s   |   ¡  d S )N)rd   )r   r   r   r   rf   *  s    zIocpProactor.__del__)r†   )N)r   )r   )r   )N)N)r2   r3   r4   r5   r   rŽ   r’   r“   r•   r—   r§   r©   r«   r¶   rº   rÁ   rs   rj   rÈ   rQ   rÇ   rŸ   r¤   rP   r³   r>   rÖ   rd   rf   r   r   r   r   r     s4   






"
 

7/r   c               @   s   e Zd Zdd„ ZdS )r|   c       
         sP   t j|f|||||dœ|—Žˆ _‡ fdd„}ˆ jj tˆ jjƒ¡}	|	 |¡ d S )N)r   r€   r   r‚   rƒ   c                s   ˆ j  ¡ }ˆ  |¡ d S )N)Ú_procZpollZ_process_exited)rm   Ú
returncode)r   r   r   rÏ   5  s    
z4_WindowsSubprocessTransport._start.<locals>.callback)	r	   ÚPopenrÛ   r*   rK   rÈ   Úintr8   rv   )
r   r~   r   r€   r   r‚   rƒ   r„   rÏ   rm   r   )r   r   Ú_start0  s    z"_WindowsSubprocessTransport._startN)r2   r3   r4   rß   r   r   r   r   r|   .  s   r|   c               @   s   e Zd ZeZdS )r   N)r2   r3   r4   r   Ú_loop_factoryr   r   r   r   r   @  s   r   c               @   s   e Zd ZeZdS )r   N)r2   r3   r4   r   rà   r   r   r   r   r   D  s   r   ).r5   rB   r=   r¸   rË   r½   r¢   r¬   rÙ   rT   Ú r   r   r   r   r   r   r	   Úlogr
   Ú__all__r]   rÊ   ZERROR_CONNECTION_REFUSEDZERROR_CONNECTION_ABORTEDrÄ   rÆ   ZFuturer   r7   rF   rJ   ÚobjectrR   ZBaseSelectorEventLooprg   ZBaseProactorEventLoopr   r   ZBaseSubprocessTransportr|   r   ZBaseDefaultEventLoopPolicyr   r   r   r   r   r   r   Ú<module>   sP   0J4;P   2