
    z%i}                        d Z ddlZej                  dk7  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ej2                  Zej4                  ZdZdZdZdZ G d dej>                        Z  G d dej>                        Z! G d de!      Z" G d de!      Z# G d de$      Z% G d dejL                        Z' G d  d!ejP                        Z) G d" d#      Z* G d$ d%ejV                        Z,e'Z- G d& d'ej\                        Z/ G d( d)ej\                        Z0e0Z1y)*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WindowsProactorEventLoopPolicyi  i  gMbP?g?c                   X     e Zd ZdZdd fd
Z fdZd Zd
 fd	Z fdZ fd	Z	 xZ
S )_OverlappedFuturezSubclass of Future which represents an overlapped operation.

    Cancelling it will immediately cancel the overlapped operation.
    Nloopc                f    t         |   |       | j                  r| j                  d= || _        y Nr   )super__init___source_traceback_ov)selfovr   	__class__s      J/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/asyncio/windows_events.pyr   z_OverlappedFuture.__init__6   s1    d#!!&&r*    c                     t         |          }| j                  H| j                  j                  rdnd}|j	                  dd| d| j                  j
                  dd       |S )Npending	completedr   zoverlapped=<z, #x>)r   
_repr_infor   r%   insertaddressr   infostater!   s      r"   r)   z_OverlappedFuture._repr_info<   s\    w!#88!%!1!1I{EKK\%4883C3CB2GqIJr#   c                    | j                   y 	 | j                   j                          d | _         y # t        $ rM}d|| d}| j                  r| j                  |d<   | j                  j                  |       Y d }~d | _         y d }~ww xY w)Nz&Cancelling an overlapped future failedmessage	exceptionfuturesource_traceback)r   cancelOSErrorr   _loopcall_exception_handler)r   exccontexts      r"   _cancel_overlappedz$_OverlappedFuture._cancel_overlappedC   s    88
	7HHOO   	7C G
 %%.2.D.D*+JJ--g66	7s   1 	B<BBc                 D    | j                          t        | 	  |      S N)msg)r;   r   r5   r   r>   r!   s     r"   r5   z_OverlappedFuture.cancelS   s     !w~#~&&r#   c                 D    t         |   |       | j                          y N)r   set_exceptionr;   r   r2   r!   s     r"   rB   z_OverlappedFuture.set_exceptionW   s    i(!r#   c                 2    t         |   |       d | _        y rA   )r   
set_resultr   r   resultr!   s     r"   rE   z_OverlappedFuture.set_result[   s    6"r#   rA   )__name__
__module____qualname____doc__r   r)   r;   r5   rB   rE   __classcell__r!   s   @r"   r   r   0   s0    
 $(  '" r#   r   c                   d     e Zd ZdZdd fd
Zd Z fdZd Zd Zd fd		Z	 fd
Z
 fdZ xZS )_BaseWaitHandleFuturez2Subclass of Future which represents a wait handle.Nr   c                    t         |   |       | j                  r| j                  d= || _        || _        || _        d| _        y )Nr   r   T)r   r   r   r   _handle_wait_handle_registered)r   r    handlewait_handler   r!   s        r"   r   z_BaseWaitHandleFuture.__init__c   sL    d#!!&&r* '  r#   c                 d    t        j                  | j                  d      t         j                  k(  S Nr   )_winapiWaitForSingleObjectrQ   WAIT_OBJECT_0r   s    r"   _pollz_BaseWaitHandleFuture._pollq   s)    ++DLL!<%%& 	'r#   c                    t         |          }|j                  d| j                  d       | j                  %| j	                         rdnd}|j                  |       | j
                  |j                  d| j
                  d       |S )Nzhandle=r'   signaledwaitingzwait_handle=)r   r)   appendrQ   r\   rR   r,   s      r"   r)   z _BaseWaitHandleFuture._repr_infov   s|    w!#gdll2./0<<#"&**,JIEKK(KK,t'8'8&<=>r#   c                     d | _         y rA   )r   )r   futs     r"   _unregister_wait_cbz)_BaseWaitHandleFuture._unregister_wait_cb   s     r#   c                    | j                   sy d| _         | j                  }d | _        	 t        j                  |       | j                  d        y # t        $ rh}|j
                  t        j                  k7  rAd|| d}| j                  r| j                  |d<   | j                  j                  |       Y d }~y Y d }~~d }~ww xY wNFz$Failed to unregister the wait handler0   r4   )rS   rR   _overlappedUnregisterWaitr6   winerrorERROR_IO_PENDINGr   r7   r8   rc   r   rU   r9   r:   s       r"   _unregister_waitz&_BaseWaitHandleFuture._unregister_wait   s     '' 	&&{3 	  &  
	||{;;;E!$"
 ))262H2HG./

