U
    ¼Ê¦ii€  ã                   @   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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)Ú
exceptions)Úproactor_events)Úselector_events)Útasks)Úwindows_utils)Úlogger)ÚSelectorEventLoopÚProactorEventLoopÚIocpProactorÚDefaultEventLoopPolicyÚWindowsSelectorEventLoopPolicyÚWindowsProactorEventLoopPolicyì   ÿÿ 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 ©Nr   éÿÿÿÿ)ÚsuperÚ__init__Ú_source_tracebackÚ_ov)ÚselfÚovr   ©Ú	__class__© ú,/usr/lib/python3.8/asyncio/windows_events.pyr   1   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, ú#xú>)r   Ú
_repr_infor   r"   ÚinsertÚaddress©r   ÚinfoÚstater   r    r!   r%   7   s
    

 z_OverlappedFuture._repr_infoc              
   C   sr   | j d krd S z| j  ¡  W nJ tk
rf } z,d|| dœ}| jrJ| j|d< | j |¡ W 5 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)r6   r   r0   ©r   r   r    r!   r0   N   s    z_OverlappedFuture.cancelc                    s   t ƒ  |¡ |  ¡  d S r7   )r   Úset_exceptionr6   ©r   r-   r   r    r!   r9   R   s    z_OverlappedFuture.set_exceptionc                    s   t ƒ  |¡ d | _d S r7   )r   Ú
set_resultr   ©r   Úresultr   r    r!   r;   V   s    z_OverlappedFuture.set_result)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r%   r6   r0   r9   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.Nr   c                   s8   t ƒ j|d� | jr| jd= || _|| _|| _d| _d S )Nr   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WaitForSingleObjectrD   ZWAIT_OBJECT_0r8   r    r    r!   Ú_polll   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=r#   ZsignaledZwaitingzwait_handle=)r   r%   ÚappendrD   rK   rE   r(   r   r    r!   r%   q   s    



z _BaseWaitHandleFuture._repr_infoc                 C   s
   d | _ d S r7   )r   ©r   Úfutr    r    r!   Ú_unregister_wait_cb{   s    z)_BaseWaitHandleFuture._unregister_wait_cbc              
   C   sš   | j s
