
    RhK                        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m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j6                  Zej8                  ZdZdZdZdZ  G d dejB                        Z" G d dejB                        Z# G d de#      Z$ G d de#      Z% G d de&      Z' G d d ejP                        Z) G d! d"ejT                        Z+ G d# d$      Z, G d% d&ejZ                        Z.e)Z/ G d' d(ej`                        Z1 G d) d*ej`                        Z2e2Z3y)+z.Selector and proactor event loops for Windows.    Nwin32z
win32 only)partial   )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      -/usr/lib/python3.12/asyncio/windows_events.pyr   z_OverlappedFuture.__init__7   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_overlappedD   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   r6   r    r?   r"   s     r#   r6   z_OverlappedFuture.cancelT   s     !w~#~&&r$   c                 D    t         |   |       | j                          y N)r   set_exceptionr<   r    r3   r"   s     r#   rC   z_OverlappedFuture.set_exceptionX   s    i(!r$   c                 2    t         |   |       d | _        y rB   )r   
set_resultr   r    resultr"   s     r#   rF   z_OverlappedFuture.set_result\   s    6"r$   rB   )__name__
__module____qualname____doc__r   r*   r<   r6   rC   rF   __classcell__r"   s   @r#   r   r   1   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__d   sL    d#!!&&r* '  r$   c                 d    t        j                  | j                  d      t         j                  k(  S Nr   )_winapiWaitForSingleObjectrR   WAIT_OBJECT_0r    s    r#   _pollz_BaseWaitHandleFuture._pollr   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*   appendrR   r]   rS   r-   s      r#   r*   z _BaseWaitHandleFuture._repr_infow   s|    w!#gdll2./0<<#"&**,JIEKK(KK,t'8'8&<=>r$   c                     d | _         y rB   )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 handler1   r5   )rT   rS   _overlappedUnregisterWaitr7   winerrorERROR_IO_PENDINGr   r8   r9   rd   r    rV   r:   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>   )rl   r   r6   r@   s     r#   r6   z_BaseWaitHandleFuture.cancel   s     w~#~&&r$   c                 D    | j                          t        | 	  |       y rB   )rl   r   rC   rD   s     r#   rC   z#_BaseWaitHandleFuture.set_exception   s    i(r$   c                 D    | j                          t        | 	  |       y rB   )rl   r   rF   rG   s     r#   rF   z _BaseWaitHandleFuture.set_result   s    6"r$   rB   )rI   rJ   rK   rL   r   r]   r*   rd   rl   r6   rC   rF   rM   rN   s   @r#   rP   rP   a   s6    <8<  '

'0')# #r$   rP   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!   eventrV   r   r"   s        r#   r   z_WaitCancelFuture.__init__   s!    UKd;"r$   c                     t        d      )Nz'_WaitCancelFuture must not be cancelled)RuntimeErrorr\   s    r#   r6   z_WaitCancelFuture.cancel   s    DEEr$   c                 `    t         |   |       | j                  | j                  |        y y rB   )r   rF   rs   rG   s     r#   rF   z_WaitCancelFuture.set_result   s/    6"*% +r$   c                 `    t         |   |       | j                  | j                  |        y y rB   )r   rC   rs   rD   s     r#   rC   z_WaitCancelFuture.set_exception   s/    i(*% +r$   )	rI   rJ   rK   rL   r   r6   rF   rC   rM   rN   s   @r#   rq   rq      s'     8< #
F&
& &r$   rq   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_proactorrg   CreateEvent_event
_event_fut)r    r!   rU   rV   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 rB   )	r   rY   CloseHandler   r|   _unregisterr   r   rd   )r    rc   r"   s     r#   rd   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rf   )rT   rS   rg   UnregisterWaitExr   r7   ri   rj   r   r8   r9   r|   _wait_cancelrd   r   rk   s       r#   rl   z"_WaitHandleFuture._unregister_wait   s     '' 	((dkkB ..55dkk6:6N6NP  
	||{;;;E!$"
 ))262H2HG./

11': <
	s    A? ?	C0AC++C0)rI   rJ   rK   r   rd   rl   rM   rN   s   @r#   rz   rz      s    BF )$Pr$   rz   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 rB   )closedrY   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 rB   )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 rB   )r   r6   r   r   closer   clear)r    r   s     r#   r   zPipeServer.close#  su    ##/$$++-'+D$==$,, 