11': <
	s   A 	CAB<<Cc                 D    | j                          t        | 	  |      S r=   )rk   r   r5   r?   s     r"   r5   z_BaseWaitHandleFuture.cancel   s     w~#~&&r#   c                 D    | j                          t        | 	  |       y rA   )rk   r   rB   rC   s     r"   rB   z#_BaseWaitHandleFuture.set_exception   s    i(r#   c                 D    | j                          t        | 	  |       y rA   )rk   r   rE   rF   s     r"   rE   z _BaseWaitHandleFuture.set_result   s    6"r#   rA   )rH   rI   rJ   rK   r   r\   r)   rc   rk   r5   rB   rE   rL   rM   s   @r"   rO   rO   `   s6    <8<  '

'0')# #r#   rO   c                   B     e Zd ZdZdd fd
Zd Z fdZ fdZ xZS )_WaitCancelFuturezoSubclass of Future which represents a wait for the cancellation of a
    _WaitHandleFuture using an event.
    Nr   c                :    t         |   ||||       d | _        y )Nr   )r   r   _done_callback)r   r    eventrU   r   r!   s        r"   r   z_WaitCancelFuture.__init__   s!    UKd;"r#   c                     t        d      )Nz'_WaitCancelFuture must not be cancelled)RuntimeErrorr[   s    r"   r5   z_WaitCancelFuture.cancel   s    DEEr#   c                 `    t         |   |       | j                  | j                  |        y y rA   )r   rE   rr   rF   s     r"   rE   z_WaitCancelFuture.set_result   s/    6"*% +r#   c                 `    t         |   |       | j                  | j                  |        y y rA   )r   rB   rr   rC   s     r"   rB   z_WaitCancelFuture.set_exception   s/    i(*% +r#   )	rH   rI   rJ   rK   r   r5   rE   rB   rL   rM   s   @r"   rp   rp      s'     8< #
F&
& &r#   rp   c                   4     e Zd Zdd fd
Z fdZd Z xZS )_WaitHandleFutureNr   c                    t         |   ||||       || _        d| _        t	        j
                  d ddd       | _        d | _        y )Nr   TF)r   r   	_proactor_unregister_proactorrf   CreateEvent_event