d S d| _ | j}d | _zt |¡ W n` tk
rŠ } zB|jtjkrzd|| dœ}| jrd| j|d< | j 	|¡ W Y ¢d S W 5 d }~X Y nX |  
d ¡ d S ©NFz$Failed to unregister the wait handler+   r/   )rF   rE   Ú_overlappedZUnregisterWaitr1   ÚwinerrorÚERROR_IO_PENDINGr   r2   r3   rO   ©r   rH   r4   r5   r    r    r!   Ú_unregister_wait€   s$    ý
z&_BaseWaitHandleFuture._unregister_waitc                    s   |   ¡  tƒ  ¡ S r7   )rU   r   r0   r8   r   r    r!   r0   ˜   s    z_BaseWaitHandleFuture.cancelc                    s   |   ¡  tƒ  |¡ d S r7   )rU   r   r9   r:   r   r    r!   r9   œ   s    z#_BaseWaitHandleFuture.set_exceptionc                    s   |   ¡  tƒ  |¡ d S r7   )rU   r   r;   r<   r   r    r!   r;       s    z _BaseWaitHandleFuture.set_result)r>   r?   r@   rA   r   rK   r%   rO   rU   r0   r9   r;   rB   r    r    r   r!   rC   [   s   
rC   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.
    Nr   c                   s   t ƒ j||||d� d | _d S )Nr   )r   r   Ú_done_callback)r   r   ÚeventrH   r   r   r    r!   r   ª   s    z_WaitCancelFuture.__init__c                 C   s   t dƒ‚d S )Nz'_WaitCancelFuture must not be cancelled)ÚRuntimeErrorr8   r    r    r!   r0   ¯   s    z_WaitCancelFuture.cancelc                    s$   t ƒ  |¡ | jd k	r |  | ¡ d S r7   )r   r;   rW   r<   r   r    r!   r;   ²   s    
z_WaitCancelFuture.set_resultc                    s$   t ƒ  |¡ | jd k	r |  | ¡ d S r7   )r   r9   rW   r:   r   r    r!   r9   ·   s    
z_WaitCancelFuture.set_exception)	r>   r?   r@   rA   r   r0   r;   r9   rB   r    r    r   r!   rV   ¥   s
   rV   c                       s6   e Zd Zddœ‡ fdd„
Z‡ fdd„Zdd„ Z‡  ZS )	Ú_WaitHandleFutureNr   c                   s<   t ƒ j||||d� || _d| _t d ddd ¡| _d | _d S )Nr   TF)r   r   Ú	_proactorZ_unregister_proactorrQ   ZCreateEventÚ_eventÚ
_event_fut)r   r   rG   rH   Ú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 r7   )	r\   rJ   ÚCloseHandler]   r[   Ú_unregisterr   r   rO   rM   r   r    r!   rO   Å   s    
	z%_WaitHandleFuture._unregister_wait_cbc              
   C   s¨   | j s
d S d| _ | j}d | _zt || j¡ W n` tk
rŽ } zB|jtjkr~d|| dœ}| jrh| j|d< | j	 
|¡ W Y ¢d S W 5 d }~X Y nX | j | j| j¡| _d S rP   )rF   rE   rQ   ZUnregisterWaitExr\   r1   rR   rS   r   r2   r3   r[   Ú_wait_cancelrO   r]   rT   r    r    r!   rU   ×   s(    ý

ÿz"_WaitHandleFuture._unregister_wait)r>   r?   r@   r   rO   rU   rB   r    r    r   r!   rZ   ½   s   rZ   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)rh   rj   )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 r7   )ÚclosedrJ   ZPIPE_ACCESS_DUPLEXZFILE_FLAG_OVERLAPPEDZFILE_FLAG_FIRST_PIPE_INSTANCEZCreateNamedPiperd   ZPIPE_TYPE_MESSAGEZPIPE_READMODE_MESSAGEZ	PIPE_WAITZPIPE_UNLIMITED_INSTANCESr
   ZBUFSIZEZNMPWAIT_WAIT_FOREVERÚNULLÚ
PipeHandlerg   Úadd)r   ÚfirstÚflagsÚhÚpiper    r    r!   rj     s(    
 
ÿ  ú
zPipeServer._server_pipe_handlec                 C   s
   | j d kS r7   )rd   r8   r    r    r!   rm     s    zPipeServer.closedc                 C   sR   | j d k	r| j  ¡  d | _ | jd k	rN| jD ]}| ¡  q*d | _d | _| j ¡  d S r7   )ri   r0   rd   rg   Úcloserh   Úclear)r   rt   r    r    r!   ru     s    