DJ DM  &&( %r$   N)
rI   rJ   rK   rL   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)rI   rJ   rK   rL   r   r$   r#   r   r   2  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 rB   )r   r   r   )r    r   r"   s     r#   r   zProactorEventLoop.__init__9  s    #~H"r$   c                 4   	 | j                   J | j                  | j                         t        |           | j                   a| j                   j
                  }| j                   j                          |'|j                  s| j                  j                  |       d | _         y y # | j                   a| j                   j
                  }| j                   j                          |'|j                  s| j                  j                  |       d | _         w w xY wrB   )
_self_reading_future	call_soon_loop_self_readingr   run_foreverr   r6   r&   r|   r   )r    r!   r"   s     r#   r   zProactorEventLoop.run_forever>  s    	1,,4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/D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_connectionQ  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)r2   r3   r   zAccept pipe failed on pipe %rT)exc_info)rH   r   discardr   r   r   r   r|   accept_piper   add_done_callbackBrokenPipeErrorfilenor   r7   r9   _debugr   warningr	   CancelledError)	r   r   r   r:   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"rB   )r   r   )r    r   r,   r   r   s   ```@@r#   start_serving_pipez$ProactorEventLoop.start_serving_pipeY  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>rB   )
rI   rJ   rK   rL   r   r   r   r   r   rM   rN   s   @r#   r   r   6  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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 rX   )r8   _resultsrg   CreateIoCompletionPortINVALID_HANDLE_VALUEr   _iocp_cacher   r   rT   _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   rv   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   ra   r"   rI   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 rB   )r8   )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rB   )r   r]   )r    timeoutr   s      r#   selectzIocpProactor.select  s:    }}JJwmm	 C$Cs   6 :c                 \    | j                   j                         }|j                  |       |S rB   )r8   r   rF   )r    valuerc   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rB   )	getresultr7   ri   rg   ERROR_NETNAME_DELETEDERROR_OPERATION_ABORTEDConnectionResetErrorr   )r   keyr!   r:   s       r#   finish_socket_funczIocpProactor.finish_socket_func  sY    	<<>! 	|| A A + C C E E*CHH55	s    	A?AAc                    	 | j                  |||      S # t        $ r,}|j                  t        j                  k(  r	|d fcY d }~S  d }~ww xY wrB   )r  r7   ri   rg   ERROR_PORT_UNREACHABLE)clsr   r  r!   empty_resultr:   s         r#   _finish_recvfromzIocpProactor._finish_recvfrom  sN    	))%b99 	 ||{AAA#T))	s    	A
 A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_iocprg   
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rX   )r	  rg   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                  ||t        | j                  d            S # t        $ r | j                  d      cY S w xY w)N)r$   Nr$   r  )r	  rg   r
  r   WSARecvFromr   r   r   r  r   r  r  s        r#   recvfromzIocpProactor.recvfrom  s      &##D)	-NN4;;=&%8 ~~b$0E0E=@)B C 	C  	-<<,,	-   !A5 5BBc                 *   | j                  |       t        j                  t              }	 |j	                  |j                         ||       | j                  ||t        | j                  d            S # t        $ r | j                  d      cY S w xY w)Nr   Nr   r  )r	  rg   r
  r   WSARecvFromIntor   r   r   r  r   r  r  s        r#   recvfrom_intozIocpProactor.recvfrom_into  s      &##D)	+t{{}c59 ~~b$0E0E=>)@ A 	A  	+<<	**	+r  c                     | j                  |       t        j                  t              }|j	                  |j                         |||       | j                  ||| j                        S rB   )r	  rg   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 rB   )r	  rg   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_SOCKETrg   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rB   )r	   r   r   )r4   r  s     r#   accept_coroz(IocpProactor.accept.<locals>.accept_coro3  s2     ,, 

s    9  9 %69r   )r	  _get_accept_socketfamilyrg   r
  r   AcceptExr   r  r   ensure_futurer8   )r    r5  r!   r6  r8  r4   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 rX   )r   r/  r  r0  rg   SO_UPDATE_CONNECT_CONTEXT)r   r  r!   r  s      r#   finish_connectz,IocpProactor.connect.<locals>.finish_connectV  s1    LLNOOF--'AA1FKr$   )typer  
SOCK_DGRAMrg   
WSAConnectr   r8   r   rF   r	  	BindLocalr:  r7   ri   errno	WSAEINVALgetsocknamer
  r   	ConnectExr  )r    r  r,   rc   er!   rB  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	  rg   r
  r   TransmitFiler   msvcrtget_osfhandler  r  )r    sockfileoffsetcountr!   
offset_lowoffset_highs           r#   sendfilezIocpProactor.sendfile_  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 rB   )r   )r   r  r!   r   s      r#   finish_accept_pipez4IocpProactor.accept_pipe.<locals>.finish_accept_pipev  s    LLNKr$   )r	  rg   r
  r   ConnectNamedPiper   r   r  )r    r   r!   	connectedr[  s    `   r#   r   zIocpProactor.accept_pipek  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_DELAYrg   ConnectPiper7   ri   ERROR_PIPE_BUSYminCONNECT_PIPE_MAX_DELAYr   sleepr   r   )r    r,   delayrU   r:   s        r#   r   zIocpProactor.connect_pipe|  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    rU   r   s      r#   wait_for_handlezIocpProactor.wait_for_handle  s     $$VWe<<r$   c                 :    | j                  |d d      }||_        |S r   )rh  rs   )r    rt   done_callbackrc   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 rB   )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   rY   INFINITEmathceilrg   r
  r   RegisterWaitWithQueuer   r,   rq   r8   rz   r   r   )	r    rU   r   
