o
    éT•jr‚  ã                   @   s¶  d Z ddlZejdkredƒ‚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.ƒZ0e0Z1dS )+z.Selector and proactor event loops for Windows.é    NÚwin32z
win32 onlyé   )Ú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d‡ 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.10/asyncio/windows_events.pyr   6   s   
z_OverlappedFuture.__init__c                    sH   t ƒ  ¡ }| jd ur"| jjrdnd}| dd|› d| jjd›d�¡ |S )NÚpendingÚ	completedr   zoverlapped=<z, ú#xú>)r   Ú
_repr_infor   r#   ÚinsertÚaddress©r   ÚinfoÚstater   r!   r"   r'   <   s
   

 z_OverlappedFuture._repr_infoc              
   C   st   | j d u rd S z| j  ¡  W n& ty4 } zd|| dœ}| jr$| j|d< | j |¡ W Y d }~nd }~ww 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_overlappedC   s   
ý
€ø
	z$_OverlappedFuture._cancel_overlappedc                    ó   |   ¡  tƒ j|d�S ©N)Úmsg)r8   r   r2   ©r   r;   r   r!   r"   r2   S   ó   z_OverlappedFuture.cancelc                    s   t ƒ  |¡ |  ¡  d S ©N)r   Úset_exceptionr8   ©r   r/   r   r!   r"   r?   W   s   z_OverlappedFuture.set_exceptionc                    s   t ƒ  |¡ d | _d S r>   )r   Ú
set_resultr   ©r   Úresultr   r!   r"   rA   [   s   
z_OverlappedFuture.set_resultr>   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r'   r8   r2   r?   rA   Ú__classcell__r!   r!   r   r"   r   0   s    r   c                       sp   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d‡ 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   c   s   
z_BaseWaitHandleFuture.__init__c                 C   s   t  | jd¡t jkS ©Nr   )Ú_winapiÚWaitForSingleObjectrJ   ÚWAIT_OBJECT_0©r   r!   r!   r"   Ú_pollq   s   ÿz_BaseWaitHandleFuture._pollc                    sd   t ƒ  ¡ }| d| jd›�¡ | jd ur!|  ¡ rdnd}| |¡ | jd ur0| d| jd›�¡ |S )Nzhandle=r%   ÚsignaledÚwaitingzwait_handle=)r   r'   ÚappendrJ   rT   rK   r*   r   r!   r"   r'   v   s   



z _BaseWaitHandleFuture._repr_infoc                 C   s
   d | _ d S r>   )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 n3 tyH } z'|jtjkr>d|| dœ}| jr1| j|d< | j 	|¡ W Y d }~d S W Y d }~nd }~ww |  
d ¡ d S ©NFz$Failed to unregister the wait handler-   r1   )rL   rK   Ú_overlappedÚUnregisterWaitr3   ÚwinerrorÚERROR_IO_PENDINGr   r4   r5   rZ   ©r   rN   r6   r7   r!   r!   r"   Ú_unregister_wait…   s*   ý
÷€ÿz&_BaseWaitHandleFuture._unregister_waitc                    r9   r:   )ra   r   r2   r<   r   r!   r"   r2   �   r=   z_BaseWaitHandleFuture.cancelc                    ó   |   ¡  tƒ  |¡ d S r>   )ra   r   r?   r@   r   r!   r"   r?   ¡   ó   z#_BaseWaitHandleFuture.set_exceptionc                    rb   r>   )ra   r   rA   rB   r   r!   r"   rA   ¥   rc   z _BaseWaitHandleFuture.set_resultr>   )rD   rE   rF   rG   r   rT   r'   rZ   ra   r2   r?   rA   rH   r!   r!   r   r"   rI   `   s    
rI   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   ÚeventrN   r   r   r!   r"   r   ¯   s   
z_WaitCancelFuture.__init__c                 C   s   t dƒ‚)Nz'_WaitCancelFuture must not be cancelled)ÚRuntimeErrorrS   r!   r!   r"   r2   ´   s   z_WaitCancelFuture.cancelc                    ó(   t ƒ  |¡ | jd ur|  | ¡ d S d S r>   )r   rA   re   rB   r   r!   r"   rA   ·   ó   
ÿz_WaitCancelFuture.set_resultc                    rh   r>   )r   r?   re   r@   r   r!   r"   r?   ¼   ri   z_WaitCancelFuture.set_exception)	rD   rE   rF   rG   r   r2   rA   r?   rH   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 )	Ú_WaitHandleFutureNr   c                   s<   t ƒ j||||d� || _d| _t d ddd ¡| _d | _d S )Nr   TF)r   r   Ú	_proactorÚ_unregister_proactorr\   ÚCreateEventÚ_eventÚ
_event_fut)r   r   rM   rN   Úproactorr   r   r!   r"   r   Ã   s
   