_event_fut)r   r    rT   rU   proactorr   r!   s         r"   r   z_WaitHandleFuture.__init__   sG    V[t<!$(!!--dD%Fr#   c                     | j                   -t        j                  | j                          d | _         d | _        | j                  j                  | j                         d | _        t        | !  |       y rA   )	r~   rX   CloseHandler   r{   _unregisterr   r   rc   )r   rb   r!   s     r"   rc   z%_WaitHandleFuture._unregister_wait_cb   sY    ;;",DK"DO 	""488,#C(r#   c                    | j                   sy d| _         | j                  }d | _        	 t        j                  || j                         | j                  j                  | j                  | j                        | _        y # t
        $ rh}|j                  t        j                  k7  rAd|| d}| j                  r| j                  |d<   | j                  j                  |       Y d }~y Y d }~d }~ww xY wre   )rS   rR   rf   UnregisterWaitExr~   r6   rh   ri   r   r7   r8   r{   _wait_cancelrc   r   rj   s       r"   rk   z"_WaitHandleFuture._unregister_wait   s     '' 	((dkkB ..55dkk6:6N6NP  
	||{;;;E!$"
 ))262H2HG./

11': <
	s    A? ?	C0AC++C0)rH   rI   rJ   r   rc   rk   rL   rM   s   @r"   ry   ry      s    BF )$Pr#   ry   c                   2    e Zd ZdZd Zd Zd Zd Zd ZeZ	y)
PipeServerzXClass representing a pipe server.

    This is much like a bound, listening socket.
    c                     || _         t        j                         | _        d | _        d | _        | j                  d      | _        y NT)_addressweakrefWeakSet_free_instances_pipe_accept_pipe_future_server_pipe_handle)r   r+   s     r"   r   zPipeServer.__init__   s;    &0 
#' --d3
r#   c                 L    | j                   | j                  d      c}| _         |S )NF)r   r   )r   tmps     r"   _get_unconnected_pipez PipeServer._get_unconnected_pipe  s%    
 **d&>&>u&ETZ
r#   c           
      ,   | j                         ry t        j                  t        j                  z  }|r|t        j                  z  }t        j
                  | j                  |t        j                  t        j                  z  t        j                  z  t        j                  t        j                  t        j                  t        j                  t        j                        }t        j                  |      }| j                   j#                  |       |S rA   )closedrX   PIPE_ACCESS_DUPLEXFILE_FLAG_OVERLAPPEDFILE_FLAG_FIRST_PIPE_INSTANCECreateNamedPiper   PIPE_TYPE_MESSAGEPIPE_READMODE_MESSAGE	PIPE_WAITPIPE_UNLIMITED_INSTANCESr   BUFSIZENMPWAIT_WAIT_FOREVERNULL
PipeHandler   add)r   firstflagshpipes        r"   r   zPipeServer._server_pipe_handle  s    ;;=**W-I-IIW:::E##MM5%%(E(EE,,!!=#8#8((',,8 ''*  &r#   c                     | j                   d u S rA   )r   r[   s    r"   r   zPipeServer.closed  s    %&r#   c                 
   | j                   !| j                   j                          d | _         | j                  J| j                  D ]  }|j	                           d | _        d | _        | j                  j                          y y rA   )r   r5   r   r   closer   clear)r   r   s     r"   r   zPipeServer.close"  su    ##/$$++-'+D$==$,, 