_is_cancelmsr!   rV   ro  r   s	           @r#   rh  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 rX   )rT   r   rg   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   r8   r   r&   rF   r7   rC   r   r,   )r    r!   rx  callbackr   r   rK  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   ra   )r    r!   s     r#   r   zIocpProactor._unregister  s$     	!!"%r$   c                 R    t        j                   |      }|j                  d       |S rX   )r  r2  )r    r:  ss      r#   r9  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 timeoutrm  ztimeout too bigz8GetQueuedCompletionStatus() returned an unexpected eventz)err=%s transferred=%s key=%#x address=%#x)r2   status)rp  
ValueErrorrq  rr  rg   GetQueuedCompletionStatusr   r   popKeyErrorr8   	get_debugr9   r   rY   r   r   r6   donerF   r   ra   r7   rC   r   r,   r   )r    r   ru  r  errtransferredr  r,   r   r!   rx  rz  r   rK  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 rB   )r   r   rw  s     r#   _stop_servingzIocpProactor._stop_serving2  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 failedr1   r5   g      ?z,%r is running after closing for %.1f seconds)r   listr   values	cancelledr  rq   r6   r7   r8   r   r9   time	monotonicr   debugr]   r   rY   r   )
r    rc   r!   rx  rz  r:   r;   
msg_update
start_timenext_msgs
             r#   r   zIocpProactor.close8  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 rB   )r   r\   s    r#   r   zIocpProactor.__del__g  s    

r$   rB   )r   r!  )%rI   rJ   rK   rL   rp  r   r   r   r   r   r   staticmethodr  classmethodr  r  r  r  r#  r&  r*  r>  rL  rX  r   r   ri  r   rh  r	  r  r   r9  r]   r  r   r   r   r$   r#   r   r     s    -#+ 29E	
   	 	AA	C	A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 rB   )_procpoll_process_exited)r   
returncoder    s     r#   rz  z4_WindowsSubprocessTransport._start.<locals>.callbackr  s!    *J  ,r$   )	r   Popenr  r8   r|   ri  intrR   r   )
r    r   r   r   r   r   r   r   rz  r   s
   `         r#   _startz"_WindowsSubprocessTransport._startm  so    "(('U6&'%'
	- JJ  00TZZ5G5G1HI	H%r$   N)rI   rJ   rK   r  r   r$   r#   r   r   k  s    
&r$   r   c                       e Zd ZeZy)r   N)rI   rJ   rK   r   _loop_factoryr   r$   r#   r   r   }      %Mr$   r   c                       e Zd ZeZy)r   N)rI   rJ   rK   r   r  r   r$   r#   r   r     r  r$   r   )4rL   sysplatformImportErrorrg   rY   rG  	functoolsr   rq  rP  r  r-  r  r    r   r   r   r	   r
   r   r   r   logr   __all__r   rp  ERROR_CONNECTION_REFUSEDERROR_CONNECTION_ABORTEDr`  rd  Futurer   rP   rq   rz   objectr   BaseSelectorEventLoopr   BaseProactorEventLoopr   r   BaseSubprocessTransportr   r   BaseDefaultEventLoopPolicyr   r   r   r   r$   r#   <module>r     s\   4 
<<7
l
##                    ||       - -`G#GNN G#T&- &01P- 1Ph8 8v2 E E 2g== gTH HV&/"I"I & . &V%F%F &&V%F%F & 8 r$   