zPipeServer.closeN)
r>   r?   r@   rA   r   rl   rj   rm   ru   Ú__del__r    r    r    r!   rb   ñ   s   
rb   c                   @   s   e Zd ZdZdS )Ú_WindowsSelectorEventLoopz'Windows version of selector event loop.N)r>   r?   r@   rA   r    r    r    r!   rx   ,  s   rx   c                       sH   e Zd ZdZd‡ fdd„	Z‡ 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 r7   )r   r   r   )r   r^   r   r    r!   r   3  s    zProactorEventLoop.__init__c              	      sf   z(| j d kst‚|  | j¡ tƒ  	¡  W 5 | j d k	r`| j j}| j  ¡  |d k	rZ| j |¡ d | _ X d S r7   )
Z_self_reading_futurer   r0   r[   r`   ÚAssertionErrorÚ	call_soonZ_loop_self_readingr   Úrun_forever©r   r   r   r    r!   r{   8  s    

zProactorEventLoop.run_foreverc                 Ã   s8   | j  |¡}|I d H }|ƒ }| j||d|id�}||fS )NÚaddr©Úextra)r[   Úconnect_pipeÚ_make_duplex_pipe_transport)r   Úprotocol_factoryr'   Úfrt   ÚprotocolÚtransr    r    r!   Úcreate_pipe_connectionK  s    
ÿz(ProactorEventLoop.create_pipe_connectionc                 ƒ   s.   t ˆ ƒ‰d‡ ‡‡‡‡fdd„	‰ˆ ˆ¡ ˆgS )Nc              
      s  d }zn| rN|   ¡ }ˆj |¡ ˆ ¡ r4| ¡  W d S ˆƒ }ˆj||dˆ id� ˆ ¡ }|d krdW d S ˆj |¡} W n„ t	k
rÖ } zF|r°| 
¡ dkr°ˆ d||dœ¡ | ¡  nˆjrÆtjd|dd� W 5 d }~X Y n2 tjk
rö   |rò| ¡  Y nX | ˆ_|  ˆ¡ d S )	Nr}   r~   r   zPipe accept failed)r,   r-   rt   zAccept pipe failed on pipe %rT)Úexc_info)r=   rg   Údiscardrm   ru   r�   rl   r[   Úaccept_piper1   Úfilenor3   Z_debugr   Zwarningr   ÚCancelledErrorri   Úadd_done_callback)rƒ   rt   r„   r4   ©r'   Úloop_accept_piper‚   r   Zserverr    r!   rŽ   V  sH      ÿý
 ÿz>ProactorEventLoop.start_serving_pipe.<locals>.loop_accept_pipe)N)rb   rz   )r   r‚   r'   r    r�   r!   Ústart_serving_pipeS  s    (
z$ProactorEventLoop.start_serving_pipec	              	   Ë   s„   |   ¡ }
t| |||||||f|
|dœ|	—Ž}z|
I d H  W nD ttfk
rT   ‚ Y n, tk
r~   | ¡  | ¡ I d H  ‚ Y nX |S )N)Úwaiterr   )Úcreate_futureÚ_WindowsSubprocessTransportÚ
SystemExitÚKeyboardInterruptÚBaseExceptionru   Z_wait)r   r„   ÚargsÚshellÚstdinÚstdoutÚstderrÚbufsizer   Úkwargsr�   Ztranspr    r    r!   Ú_make_subprocess_transport�  s*    
   ÿ þýz,ProactorEventLoop._make_subprocess_transport)N)N)
r>   r?   r@   rA   r   r{   r†   r�   r�   rB   r    r    r   r!   r   0  s   0 þr   c                   @   sú   e Zd ZdZd;dd„Zdd„ Zdd„ Zd	d
„ Zd<dd„Zdd„ Z	d=dd„Z
d>dd„Zd?dd„Zd@dd„ZdAdd„Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ ZdBd%d&„Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ ZdCd3d4„Zd5d6„ Zd7d8„ Zd9d:„ ZdS )Dr   z#Proactor implementation using IOCP.r   c                 C   sD   d | _ g | _t tjtd|¡| _i | _t 	¡ | _
g | _t 	¡ | _d S rI   )r2   Ú_resultsrQ   ÚCreateIoCompletionPortÚINVALID_HANDLE_VALUErn   Ú_iocpÚ_cachere   rf   rF   Ú_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¡   rY   r8   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#=%srm   z<%s %s>ú )Úlenr¢   rž   r¡   rL   r   r>   Újoin)r   r)   r    r    r!   Ú__repr__¦  s    ÿ

zIocpProactor.__repr__c                 C   s
   || _ d S r7   )r2   )r   r   r    r    r!   Úset_loop­  s    zIocpProactor.set_loopNc                 C   s    | j s|  |¡ | j }g | _ |S r7   )rž   rK   )r   Útimeoutrk   r    r    r!   Úselect°  s
    
zIocpProactor.selectc                 C   s   | j  ¡ }| |¡ |S r7   )r2   r‘   r;   )r   ÚvaluerN   r    r    r!   Ú_result·  s    

zIocpProactor._resultr   c                 C   s~   |   |¡ t t¡}z4t|tjƒr6| | ¡ ||¡ n| | ¡ |¡ W n t	k
rf   |  
d¡ Y S X dd„ }|  |||¡S )Nó    c              
   S   sR   z
|  ¡ W S  tk
rL } z$|jtjtjfkr:t|jŽ ‚n‚ W 5 d }~X Y nX d S r7   ©Ú	getresultr1   rR   rQ   ZERROR_NETNAME_DELETEDZERROR_OPERATION_ABORTEDÚConnectionResetErrorr–   ©r…   Úkeyr   r4   r    r    r!   Úfinish_recvÇ  s    
ÿz&IocpProactor.recv.<locals>.finish_recv)Ú_register_with_iocprQ   Ú
Overlappedrn   Ú
isinstanceÚsocketZWSARecvrŠ   ZReadFileÚBrokenPipeErrorr®   Ú	_register©r   ÚconnÚnbytesrr   r   rµ   r    r    r!   Úrecv¼  s    


zIocpProactor.recvc                 C   s~   |   |¡ t t¡}z4t|tjƒr6| | ¡ ||¡ n| | ¡ |¡ W n t	k
rf   |  
d¡ Y S X dd„ }|  |||¡S )Nr   c              
   S   sR   z
|  ¡ W S  tk
rL } z$|jtjtjfkr:t|jŽ ‚n‚ W 5 d }~X Y nX d S r7   r°   r³   r    r    r!   rµ   Þ  s    
ÿz+IocpProactor.recv_into.<locals>.finish_recv)r¶   rQ   r·   rn   r¸   r¹   ZWSARecvIntorŠ   ZReadFileIntorº   r®   r»   )r   r½   Úbufrr   r   rµ   r    r    r!   Ú	recv_intoÓ  s    


zIocpProactor.recv_intoc                 C   s`   |   |¡ t t¡}z| | ¡ ||¡ W n tk
rH   |  d¡ Y S X dd„ }|  |||¡S )N)r¯   Nc              
   S   sR   z
