B
    18™\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__© úZ/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/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ÚpendingÚ	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   r0   Q   s    z_OverlappedFuture.set_exceptionc                s   t ƒ  |¡ d | _d S )N)r   Ú
set_resultr   )r   Úresult)r   r   r   r1   U   s    z_OverlappedFuture.set_result)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    r/   r)   r0   r1   Ú__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WaitForSingleObjectr9   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#xÚsignaledZwaitingzwait_handle=)r   r    Úappendr9   r?   r:   )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;   r:   Ú_overlappedZUnregisterWaitr*   ÚwinerrorÚERROR_IO_PENDINGr   r+   r,   rC   )r   r=   r-   r.   r   r   r   Ú_unregister_wait   s"    
z&_BaseWaitHandleFuture._unregister_waitc                s   |   ¡  tƒ  ¡ S )N)rG   r   r)   )r   )r   r   r   r)   —   s    z_BaseWaitHandleFuture.cancelc                s   |   ¡  tƒ  |¡ d S )N)rG   r   r0   )r   r&   )r   r   r   r0   ›   s    z#_BaseWaitHandleFuture.set_exceptionc                s   |   ¡  tƒ  |¡ d S )N)rG   r   r1   )r   r2   )r   r   r   r1   Ÿ   s    z _BaseWaitHandleFuture.set_result)r3   r4   r5   r6   r   r?   r    rC   rG   r)   r0   r1   r7   r   r   )r   r   r8   Z   s   
r8   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   r1   rI   )r   r2   )r   r   r   r1   ±   s    
z_WaitCancelFuture.set_resultc                s$   t ƒ  |¡ | jd k	r |  | ¡ d S )N)r   r0   rI   )r   r&   )r   r   r   r0   ¶   s    
z_WaitCancelFuture.set_exception)	r3   r4   r5   r6   r   r)   r1   r0   r7   r   r   )r   r   rH   ¤   s
   rH   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_proactorrD   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)	rN   r>   ÚCloseHandlerO   rM   Ú_unregisterr   r   rC   )r   rB   )r   r   r   rC   Ä   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;   r:   rD   ZUnregisterWaitExrN   r*   rE   rF   r   r+   r,   rM   Ú_wait_cancelrC   rO   )r   r=   r-   r.   r   r   r   rG   Ö   s$    

z"_WaitHandleFuture._unregister_wait)r3   r4   r5   r   rC   rG   r7   r   r   )r   r   rL   ¼   s   rL   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)rY   r[   )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CreateNamedPiperU   ZPIPE_TYPE_MESSAGEZPIPE_READMODE_MESSAGEZ	PIPE_WAITZPIPE_UNLIMITED_INSTANCESr	   ZBUFSIZEZNMPWAIT_WAIT_FOREVERÚNULLÚ
PipeHandlerX   Úadd)r   ÚfirstÚflagsÚhÚpiper   r   r   r[     s    


zPipeServer._server_pipe_handlec             C   s
   | j d kS )N)rU   )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)rZ   r)   rU   rX   ÚcloserY   Úclear)r   re   r   r   r   rf     s    


zPipeServer.closeN)
r3   r4   r5   r6   r   r]   r[   r^   rf   Ú__del__r   r   r   r   rT   ð   s   
rT   c               @   s   e Zd ZdZdS )Ú_WindowsSelectorEventLoopz'Windows version of selector event loop.N)r3   r4   r5   r6   r   r   r   r   ri   +  s   ri   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   rP   )r   r   r   r   2  s    zProactorEventLoop.__init__c             Ã   s8   | j  |¡}|I d H }|ƒ }| j||d|id}||fS )NÚaddr)Úextra)rM   Úconnect_pipeÚ_make_duplex_pipe_transport)r   Úprotocol_factoryr"   Úfre   Ú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 )	Nrj   )rk   r   zPipe accept failed)r%   r&   re   zAccept pipe failed on pipe %rT)Úexc_info)r2   rX   Údiscardr^   rf   rm   r]   rM   Úaccept_piper*   Úfilenor,   Ú_debugr
   Úwarningr   ÚCancelledErrorrZ   Úadd_done_callback)ro   re   rp   r-   )r"   Úloop_accept_pipern   r   Úserverr   r   r{   B  s<    