DJ DM  &&( %r#   N)
rH   rI   rJ   rK   r   r   r   r   r   __del__ r#   r"   r   r      s'    4$'
) Gr#   r   c                       e Zd ZdZy)_WindowsSelectorEventLoopz'Windows version of selector event loop.N)rH   rI   rJ   rK   r   r#   r"   r   r   1  s    1r#   r   c                   D     e Zd ZdZd fd	Z fdZd Zd Z	 ddZ xZ	S )r   z2Windows version of proactor event loop using IOCP.c                 <    |
t               }t        | 	  |       y rA   )r   r   r   )r   r   r!   s     r"   r   zProactorEventLoop.__init__8  s    #~H"r#   c                    	 | j                   J | j                  | j                         t        |           | j                   U| j                   j
                  }| j                   j                          || j                  j                  |       d | _         y y # | j                   U| j                   j
                  }| j                   j                          || j                  j                  |       d | _         w w xY wrA   )	_self_reading_future	call_soon_loop_self_readingr   run_foreverr   r5   r{   r   )r   r    r!   s     r"   r   zProactorEventLoop.run_forever=  s    	1,,44NN4223G!((4..22))002 >NN..r2,0) 5t((4..22))002 >NN..r2,0) 5s   7B A#C?c                    K   | j                   j                  |      }| d {   } |       }| j                  ||d|i      }||fS 7 %w)Naddrextra)r{   connect_pipe_make_duplex_pipe_transport)r   protocol_factoryr+   fr   protocoltranss          r"   create_pipe_connectionz(ProactorEventLoop.create_pipe_connectionP  sZ     NN''0w#%00x8>7H 1 Jh	 s   !AA	&Ac                 f    K   t              d fd	 j                         gS w)Nc                 J   d }	 | ri| j                         }j                  j                  |       j                         r|j	                          y         }j                  ||di       j                         }|y j                  j                  |      } | _	        | j                         y # t        $ r9 |r#|j                         dk7  r|j	                          j                         Y y t        $ rz}|r9|j                         dk7  r&j                  d||d       |j	                          n$j                   rt#        j$                  d|d       j                         Y d }~y d }~wt&        j(                  $ r |r|j	                          Y y Y y w xY w)	Nr   r   r   zPipe accept failed)r1   r2   r   zAccept pipe failed on pipe %rT)exc_info)rG   r   discardr   r   r   r   r{   accept_piper   add_done_callbackBrokenPipeErrorfilenor   r6   r8   _debugr   warningr   CancelledError)	r   r   r   r9   r+   loop_accept_piper   r   servers	       r"   r   z>ProactorEventLoop.start_serving_pipe.<locals>.loop_accept_pipe[  st   D)688:D**2248}} 

/1H44hvw.? 5 A 335<NN..t4* ./*##$45+ # 1DKKMR/JJL/0 1DKKMR///#7%( $1 
 JJL[[NN#B#'$8/00,, !JJL !s1   AB7 /B7 B7 7?F"8F" A0E55(F"!F"rA   )r   r   )r   r   r+   r   r   s   ```@@r"   start_serving_pipez$ProactorEventLoop.start_serving_pipeX  s2     G$+	6 +	6Z 	'(xs   *1c	           
         K   | j                         }
t        | |||||||f|
|d|	}	 |
 d {    |S 7 # t        t        f$ r  t        $ r+ |j                          |j                          d {  7    w xY ww)N)waiterr   )create_future_WindowsSubprocessTransport
SystemExitKeyboardInterruptBaseExceptionr   _wait)r   r   argsshellstdinstdoutstderrbufsizer   kwargsr   transps               r"   _make_subprocess_transportz,ProactorEventLoop._make_subprocess_transport  s      ##%,T8T5-2FFG74:%7 067	LL  -. 	 	LLN,,.  	s1   'A>8 68 A>8 ;A;3A64A;;A>rA   )
rH   rI   rJ   rK   r   r   r   r   r   rL   rM   s   @r"   r   r   5  s%    <#
1&1j 04r#   r   c                       e Zd ZdZefdZd Zd Zd Zd dZ	d Z
ed	        Zd!d
Zd!dZd!dZd!dZd"dZd!dZd Zd Zd Zd Zd Zd dZd Zd Zd Zd Zd Zd Zd dZd Z d Z!d Z"y)#r   z#Proactor implementation using IOCP.c                     d | _         g | _        t        j                  t        j                  t
        d|      | _        i | _        t        j                         | _
        g | _        t        j                         | _        y rW   )r7   _resultsrf   CreateIoCompletionPortINVALID_HANDLE_VALUEr   _iocp_cacher   r   rS   _unregistered_stopped_serving)r   concurrencys     r"   r   zIocpProactor.__init__  s_    
 77,,dA{D
"??, ' 1r#   c                 2    | j                   t        d      y )NzIocpProactor is closed)r   ru   r[   s    r"   _check_closedzIocpProactor._check_closed  s    ::788 r#   c                     dt        | j                        z  dt        | j                        z  g}| j                  |j	                  d       d| j
                  j                  ddj                  |      dS )Nzoverlapped#=%sz
result#=%sr   < r(   )lenr   r   r   r`   r!   rH   join)r   r-   s     r"   __repr__zIocpProactor.__repr__  s_     3t{{#33s4==113::KK! NN33SXXd^DDr#   c                     || _         y rA   )r7   )r   r   s     r"   set_loopzIocpProactor.set_loop  s	    
r#   Nc                 z    | j                   s| j                  |       | j                   }g | _         	 |d }S # d }w xY wrA   )r   r\   )r   timeoutr   s      r"   selectzIocpProactor.select  s:    }}JJwmm	 C$Cs   6 :c                 \    | j                   j                         }|j                  |       |S rA   )r7   r   rE   )r   valuerb   s      r"   _resultzIocpProactor._result  s%    jj&&(u
r#   c                     	 |j                         S # t        $ rD}|j                  t        j                  t        j
                  fv rt        |j                    d }~ww xY wrA   	getresultr6   rh   rf   ERROR_NETNAME_DELETEDERROR_OPERATION_ABORTEDConnectionResetErrorr   r   keyr    r9   s       r"   finish_socket_funczIocpProactor.finish_socket_func  sY    	<<>! 	|| A A + C C E E*CHH55	    	A?AAc                    | j                  |       t        j                  t              }	 t	        |t
        j
                        r"|j                  |j                         ||       n |j                  |j                         |       | j                  ||| j                        S # t        $ r | j                  d      cY S w xY w)Nr#   )_register_with_iocprf   
Overlappedr   
isinstancesocketWSARecvr   ReadFiler   r   	_registerr  r   connnbytesr   r    s        r"   recvzIocpProactor.recv  s      &##D)	%$.

4;;=&%8DKKM62 ~~b$(?(?@@  	%<<$$	%   AB% %CCc                    | j                  |       t        j                  t              }	 t	        |t
        j
                        r"|j                  |j                         ||       n |j                  |j                         |       | j                  ||| j                        S # t        $ r | j                  d      cY S w xY wrW   )r  rf   r  r   r  r	  WSARecvIntor   ReadFileIntor   r   r  r  r   r  bufr   r    s        r"   	recv_intozIocpProactor.recv_into  s      &##D)	#$.t{{}c59s3 ~~b$(?(?@@  	#<<?"	#r  c                    | j                  |       t        j                  t              }	 |j	                  |j                         ||       | j                  ||| j                        S # t        $ r | j                  d      cY S w xY w)N)r#   N)
r  rf   r  r   WSARecvFromr   r   r   r  r  r  s        r"   recvfromzIocpProactor.recvfrom  sv      &##D)	-NN4;;=&%8 ~~b$(?(?@@  	-<<,,	-s   !A* *BBc                    | j                  |       t        j                  t              }	 |j	                  |j                         ||       d }| j                  |||      S # t        $ r | j                  d      cY S w xY w)Nr   Nc                     	 |j                         S # t        $ rD}|j                  t        j                  t        j
                  fv rt        |j                    d }~ww xY wrA   r   r  s       r"   finish_recvz/IocpProactor.recvfrom_into.<locals>.finish_recv  sY    ||~% <<K$E$E$/$G$G$I I.99r  )	r  rf   r  r   WSARecvFromIntor   r   r   r  )r   r  r  r   r    r  s         r"   recvfrom_intozIocpProactor.recvfrom_into  sw      &##D)	+t{{}c59	 ~~b$44  	+<<	**	+s   !A# #B ?B c                     | j                  |       t        j                  t              }|j	                  |j                         |||       | j                  ||| j                        S rA   )r  rf   r  r   	WSASendTor   r  r  )r   r  r  r   r   r    s         r"   sendtozIocpProactor.sendto  sQ      &##D)
T[[]C5~~b$(?(?@@r#   c                 H   | j                  |       t        j                  t              }t	        |t
        j
                        r"|j                  |j                         ||       n |j                  |j                         |       | j                  ||| j                        S rA   )r  rf   r  r   r  r	  WSASendr   	WriteFiler  r  r  s        r"   sendzIocpProactor.send  sq      &##D)dFMM*JJt{{}c51LL,~~b$(?(?@@r#   c                 |   | j                         | j                  j                        t        j                  t
              }|j                  j                         j                                fd}d }| j                  ||      } ||      }t        j                  || j                         |S )Nc                 ,   |j                          t        j                  dj                               }j	                  t
        j                  t        j                  |       j                  j                                j                         fS )Nz@P)r   structpackr   
setsockoptr	  
SOL_SOCKETrf   SO_UPDATE_ACCEPT_CONTEXT
settimeout
gettimeoutgetpeername)r   r  r    r  r  listeners       r"   finish_acceptz*IocpProactor.accept.<locals>.finish_accept%  sl    LLN++dHOO$56COOF--'@@#GOOH//12))+++r#   c                 v   K   	 |  d {    y 7 # t         j                  $ r |j                           w xY wwrA   )r   r   r   )r3   r  s     r"   accept_coroz(IocpProactor.accept.<locals>.accept_coro.  s2     ,, 

s    9  9 %69r   )r  _get_accept_socketfamilyrf   r  r   AcceptExr   r  r   ensure_futurer7   )r   r2  r    r3  r5  r3   coror  s    `     @r"   acceptzIocpProactor.accept  s      *&&x7##D)
HOO%t{{}5	,	 Hm<64(Dtzz2r#   c                    j                   t        j                  k(  rQt        j                  j                         |       | j                  j                         }|j                  d        |S | j                         	 t        j                  j                         j                         t        j"                  t$              }|j'                  j                         |       fd}| j)                  ||      S # t        $ r?}|j                  t        j                  k7  r j!                         d   dk(  r Y d }~d }~ww xY w)Nr   r   c                     |j                          j                  t        j                  t        j
                  d       S rW   )r   r,  r	  r-  rf   SO_UPDATE_CONNECT_CONTEXT)r   r  r    r  s      r"   finish_connectz,IocpProactor.connect.<locals>.finish_connectQ  s1    LLNOOF--'AA1FKr#   )typer	  
SOCK_DGRAMrf   
WSAConnectr   r7   r   rE   r  	BindLocalr7  r6   rh   errno	WSAEINVALgetsocknamer  r   	ConnectExr  )r   r  r+   rb   er    r?  s    `     r"   connectzIocpProactor.connect;  s    99))) ""4;;=':****,CNN4 J  &	!!$++-= ##D)
T[[]G,	 ~~b$77!  	zzU__,!!$) *		s   .D 	E	
5EE	c           	      6   | j                  |       t        j                  t              }|dz  }|dz	  dz  }|j	                  |j                         t        j                  |j                               |||dd       | j                  ||| j                        S )Nl        r   )
r  rf   r  r   TransmitFiler   msvcrtget_osfhandler  r  )r   sockfileoffsetcountr    
offset_lowoffset_highs           r"   sendfilezIocpProactor.sendfileZ  s      &##D)k)
|{2
,,T[[];"Kq!	%
 ~~b$(?(?@@r#   c                     | j                         t        j                  t              }|j	                  j                               }|r| j                        S fd}| j                  ||      S )Nc                 (    |j                          S rA   )r   )r   r  r    r   s      r"   finish_accept_pipez4IocpProactor.accept_pipe.<locals>.finish_accept_pipeq  s    LLNKr#   )r  rf   r  r   ConnectNamedPiper   r   r  )r   r   r    	connectedrX  s    `   r"   r   zIocpProactor.accept_pipef  sf      &##D)''6	 <<%%	 ~~b$(:;;r#   c                 <  K   t         }	 	 t        j                  |      }	 t        j                  |      S # t        $ r(}|j                  t        j
                  k7  r Y d }~nd }~ww xY wt        |dz  t              }t        j                  |       d {  7   w)N   )CONNECT_PIPE_INIT_DELAYrf   ConnectPiper6   rh   ERROR_PIPE_BUSYminCONNECT_PIPE_MAX_DELAYr   sleepr   r   )r   r+   delayrT   r9   s        r"   r   zIocpProactor.connect_pipew  s     '$009 ''//  <<;#>#>> ?
 	#9:E++e$$$ s6   B6 B	A'A"B"A''.BBBc                 (    | j                  ||d      S )zWait 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   rT   r   s      r"   wait_for_handlezIocpProactor.wait_for_handle  s     $$VWe<<r#   c                 :    | j                  |d d      }||_        |S r   )re  rr   )r   rs   done_callbackrb   s       r"   r   zIocpProactor._wait_cancel  s%    ##E46 +
r#   c                    | j                          |t        j                  }nt        j                  |dz        }t        j                  t              }t        j                  || j                  |j                  |      }|rt        |||| j                        nt        |||| | j                        j                  rj                  d= fd}|d|f| j                  |j                  <   S )N     @@r   r   c                 $    j                         S rA   )r\   )r   r  r    r   s      r"   finish_wait_for_handlez=IocpProactor._wait_for_handle.<locals>.finish_wait_for_handle  s     779r#   r   )r   rX   INFINITEmathceilrf   r  r   RegisterWaitWithQueuer   r+   rp   r7   ry   r   r   )	r   rT   r   
_is_cancelmsr    rU   rl  r   s	           @r"   re  zIocpProactor._wait_for_handle  s    ?!!B 7S=)B ##D)!77DJJ

B0!"fk

KA!"fk4'+zz3A##B'	 $%b!-C"DBJJr#   c                     || j                   vrL| j                   j                  |       t        j                  |j	                         | j
                  dd       y y rW   )rS   r   rf   r   r   r   r   objs     r"   r  z IocpProactor._register_with_iocp  sI     d&&&  %..szz|TZZAN 'r#   c                 ^   | j                          t        || j                        }|j                  r|j                  d= |j                  s	  |d d |      }|j                  |       ||||f| j                  |j                  <   |S # t        $ r}|j                  |       Y d }~>d }~ww xY wr   )
r   r   r7   r   r%   rE   r6   rB   r   r+   )r   r    ru  callbackr   r   rH  s          r"   r  zIocpProactor._register  s    
 btzz2##B'zz
$ tR0 U# $%b#x"8BJJ  #""#s   
B 	B,B''B,c                 Z    | j                          | j                  j                  |       y)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    s     r"   r   zIocpProactor._unregister  s$     	!!"%r#   c                 R    t        j                   |      }|j                  d       |S rW   )r	  r/  )r   r7  ss      r"   r6  zIocpProactor._get_accept_socket  s     MM&!	Qr#   c           	      "   |t         }n<|dk  rt        d      t        j                  |dz        }|t         k\  rt        d      	 t	        j
                  | j                  |      }|nd}|\  }}}}	 | j                  j                  |      \  }}	}
}|
| j                   v r|j#                          nI|j%                         s9	  ||||	      }|j'                  |       | j(                  j+                  |       d }| j0                  D ](  }	| j                  j                  |	j2                  d        * | j0                  j5                          y # t        $ rl | j                  j                         r%| j                  j                  dd||||fz  d       |dt        j                  fvrt        j                  |       Y }w xY w# t,        $ r7}|j/                  |       | j(                  j+                  |       Y d }~d }~ww xY w# d }w xY w)Nr   znegative timeoutrj  ztimeout too bigz8GetQueuedCompletionStatus() returned an unexpected eventz)err=%s transferred=%s key=%#x address=%#x)r1   status)rm  
ValueErrorrn  ro  rf   GetQueuedCompletionStatusr   r   popKeyErrorr7   	get_debugr8   r   rX   r   r   r5   donerE   r   r`   r6   rB   r   r+   r   )r   r   rr  r|  errtransferredr  r+   r   r    ru  rw  r   rH  s                 r"   r\   zIocpProactor._poll  s   ?Bq[/00 7S=)BX~ !233 ::4::rJF~B-3*Cc7'+{{w'?$2sH  d+++
 VVX	$[#r:E
 LL'MM((+AM R $$ 	.BKKOOBJJ-	.  "E  ::'')JJ55%7#N&);W%E$F7  q+"B"BCC'',,  ,OOA&MM((++, AsC   4 E 
G ,H
 A1GG	H,H<H
 HH
 
Hc                 :    | j                   j                  |       y rA   )r   r   rt  s     r"   _stop_servingzIocpProactor._stop_serving-  s     	!!#&r#   c                 4   | j                   y t        | j                  j                               D ]:  \  }}}}|j	                         rt        |t              r*	 |j                          < d}t        j                         }||z   }	| j                  rx|	t        j                         k  rCt        j                  d| t        j                         |z
         t        j                         |z   }	| j!                  |       | j                  rxg | _        t%        j&                  | j                          d | _         y # t        $ rS}| j                  <d||d}|j                  r|j                  |d<   | j                  j                  |       Y d }~ad }~ww xY w)NzCancelling a future failedr0   r4   g      ?z,%r is running after closing for %.1f seconds)r   listr   values	cancelledr  rp   r5   r6   r7   r   r8   time	monotonicr   debugr\   r   rX   r   )
r   rb   r    ru  rw  r9   r:   
msg_update
start_timenext_msgs
             r"   r   zIocpProactor.close3  sa   :: '+4;;+=+=+?&@ 	C"CS(}}C!23CJJL	C0 
^^%

*kk4>>++K!4>>#3j#@B>>+j8 JJz" kk DJJ'
;  	Czz-'C),&)#
 00:=:O:OG$67

99'B	Cs   D;;	FAFFc                 $    | j                          y rA   )r   r[   s    r"   r   zIocpProactor.__del__b  s    

r#   rA   )r   r  )#rH   rI   rJ   rK   rm  r   r   r   r   r   r   staticmethodr  r  r  r  r   r#  r'  r;  rI  rU  r   r   rf  r   re  r  r  r   r6  r\   r  r   r   r   r#   r"   r   r     s    -#+ 29E	
  AAA5(AA88>
A<"0&= DO@&
7#r'-^r#   r   c                       e Zd Zd Zy)r   c           	           t        j                  |f|||||d| _         fd} j                  j                  j                  t         j                  j                              }	|	j                  |       y )N)r   r   r   r   r   c                 \    j                   j                         }j                  |       y rA   )_procpoll_process_exited)r   
returncoder   s     r"   rw  z4_WindowsSubprocessTransport._start.<locals>.callbackm  s!    *J  ,r#   )	r   Popenr  r7   r{   rf  intrQ   r   )
r   r   r   r   r   r   r   r   rw  r   s
   `         r"   _startz"_WindowsSubprocessTransport._starth  so    "(('U6&'%'
	- JJ  00TZZ5G5G1HI	H%r#   N)rH   rI   rJ   r  r   r#   r"   r   r   f  s    
&r#   r   c                       e Zd ZeZy)r   N)rH   rI   rJ   r   _loop_factoryr   r#   r"   r   r   x      %Mr#   r   c                       e Zd ZeZy)r   N)rH   rI   rJ   r   r  r   r#   r"   r   r   |  r  r#   r   )2rK   sysplatformImportErrorrf   rX   rD  rn  rM  r	  r*  r  r    r   r   r   r   r	   r
   r   r   logr   __all__r   rm  ERROR_CONNECTION_REFUSEDERROR_CONNECTION_ABORTEDr]  ra  Futurer   rO   rp   ry   objectr   BaseSelectorEventLoopr   BaseProactorEventLoopr   r   BaseSubprocessTransportr   r   BaseDefaultEventLoopPolicyr   r   r   r   r#   r"   <module>r     sY   4 
<<7
l
##                   ||       - -`G#GNN G#T&- &01P- 1Ph8 8v2 E E 2g== gTD DN&/"I"I & . &V%F%F &&V%F%F & 8 r#   