|  ¡ W S  tk
rL } z$|jtjtjfkr:t|jŽ ‚n‚ W 5 d }~X Y nX d S r7   r°   r³   r    r    r!   rµ   ò  s    
ÿz*IocpProactor.recvfrom.<locals>.finish_recv)	r¶   rQ   r·   rn   ZWSARecvFromrŠ   rº   r®   r»   r¼   r    r    r!   Úrecvfromê  s    


zIocpProactor.recvfromc                 C   s>   |   |¡ t t¡}| | ¡ |||¡ dd„ }|  |||¡S )Nc              
   S   sR   z
|  ¡ W S  tk
rL } z$|jtjtjfkr:t|jŽ ‚n‚ W 5 d }~X Y nX d S r7   r°   r³   r    r    r!   Úfinish_send  s    
ÿz(IocpProactor.sendto.<locals>.finish_send)r¶   rQ   r·   rn   Z	WSASendTorŠ   r»   )r   r½   rÀ   rr   r}   r   rÃ   r    r    r!   Úsendtoþ  s
    


zIocpProactor.sendtoc                 C   sZ   |   |¡ t t¡}t|tjƒr4| | ¡ ||¡ n| | ¡ |¡ dd„ }|  	|||¡S )Nc              
   S   sR   z
|  ¡ W S  tk
rL } z$|jtjtjfkr:t|jŽ ‚n‚ W 5 d }~X Y nX d S r7   r°   r³   r    r    r!   rÃ     s    
ÿz&IocpProactor.send.<locals>.finish_send)
r¶   rQ   r·   rn   r¸   r¹   ZWSASendrŠ   Z	WriteFiler»   )r   r½   rÀ   rr   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packrŠ   Ú
setsockoptr¹   Ú
SOL_SOCKETrQ   ZSO_UPDATE_ACCEPT_CONTEXTÚ
settimeoutZ
gettimeoutZgetpeername)r…   r´   r   rÀ   ©r½   Úlistenerr    r!   Úfinish_accept*  s     ÿz*IocpProactor.accept.<locals>.finish_acceptc                 Ó   s4   z| I d H  W n  t jk
r.   | ¡  ‚ Y nX d S r7   )r   r‹   ru   )r.   r½   r    r    r!   Úaccept_coro3  s
    z(IocpProactor.accept.<locals>.accept_coror   )r¶   Ú_get_accept_socketÚfamilyrQ   r·   rn   ZAcceptExrŠ   r»   r	   Zensure_futurer2   )r   rË   r   rÌ   rÍ   r.   Úcoror    rÊ   r!   Úaccept$  s    

	
zIocpProactor.acceptc              
      sÌ   ˆ j tjkr4t ˆ  ¡ |¡ | j ¡ }| d ¡ |S |  	ˆ ¡ zt 