z>ProactorEventLoop.start_serving_pipe.<locals>.loop_accept_pipe)N)rT   Ú	call_soon)r   rn   r"   r   )r"   r{   rn   r   r|   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)Úwaiterrk   )Úcreate_futureÚ_WindowsSubprocessTransportÚ	Exceptionrf   Ú_wait)r   rp   ÚargsÚshellÚstdinÚstdoutÚstderrÚbufsizerk   Úkwargsr   Útranspr   r   r   Ú_make_subprocess_transportm  s    

z,ProactorEventLoop._make_subprocess_transport)N)N)	r3   r4   r5   r6   r   rr   r~   rŒ   r7   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+   Ú_resultsrD   ÚCreateIoCompletionPortÚINVALID_HANDLE_VALUEr_   Ú_iocpÚ_cacherV   rW   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‘   rK   )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‘   rA   r   r3   Ú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   Útimeoutr\   r   r   r   Úselectš  s
    
zIocpProactor.selectc             C   s   | j  ¡ }| |¡ |S )N)r+   r€   r1   )r   ÚvaluerB   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*   rE   rD   ÚERROR_NETNAME_DELETEDÚERROR_OPERATION_ABORTEDÚConnectionResetErrorr„   )rq   Úkeyr   r-   r   r   r   Úfinish_recv±  s    
z&IocpProactor.recv.<locals>.finish_recv)Ú_register_with_iocprD   Ú
Overlappedr_   Ú
isinstanceÚsocketZWSARecvrv   ZReadFileÚBrokenPipeErrorrž   Ú	_register)r   ÚconnÚnbytesrc   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*   rE   rD   r¡   r¢   r£   r„   )rq   r¤   r   r-   r   r   r   r¥   È  s    
z+IocpProactor.recv_into.<locals>.finish_recv)r¦   rD   r§   r_   r¨   r©   ZWSARecvIntorv   ZReadFileIntorª   rž   r«   )r   r¬   Úbufrc   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*   rE   rD   r¡   r¢   r£   r„   )rq   r¤   r   r-   r   r   r   Úfinish_sendÜ  s    
z&IocpProactor.send.<locals>.finish_send)
r¦   rD   r§   r_   r¨   r©   ZWSASendrv   Z	WriteFiler«   )r   r¬   r¯   rc   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    ÚstructÚpackrv   Ú
setsockoptr©   Ú
SOL_SOCKETrD   ZSO_UPDATE_ACCEPT_CONTEXTÚ
settimeoutÚ
gettimeoutÚgetpeername)rq   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   ry   rf   )r'   r¬   r   r   r   Úaccept_coro÷  s
    z(IocpProactor.accept.<locals>.accept_coro)r   )r¦   Ú_get_accept_socketÚfamilyrD   r§   r_   ZAcceptExrv   r«   r   Ú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¶   rD   ZSO_UPDATE_CONNECT_CONTEXT)rq   r¤   r   )r¬   r   r   Úfinish_connect  s    