z_WaitHandleFuture.__init__c                    sF   | j d urt | j ¡ d | _ d | _| j | j¡ d | _tƒ  |¡ d S r>   )	rn   rP   ÚCloseHandlero   rk   Ú_unregisterr   r   rZ   rX   r   r!   r"   rZ   Ê   s   
	z%_WaitHandleFuture._unregister_wait_cbc              
   C   s®   | j sd S d| _ | j}d | _z	t || j¡ W n3 tyJ } z'|jtjkr@d|| dœ}| jr3| j|d< | j	 
|¡ W Y d }~d S W Y d }~nd }~ww | j | j| j¡| _d S r[   )rL   rK   r\   ÚUnregisterWaitExrn   r3   r^   r_   r   r4   r5   rk   Ú_wait_cancelrZ   ro   r`   r!   r!   r"   ra   Ü   s.   ý
÷€ÿ

ÿz"_WaitHandleFuture._unregister_wait)rD   rE   rF   r   rZ   ra   rH   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)r{   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 r>   )ÚclosedrP   ÚPIPE_ACCESS_DUPLEXÚFILE_FLAG_OVERLAPPEDÚFILE_FLAG_FIRST_PIPE_INSTANCEÚCreateNamedPiperw   ÚPIPE_TYPE_MESSAGEÚPIPE_READMODE_MESSAGEÚ	PIPE_WAITÚPIPE_UNLIMITED_INSTANCESr   ÚBUFSIZEÚNMPWAIT_WAIT_FOREVERÚNULLÚ
PipeHandlerz   Úadd)r   ÚfirstÚflagsÚhÚpiper!   r!   r"   r}     s"   

ÿú
zPipeServer._server_pipe_handlec                 C   s
   | j d u S r>   )rw   rS   r!   r!   r"   r€     ó   
zPipeServer.closedc                 C   sV   | j d ur| j  ¡  d | _ | jd ur)| jD ]}| ¡  qd | _d | _| j ¡  d S d S r>   )r|   r2   rw   rz   Úcloser{   Úclear)r   r‘   r!   r!   r"   r“   "  s   




ûzPipeServer.closeN)
rD   rE   rF   rG   r   r   r}   r€   r“   Ú__del__r!   r!   r!   r"   ru   ö   s    
ru   c                   @   s   e Zd ZdZdS )Ú_WindowsSelectorEventLoopz'Windows version of selector event loop.N)rD   rE   rF   rG   r!   r!   r!   r"   r–   1  ó    r–   c                       sJ   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 u rt ƒ }tƒ  |¡ d S r>   )r   r   r   )r   rp   r   r!   r"   r   8  s   zProactorEventLoop.__init__c              	      sž   z2| j d u sJ ‚|  | j¡ tƒ  ¡  W | j d ur1| j j}| j  ¡  |d ur,| j |¡ d | _ d S d S | j d urN| j j}| j  ¡  |d urK| j |¡ d | _ w r>   )	Ú_self_reading_futureÚ	call_soonÚ_loop_self_readingr   Úrun_foreverr   r2   rk   rr   ©r   r   r   r!   r"   r›   =  s    


õ
zProactorEventLoop.run_foreverc                 Ã   s:   �| j  |¡}|I d H }|ƒ }| j||d|id�}||fS )NÚaddr©Úextra)rk   Úconnect_pipeÚ_make_duplex_pipe_transport)r   Úprotocol_factoryr)   Úfr‘   ÚprotocolÚtransr!   r!   r"   Úcreate_pipe_connectionP  s   €
ÿz(ProactorEventLoop.create_pipe_connectionc                 ƒ   s0   �t ˆ ƒ‰d‡ ‡‡‡‡fdd„	‰ˆ ˆ¡ ˆgS )Nc              
      sT  d }z7| r'|   ¡ }ˆj |¡ ˆ ¡ r| ¡  W d S ˆƒ }ˆj||dˆ id� ˆ ¡ }|d u r2W d S ˆj |¡} W nf t	yT   |rL| 
¡ dkrL| ¡  ˆ ˆ¡ Y d S  tyŒ } z-|rq| 
¡ dkrqˆ d||dœ¡ | ¡  nˆjr|tjd|dd� ˆ ˆ¡ W Y d }~d S d }~w tjyŸ   |rœ| ¡  Y d S Y d S w | ˆ_|  ˆ¡ d S )	Nr�   rž   r   zPipe accept failed)r.   r/   r‘   zAccept pipe failed on pipe %rT)Úexc_info)rC   rz   Údiscardr€   r“   r¡   r   rk   Úaccept_pipeÚBrokenPipeErrorÚfilenor™   r3   r5   Ú_debugr   Úwarningr   ÚCancelledErrorr|   Úadd_done_callback)r£   r‘   r¤   r6   ©r)   Úloop_accept_piper¢   r   Úserverr!   r"   r±   [  sR   
ÿý
ÿ€ÿÿz>ProactorEventLoop.start_serving_pipe.<locals>.loop_accept_piper>   )ru   r™   )r   r¢   r)   r!   r°   r"   Ústart_serving_pipeX  s
   €
-z$ProactorEventLoop.start_serving_pipec	              	   Ë   sx   �|   ¡ }
t| |||||||f|
|dœ|	¤Ž}z|
I d H  W |S  ttfy)   ‚  ty;   | ¡  | ¡ I d H  ‚ w )N)ÚwaiterrŸ   )Úcreate_futureÚ_WindowsSubprocessTransportÚ
SystemExitÚKeyboardInterruptÚBaseExceptionr“   Ú_wait)r   r¤   ÚargsÚshellÚstdinÚstdoutÚstderrÚbufsizerŸ   Úkwargsr´   Útranspr!   r!   r"   Ú_make_subprocess_transport‹  s&   €
ÿþýùýz,ProactorEventLoop._make_subprocess_transportr>   )
rD   rE   rF   rG   r   r›   r¦   r³   rÃ   rH   r!   r!   r   r"   r   5  s    5þ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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/d0„ Zd1d2„ Zd<d3d4„Zd5d6„ Zd7d8„ Zd9d:„ ZdS )?r   z#Proactor implementation using IOCP.r   c                 C   sD   d | _ g | _t tjtd|¡| _i | _t 	¡ | _
g | _t 	¡ | _d S rO   )r4   Ú_resultsr\   ÚCreateIoCompletionPortÚINVALID_HANDLE_VALUEr‹   Ú_iocpÚ_cacherx   ry   rL   Ú_unregisteredÚ_stopped_serving)r   Úconcurrencyr!   r!   r"   r   ¢  s   
ÿ
zIocpProactor.__init__c                 C   s   | j d u r	tdƒ‚d S )NzIocpProactor is closed)rÇ   rg   rS   r!   r!   r"   Ú_check_closed¬  s   
ÿzIocpProactor._check_closedc                 C   sF   dt | jƒ dt | jƒ g}| jd u r| d¡ d| jjd |¡f S )Nzoverlapped#=%sz
result#=%sr€   z<%s %s>ú )ÚlenrÈ   rÄ   rÇ   rW   r    rD   Újoin)r   r+   r!   r!   r"   Ú__repr__°  s   ÿ

zIocpProactor.__repr__c                 C   s
   || _ d S r>   )r4   )r   r   r!   r!   r"   Úset_loop·  r’   zIocpProactor.set_loopNc                 C   s.   | j s|  |¡ | j }g | _ z|W d }S d }w r>   )rÄ   rT   )r   Útimeoutr~   r!   r!   r"   Úselectº  s   
zIocpProactor.selectc                 C   s   | j  ¡ }| |¡ |S r>   )r4   rµ   rA   )r   ÚvaluerY   r!   r!   r"   Ú_resultÅ  ó   

zIocpProactor._resultr   c                 C   ó|   |   |¡ t t¡}zt|tjƒr| | ¡ ||¡ n| | ¡ |¡ W n t	y2   |  
d¡ Y S w dd„ }|  |||¡S )Nó    c              
   S   óB   z|  ¡ W S  ty  } z|jtjtjfv rt|jŽ ‚‚ d }~ww r>   ©Ú	getresultr3   r^   r\   ÚERROR_NETNAME_DELETEDÚERROR_OPERATION_ABORTEDÚConnectionResetErrorr»   ©r¥   Úkeyr   r6   r!   r!   r"   Úfinish_recvÕ  ó   
ÿ
€ûz&IocpProactor.recv.<locals>.finish_recv)Ú_register_with_iocpr\   Ú
Overlappedr‹   Ú
isinstanceÚsocketÚWSARecvr«   ÚReadFilerª   rÕ   Ú	_register©r   ÚconnÚnbytesr�   r   rá   r!   r!   r"   ÚrecvÊ  ó   

€ÿ
zIocpProactor.recvc                 C   r×   )Nr   c              
   S   rÙ   r>   rÚ   rß   r!   r!   r"   rá   ì  râ   z+IocpProactor.recv_into.<locals>.finish_recv)rã   r\   rä   r‹   rå   ræ   ÚWSARecvIntor«   ÚReadFileIntorª   rÕ   ré   )r   rë   Úbufr�   r   rá   r!   r!   r"   Ú	recv_intoá  rî   zIocpProactor.recv_intoc                 C   s^   |   |¡ t t¡}z| | ¡ ||¡ W n ty#   |  d¡ Y S w dd„ }|  |||¡S )N)rØ   Nc              
   S   rÙ   r>   rÚ   rß   r!   r!   r"   rá      râ   z*IocpProactor.recvfrom.<locals>.finish_recv)	rã   r\   rä   r‹   ÚWSARecvFromr«   rª   rÕ   ré   rê   r!   r!   r"   Úrecvfromø  s   

ÿ
zIocpProactor.recvfromc                 C   s>   |   |¡ t t¡}| | ¡ |||¡ dd„ }|  |||¡S )Nc              
   S   rÙ   r>   rÚ   rß   r!   r!   r"   Úfinish_send  râ   z(IocpProactor.sendto.<locals>.finish_send)rã   r\   rä   r‹   Ú	WSASendTor«   ré   )r   rë   rñ   r�   r�   r   rõ   r!   r!   r"   Úsendto  s
   


zIocpProactor.sendtoc                 C   sZ   |   |¡ t t¡}t|tjƒr| | ¡ ||¡ n| | ¡ |¡ dd„ }|  	|||¡S )Nc              
   S   rÙ   r>   rÚ   rß   r!   r!   r"   rõ   &  râ   z&IocpProactor.send.<locals>.finish_send)
rã   r\   rä   r‹   rå   ræ   ÚWSASendr«   Ú	WriteFileré   )r   rë   rñ   r�   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Úpackr«   Ú
setsockoptræ   Ú
SOL_SOCKETr\   ÚSO_UPDATE_ACCEPT_CONTEXTÚ
settimeoutÚ
gettimeoutÚgetpeername)r¥   rà   r   rñ   ©rë   Úlistenerr!   r"   Úfinish_accept8  s   ÿz*IocpProactor.accept.<locals>.finish_acceptc                 Ó   s.   �z| I d H  W d S  t jy   | ¡  ‚ w r>   )r   r®   r“   )r0   rë   r!   r!   r"   Úaccept_coroA  s   €þz(IocpProactor.accept.<locals>.accept_coror   )rã   Ú_get_accept_socketÚfamilyr\   rä   r‹   ÚAcceptExr«   ré   r
   Úensure_futurer4   )r   r  r   r  r  r0   Úcoror!   r  r"   Úaccept2  s   

	
zIocpProactor.acceptc              
      sÎ   ˆ j tjkrt ˆ  ¡ |¡ | j ¡ }| d ¡ |S |  	ˆ ¡ zt 
ˆ  ¡ ˆ j¡ W n" tyL } z|jtjkr9‚ ˆ  ¡ d dkrB‚ W Y d }~nd }~ww t t¡}| ˆ  ¡ |¡ ‡ fdd„}|  |ˆ |¡S )Nr   r   c                    s   |  ¡  ˆ  tjtjd¡ ˆ S rO   )rÛ   rý   ræ   rþ   r\   ÚSO_UPDATE_CONNECT_CONTEXT©r¥   rà   r   ©rë   r!   r"   Úfinish_connectd  s
   ÿz,IocpProactor.connect.<locals>.finish_connect)Útyperæ   Ú
SOCK_DGRAMr\   Ú
WSAConnectr«   r4   rµ   rA   rã   Ú	BindLocalr  r3   r^   ÚerrnoÚ	WSAEINVALÚgetsocknamerä   r‹   Ú	ConnectExré   )r   rë   r)   rY   Úer   r  r!   r  r"   ÚconnectN  s(   


ÿ€ü
zIocpProactor.connectc           	   	   C   sb   |   |¡ t t¡}|d@ }|d? d@ }| | ¡ t | ¡ ¡|||dd¡ dd„ }|  |||¡S )Nr   é    r   c              
   S   rÙ   r>   rÚ   rß   r!   r!   r"   Úfinish_sendfilew  râ   z.IocpProactor.sendfile.<locals>.finish_sendfile)	rã   r\   rä   r‹   ÚTransmitFiler«   ÚmsvcrtÚget_osfhandleré   )	r   ÚsockÚfileÚoffsetÚcountr   Ú
offset_lowÚoffset_highr  r!   r!   r"   Úsendfilem  s   


ý	zIocpProactor.sendfilec                    sJ   |   ˆ ¡ t t¡}| ˆ  ¡ ¡}|r|  ˆ ¡S ‡ fdd„}|  |ˆ |¡S )Nc                    s   |  ¡  ˆ S r>   )rÛ   r  ©r‘   r!   r"   Úfinish_accept_pipe�  s   z4IocpProactor.accept_pipe.<locals>.finish_accept_pipe)rã   r\   rä   r‹   ÚConnectNamedPiper«   rÕ   ré   )r   r‘   r   Ú	connectedr(  r!   r'  r"   r©   ‚  s   


zIocpProactor.accept_pipec              
   Ã   st   �t }	 zt |¡}W n) ty$ } z|jtjkr‚ W Y d }~nd }~ww t|d tƒ}t 	|¡I d H  qt
 |¡S )NTé   )ÚCONNECT_PIPE_INIT_DELAYr\   ÚConnectPiper3   r^   ÚERROR_PIPE_BUSYÚminÚCONNECT_PIPE_MAX_DELAYr
   Úsleepr   rŒ   )r   r)   ÚdelayrM   r6   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   rM   rÒ   r!   r!   r"   Úwait_for_handle¦  s   zIocpProactor.wait_for_handlec                 C   s   |   |d d¡}||_|S rv   )r3  re   )r   rf   Údone_callbackrY   r!   r!   r"   rt   ®  s   zIocpProactor._wait_cancelc                    s¢   |   ¡  |d u 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 r>   )rT   r  ©r£   r!   r"   Úfinish_wait_for_handleË  s   z=IocpProactor._wait_for_handle.<locals>.finish_wait_for_handler   )rÌ   rP   ÚINFINITEÚmathÚceilr\   rä   r‹   ÚRegisterWaitWithQueuerÇ   r)   rd   r4   rj   r   rÈ   )r   rM   rÒ   Ú
_is_cancelÚmsr   rN   r8  r!   r7  r"   r3  µ  s$   
ÿ
ÿ	zIocpProactor._wait_for_handlec                 C   s4   || j vr| j  |¡ t | ¡ | jdd¡ d S d S rO   )rL   r�   r\   rÅ   r«   rÇ   ©r   Úobjr!   r!   r"   rã   ×  s   
þz IocpProactor._register_with_iocpc              
   C   sŒ   |   ¡  t|| jd�}|jr|jd= |js:z|d d |ƒ}W n ty4 } z| |¡ W Y d }~n
d }~ww | |¡ ||||f| j|j	< |S r   )
rÌ   r   r4   r   r#   r3   r?   rA   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É   rW   rœ   r!   r!   r"   rr     s   zIocpProactor._unregisterc                 C   s   t   |¡}| d¡ |S rO   )ræ   r   )r   r  Úsr!   r!   r"   r    rÖ   zIocpProactor._get_accept_socketc                 C   sŒ  |d u rt }n|dk rtdƒ‚t |d ¡}|t krtdƒ‚	 t | j|¡}|d u r+n†d}|\}}}}z| j |¡\}}	}
}W n) t	yh   | j
 ¡ rZ| j
 dd||||f dœ¡ |dtjfvrft |¡ Y qw |
| jv rs| ¡  n=| ¡ s°z5z||||	ƒ}W n ty� } z| |¡ | j |¡ W Y d }~nd }~ww | |¡ | j |¡ W d }nd }w q| jD ]
}	| j |	jd ¡ q´| j ¡  d S )	Nr   znegative timeoutr6  ztimeout too bigTz8GetQueuedCompletionStatus() returned an unexpected eventz)err=%s transferred=%s key=%#x address=%#x)r.   Ústatus)r9  Ú
ValueErrorr:  r;  r\   ÚGetQueuedCompletionStatusrÇ   rÈ   ÚpopÚKeyErrorr4   Ú	get_debugr5   rÆ   rP   rq   rÊ   r2   Údoner3   r?   rÄ   rW   rA   rÉ   r)   r”   )r   rÒ   r>  rC  ÚerrÚtransferredrà   r)   r£   r   r@  rA  rÔ   r  r!   r!   r"   rT     sZ   

ÿý	
ó


€þ
€Ú
)zIocpProactor._pollc                 C   s   | j  |¡ d S r>   )rÊ   r�   r?  r!   r!   r"   Ú_stop_servingI  s   zIocpProactor._stop_servingc                 C   s  | j d u rd S t| j ¡ ƒD ]D\}\}}}}| ¡ rqt|tƒr!qz| ¡  W q tyR } z| j	d urHd||dœ}|j
rB|j
|d< | j	 |¡ W Y d }~qd }~ww d}t ¡ }	|	| }
| jr|
t ¡ krwt d| t ¡ |	 ¡ t ¡ | }
|  |¡ | js`g | _t | j ¡ d | _ d S )NzCancelling a future failedr-   r1   g      ð?z,%r is running after closing for %.1f seconds)rÇ   ÚlistrÈ   ÚitemsÚ	cancelledrå   rd   r2   r3   r4   r   r5   ÚtimeÚ	monotonicr   ÚdebugrT   rÄ   rP   rq   )r   r)   rY   r   r@  rA  r6   r7   Ú
msg_updateÚ
start_timeÚnext_msgr!   r!   r"   r“   O  sD   