ˆ  ¡ ˆ j¡ W nB tk
r– } z$|jtjkrt‚ ˆ  ¡ d dkr†‚ W 5 d }~X Y nX t t¡}| ˆ  ¡ |¡ ‡ fdd„}|  |ˆ |¡S )Nr   r   c                    s   |  ¡  ˆ  tjtjd¡ ˆ S rI   )r±   rÇ   r¹   rÈ   rQ   ZSO_UPDATE_CONNECT_CONTEXT©r…   r´   r   ©r½   r    r!   Úfinish_connectV  s     ÿz,IocpProactor.connect.<locals>.finish_connect)Útyper¹   Z
SOCK_DGRAMrQ   Z
WSAConnectrŠ   r2   r‘   r;   r¶   Z	BindLocalrÏ   r1   rR   ÚerrnoZ	WSAEINVALZgetsocknamer·   rn   Z	ConnectExr»   )r   r½   r'   rN   Úer   rÔ   r    rÓ   r!   Úconnect@  s"    



zIocpProactor.connectc           	   	   C   sb   |   |¡ t t¡}|d@ }|d? d@ }| | ¡ t | ¡ ¡|||dd¡ dd„ }|  |||¡S )Nr   é    r   c              
   S   sR   z
|  ¡ W S  tk
rL } z$|jtjtjfkr:t|jŽ ‚n‚ W 5 d }~X Y nX d S r7   r°   r³   r    r    r!   Úfinish_sendfilei  s    
ÿz.IocpProactor.sendfile.<locals>.finish_sendfile)	r¶   rQ   r·   rn   ZTransmitFilerŠ   Ú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 r7   )r±   rÒ   ©rt   r    r!   Úfinish_accept_pipe  s    z4IocpProactor.accept_pipe.<locals>.finish_accept_pipe)r¶   rQ   r·   rn   ZConnectNamedPiperŠ   r®   r»   )r   rt   r   Z	connectedrá   r    rà   r!   r‰   t  s    


zIocpProactor.accept_pipec              
   Ã   sr   t }zt |¡}W qhW n0 tk
rF } z|jtjkr6‚ W 5 d }~X Y nX t|d tƒ}t 	|¡I d H  qt
 |¡S )Né   )ÚCONNECT_PIPE_INIT_DELAYrQ   ZConnectPiper1   rR   ZERROR_PIPE_BUSYÚminÚCONNECT_PIPE_MAX_DELAYr	   Úsleepr
   ro   )r   r'   ZdelayrG   r4   r    r    r!   r€   …  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   rG   r«   r    r    r!   Úwait_for_handle˜  s    zIocpProactor.wait_for_handlec                 C   s   |   |d d¡}||_|S rc   )rç   rW   )r   rX   Zdone_callbackrN   r    r    r!   ra      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 )Nç     @�@r   r   c                    s   ˆ   ¡ S r7   )rK   rÒ   ©rƒ   r    r!   Úfinish_wait_for_handle½  s    z=IocpProactor._wait_for_handle.<locals>.finish_wait_for_handler   )r¥   rJ   ÚINFINITEÚmathÚceilrQ   r·   rn   ZRegisterWaitWithQueuer¡   r'   rV   r2   rZ   r   r¢   )r   rG   r«   Z
_is_cancelÚmsr   rH   rë   r    rê   r!   rç   §  s*    
   ÿ
ÿ	zIocpProactor._wait_for_handlec                 C   s0   || j kr,| j  |¡ t | ¡ | jdd¡ d S rI   )rF   rp   rQ   rŸ   rŠ   r¡   ©r   Úobjr    r    r!   r¶   É  s    
z IocpProactor._register_with_iocpc              
   C   sŠ   |   ¡  t|| jd�}|jr$|jd= |jsrz|d d |ƒ}W n, tk
rf } z| |¡ W 5 d }~X Y nX | |¡ ||||f| j|j	< |S r   )
r¥   r   r2   r   r"   r1   r9   r;   r¢   r'   )r   r   rñ   Úcallbackrƒ   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£   rL   r|   r    r    r!   r`   ó  s    zIocpProactor._unregisterc                 C   s   t   |¡}| d¡ |S rI   )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ƒ‚t | j|¡}|d krX�qZd}|\}}}}z| j |¡\}}	}
}W nX t	k
rØ   | j
 ¡ r¸| j
 dd||||f dœ¡ |dtjfkrÐt |¡ Y q>Y nX |