z,IocpProactor.connect.<locals>.finish_connect)r¦   rD   Z	BindLocalrv   r¾   r*   rE   ÚerrnoZ	WSAEINVALÚ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*   rE   rD   r¡   r¢   r£   r„   )rq   r¤   r   r-   r   r   r   Úfinish_sendfile%  s    
z.IocpProactor.sendfile.<locals>.finish_sendfile)	r¦   rD   r§   r_   ZTransmitFilerv   ÚmsvcrtZget_osfhandler«   )	r   Ú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    )rq   r¤   r   )re   r   r   Úfinish_accept_pipe;  s    z4IocpProactor.accept_pipe.<locals>.finish_accept_pipe)r¦   rD   r§   r_   ZConnectNamedPiperv   rž   r«   )r   re   r   Z	connectedrÏ   r   )re   r   ru   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_DELAYrD   ZConnectPiper*   rE   ZERROR_PIPE_BUSYÚminÚCONNECT_PIPE_MAX_DELAYr   Úsleepr+   r	   r`   )r   r"   Údelayr<   r-   r   r   r   rl   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Ö   rI   )r   rJ   Zdone_callbackrB   r   r   r   rS   \  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?   )rq   r¤   r   )ro   r   r   Úfinish_wait_for_handley  s    z=IocpProactor._wait_for_handle.<locals>.finish_wait_for_handler   )r•   r>   ÚINFINITEÚmathÚceilrD   r§   r_   ZRegisterWaitWithQueuer‘   r"   rH   r+   rL   r   r’   )r   r<   r›   Z
_is_cancelÚmsr   r=   rØ   r   )ro   r   rÖ   c  s     


	zIocpProactor._wait_for_handlec             C   s0   || j kr,| j  |¡ t | ¡ | jdd¡ d S )Nr   )r;   ra   rD   r   rv   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*   r0   r1   r’   r"   )r   r   rÝ   Úcallbackro   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“   rA   )r   r   r   r   r   rR   ¯  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Û   rD   ZGetQueuedCompletionStatusr‘   r’   ÚpopÚKeyErrorr+   Ú	get_debugr,   r   r>   rQ   r”   r)   Údoner*   r0   rŽ   rA   r1   r“   r"   rg   )r   r›   rÜ   rà   ÚerrZtransferredr¤   r"   ro   r   rÝ   rÞ   r   rÅ   r   r   r   r?   ¾  sJ    






zIocpProactor._pollc             C   s   | j  |¡ d S )N)r”   ra   )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’   ÚitemsÚ	cancelledr¨   rH   r)   r*   r+   r   r,   ÚtimeÚ	monotonicr
   Údebugr?   rŽ   r>   rQ   )r   r"   rB   r   rÝ   rÞ   r-   r.   Z
msg_updateÚ
start_timeZnext_msgr   r   r   rf   û  s:    
 


"
zIocpProactor.closec             C   s   |   ¡  d S )N)rf   )r   r   r   r   rh   *  s    zIocpProactor.__del__)r   )N)r   )r   )r   )N)N)r3   r4   r5   r6   r   r•   r™   rš   rœ   rž   r®   r°   r²   rÁ   rÆ   rÎ   ru   rl   r×   rS   rÖ   r¦   r«   rR   r½   r?   rç   rf   rh   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)Ú_procÚpollÚ_process_exited)ro   Ú
returncode)r   r   r   rÞ   5  s    
z4_WindowsSubprocessTransport._start.<locals>.callback)	r	   ÚPopenrï   r+   rM   r×   Úintr9   rz   )
r   r„   r…   r†   r‡   rˆ   r‰   rŠ   rÞ   ro   r   )r   r   Ú_start0  s    z"_WindowsSubprocessTransport._startN)r3   r4   r5   rõ   r   r   r   r   r   .  s   r   c               @   s   e Zd ZeZdS )r   N)r3   r4   r5   r   Ú_loop_factoryr   r   r   r   r   @  s   r   c               @   s   e Zd ZeZdS )r   N)r3   r4   r5   r   rö   r   r   r   r   r   D  s   r   ).r6   rD   r>   rÃ   rÚ   rÉ   r©   r³   rë   rV   Ú r   r   r   r   r   r   r	   Úlogr
   Ú__all__r_   rÙ   ZERROR_CONNECTION_REFUSEDZERROR_CONNECTION_ABORTEDrÑ   rÓ   ÚFuturer   r8   rH   rL   ÚobjectrT   ÚBaseSelectorEventLoopri   ÚBaseProactorEventLoopr   r   ÚBaseSubprocessTransportr   r   ÚBaseDefaultEventLoopPolicyr   r   r   r   r   r   r   Ú<module>   sP   0J4;P   2