ý
€÷ÿ
ù	
zIocpProactor.closec                 C   s   |   ¡  d S r>   )r“   rS   r!   r!   r"   r•   ~  s   zIocpProactor.__del__)r   r>   )r   )r   N)rD   rE   rF   rG   r   rÌ   rÐ   rÑ   rÓ   rÕ   rí   rò   rô   r÷   rú   r  r  r&  r©   r    r4  rt   r3  rã   ré   rr   r  rT   rL  r“   r•   r!   r!   r!   r"   r   Ÿ  s:    








"
 

9/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 r>   )Ú_procÚpollÚ_process_exited)r£   Ú
returncoderS   r!   r"   rA  ‰  s   
z4_WindowsSubprocessTransport._start.<locals>.callback)	r   ÚPopenrV  r4   rk   r4  ÚintrJ   r¯   )
r   r»   r¼   r½   r¾   r¿   rÀ   rÁ   rA  r£   r!   rS   r"   Ú_start„  s   ÿþþz"_WindowsSubprocessTransport._startN)rD   rE   rF   r\  r!   r!   r!   r"   r¶   ‚  s    r¶   c                   @   ó   e Zd ZeZdS )r   N)rD   rE   rF   r   Ú_loop_factoryr!   r!   r!   r"   r   ”  r—   r   c                   @   r]  )r   N)rD   rE   rF   r   r^  r!   r!   r!   r"   r   ˜  r—   r   )2rG   ÚsysÚplatformÚImportErrorr\   rP   r  r:  r  ræ   rû   rP  rx   Ú r   r   r   r   r   r	   r
   r   Úlogr   Ú__all__r‹   r9  ÚERROR_CONNECTION_REFUSEDÚERROR_CONNECTION_ABORTEDr,  r0  ÚFuturer   rI   rd   rj   Úobjectru   ÚBaseSelectorEventLoopr–   ÚBaseProactorEventLoopr   r   ÚBaseSubprocessTransportr¶   r   ÚBaseDefaultEventLoopPolicyr   r   r   r!   r!   r!   r"   Ú<module>   sZ    
0J4;j   f