| jkrî| ¡  q>| ¡ s>z||||	ƒ}W n: tk
�r@ } z| |¡ | j |¡ W 5 d }~X Y q>X | |¡ | j |¡ q>| jD ]}	| j |	jd ¡ �q`| j ¡  d S )Nr   znegative timeoutré   ztimeout too bigz8GetQueuedCompletionStatus() returned an unexpected eventz)err=%s transferred=%s key=%#x address=%#x)r,   Ústatus)rì   Ú
ValueErrorrí   rî   rQ   ZGetQueuedCompletionStatusr¡   r¢   ÚpopÚKeyErrorr2   Z	get_debugr3   r    rJ   r_   r¤   r0   Zdoner1   r9   rž   rL   r;   r£   r'   rv   )r   r«   rï   rô   ÚerrZtransferredr´   r'   rƒ   r   rñ   rò   r­   r×   r    r    r!   rK     sL    


ÿý	






zIocpProactor._pollc                 C   s   | j  |¡ d S r7   )r¤   rp   rð   r    r    r!   Ú_stop_serving9  s    zIocpProactor._stop_servingc                 C   s  | j d krd S t| j ¡ ƒD ]ˆ\}\}}}}| ¡ r6qt|tƒrBqz| ¡  W q tk
r¢ } z6| j	d k	r’d||dœ}|j
r†|j
|d< | j	 |¡ W 5 d }~X Y qX qd}t ¡ }	|	| }
| jrú|
t ¡ krît d| t ¡ |	 ¡ t ¡ | }
|  |¡ qºg | _t | j ¡ d | _ d S )NzCancelling a future failedr+   r/   g      ð?z,%r is running after closing for %.1f seconds)r¡   Úlistr¢   ÚitemsZ	cancelledr¸   rV   r0   r1   r2   r   r3   ÚtimeÚ	monotonicr   ÚdebugrK   rž   rJ   r_   )r   r'   rN   r   rñ   rò   r4   r5   Z
msg_updateZ
start_timeZnext_msgr    r    r!   ru   ?  s@    


ý
  
ÿzIocpProactor.closec                 C   s   |   ¡  d S r7   )ru   r8   r    r    r!   rw   n  s    zIocpProactor.__del__)r   )N)r   )r   )r   )r   N)r   )N)N)r>   r?   r@   rA   r   r¥   r©   rª   r¬   r®   r¿   rÁ   rÂ   rÄ   rÅ   rÑ   rØ   rß   r‰   r€   rè   ra   rç   r¶   r»   r`   rÎ   rK   rù   ru   rw   r    r    r    r!   r   •  s8   








"
 

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 r7   )Ú_procZpollZ_process_exited)rƒ   Ú
returncoder8   r    r!   rò   y  s    
z4_WindowsSubprocessTransport._start.<locals>.callback)	r
   ÚPopenrÿ   r2   r[   rè   ÚintrD   rŒ   )
r   r–   r—   r˜   r™   rš   r›   rœ   rò   rƒ   r    r8   r!   Ú_startt  s    ÿ   þþz"_WindowsSubprocessTransport._startN)r>   r?   r@   r  r    r    r    r!   r’   r  s   r’   c                   @   s   e Zd ZeZdS )r   N)r>   r?   r@   r   Ú_loop_factoryr    r    r    r!   r   „  s   r   c                   @   s   e Zd ZeZdS )r   N)r>   r?   r@   r   r  r    r    r    r!   r   ˆ  s   r   )/rA   rQ   rJ   rÖ   rí   rÛ   r¹   rÆ   rü   re   Ú r   r   r   r   r   r   r	   r
   Úlogr   Ú__all__rn   rì   ZERROR_CONNECTION_REFUSEDZERROR_CONNECTION_ABORTEDrã   rå   ZFuturer   rC   rV   rZ   Úobjectrb   ZBaseSelectorEventLooprx   ZBaseProactorEventLoopr   r   ZBaseSubprocessTransportr’   r   ZBaseDefaultEventLoopPolicyr   r   r   r    r    r    r!   Ú<module>   sR   0J4;e   `