
    dA                        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ej        Zej        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j&                  Z' G d  d!ej(                  Z) G d" d#          Z* G d$ d%ej+                  Z,e'Z- G d& d'ej.                  Z/ G 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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                x    t                                          |           | j        r| j        d= || _        d S Nr   )super__init___source_traceback_ov)selfovr   	__class__s      (lib/python3.11/asyncio/windows_events.pyr   z_OverlappedFuture.__init__6   s?    d###! 	+&r*    c                     t                                                      }| j        8| 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!   s      r"   r)   z_OverlappedFuture._repr_info<   sh    ww!!##8!%!1BII{EKKI%II483CIIIIJJJr#   c                     | j         d S 	 | j                                          nH# t          $ r;}d|| d}| j        r
| j        |d<   | j                            |           Y d }~nd }~ww xY wd | _         d S )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    8F
	7HOO 	7 	7 	7C  G
 % E.2.D*+J--g66666666	7 s   % 
A*1A%%A*c                 p    |                                   t                                          |          S N)msg)r;   r   r5   r   r>   r!   s     r"   r5   z_OverlappedFuture.cancelS   s-    !!!ww~~#~&&&r#   c                 r    t                                          |           |                                  d S N)r   set_exceptionr;   r   r2   r!   s     r"   rB   z_OverlappedFuture.set_exceptionW   s3    i(((!!!!!r#   c                 X    t                                          |           d | _        d S 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   s         
 $(              ' ' ' ' ' '" " " " "        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| _        d S )Nr   r   T)r   r   r   r   _handle_wait_handle_registered)r   r    handlewait_handler   r!   s        r"   r   z_BaseWaitHandleFuture.__init__c   s\    d###! 	+&r* '  r#   c                 R    t          j        | j        d          t           j        k    S Nr   )_winapiWaitForSingleObjectrQ   WAIT_OBJECT_0r   s    r"   _pollz_BaseWaitHandleFuture._pollq   s$    +DL!<<%& 	'r#   c                 6   t                                                      }|                    d| j        d           | j        -|                                 rdnd}|                    |           | 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    ww!!##/dl///000<#"&**,,=JJIEKK(KK=t'8===>>>r#   c                     d | _         d S rA   )r   )r   futs     r"   _unregister_wait_cbz)_BaseWaitHandleFuture._unregister_wait_cb   s     r#   c                 ^   | j         sd S d| _         | j        }d | _        	 t          j        |           nc# t          $ rV}|j        t          j        k    r7d|| d}| j        r
| j        |d<   | j        	                    |           Y d }~d S Y d }~nd }~ww xY w| 
                    d            d S 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     	F ' 	&{3333 
	 
	 
	|{;;;E!$" 
 ) I262HG./
11'::: <;;;;
	 	  &&&&&s   5 
BABBc                 p    |                                   t                                          |          S r=   )rk   r   r5   r?   s     r"   r5   z_BaseWaitHandleFuture.cancel   s-    ww~~#~&&&r#   c                 r    |                                   t                                          |           d S rA   )rk   r   rB   rC   s     r"   rB   z#_BaseWaitHandleFuture.set_exception   s3    i(((((r#   c                 r    |                                   t                                          |           d S rA   )rk   r   rE   rF   s     r"   rE   z _BaseWaitHandleFuture.set_result   s3    6"""""r#   rA   )rH   rI   rJ   rK   r   r\   r)   rc   rk   r5   rB   rE   rL   rM   s   @r"   rO   rO   `   s        <<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 | _        d S )Nr   )r   r   _done_callback)r   r    eventrU   r   r!   s        r"   r   z_WaitCancelFuture.__init__   s2    UKd;;;"r#   c                      t          d          )Nz'_WaitCancelFuture must not be cancelled)RuntimeErrorr[   s    r"   r5   z_WaitCancelFuture.cancel   s    DEEEr#   c                     t                                          |           | j        |                     |            d S d S rA   )r   rE   rr   rF   s     r"   rE   z_WaitCancelFuture.set_result   sF    6"""*%%%%% +*r#   c                     t                                          |           | j        |                     |            d S d S rA   )r   rB   rr   rC   s     r"   rB   z_WaitCancelFuture.set_exception   sF    i(((*%%%%% +*r#   )	rH   rI   rJ   rK   r   r5   rE   rB   rL   rM   s   @r"   rp   rp      s          8< # # # # # # #
F F 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 | _        d S )Nr   TF)r   r   	_proactor_unregister_proactorrf   CreateEvent_event
_event_fut)r   r    rT   rU   proactorr   r!   s         r"   r   z_WaitHandleFuture.__init__   sV    V[t<<<!$(!!-dD%FFr#   c                     | j         't          j        | j                    d | _         d | _        | j                            | j                   d | _        t                                          |           d S rA   )	r~   rX   CloseHandler   r{   _unregisterr   r   rc   )r   rb   r!   s     r"   rc   z%_WaitHandleFuture._unregister_wait_cb   sk    ;",,,DK"DO 	""48,,,##C(((((r#   c                    | j         sd S d| _         | j        }d | _        	 t          j        || j                   nc# t
          $ rV}|j        t          j        k    r7d|| d}| j        r
| j        |d<   | j	        
                    |           Y d }~d S Y d }~nd }~ww xY w| j                            | j        | j                  | _        d S re   )rS   rR   rf   UnregisterWaitExr~   r6   rh   ri   r   r7   r8   r{   _wait_cancelrc   r   rj   s       r"   rk   z"_WaitHandleFuture._unregister_wait   s    	F ' 	(dkBBBB 
	 
	 
	|{;;;E!$" 
 ) I262HG./
11'::: <;;;;
	 .55dk6:6NP Ps   ; 
BABB)rH   rI   rJ   r   rc   rk   rL   rM   s   @r"   ry   ry      st        BF       ) ) ) ) )$P P P P P P Pr#   ry   c                   4    e Zd ZdZd Zd Zd Zd Zd ZeZ	dS )
PipeServerzXClass representing a pipe server.

    This is much like a bound, listening socket.
    c                     || _         t          j                    | _        d | _        d | _        |                     d          | _        d S NT)_addressweakrefWeakSet_free_instances_pipe_accept_pipe_future_server_pipe_handle)r   r+   s     r"   r   zPipeServer.__init__   sC    &00 
#' --d33


r#   c                 J    | j         |                     d          c}| _         |S )NF)r   r   )r   tmps     r"   _get_unconnected_pipez PipeServer._get_unconnected_pipe  s&    
 *d&>&>u&E&ETZ
r#   c           
         |                                  rd S 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                            |           |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    ;;== 	4*W-II 	;W::E#M5%(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                                          d | _         | j        G| j        D ]}|                                 d | _        d | _        | j                                         d S d S rA   )r   r5   r   r   closer   clear)r   r   s     r"   r   zPipeServer.close"  s    #/$++---'+D$=$,  

DJ DM &&((((( %$r#   N)
rH   rI   rJ   rK   r   r   r   r   r   __del__ r#   r"   r   r      sj         4 4 4    $' ' '
) 
) 
) GGGr#   r   c                       e Zd ZdZdS )_WindowsSelectorEventLoopz'Windows version of selector event loop.N)rH   rI   rJ   rK   r   r#   r"   r   r   1  s        111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.Nc                 j    |t                      }t                                          |           d S rA   )r   r   r   )r   r   r!   s     r"   r   zProactorEventLoop.__init__8  s0    #~~H"""""r#   c                    	 | j         J |                     | j                   t                                                       | j         J| j         j        }| j                                          || j                            |           d | _         d S d S # | j         H| j         j        }| j                                          || j                            |           d | _         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4NN42333GG!!!(4.2)00222 >N..r222,0))) 54t(4.2)00222 >N..r222,0)0000s   AB AC*c                    K   | j                             |          }| d {V } |            }|                     ||d|i          }||fS )Naddrextra)r{   connect_pipe_make_duplex_pipe_transport)r   protocol_factoryr+   fr   protocoltranss          r"   create_pipe_connectionz(ProactorEventLoop.create_pipe_connectionP  sl      N''00wwwwww##%%00x8>7H 1 J Jhr#   c                 r    K   t                    d fd	                                gS )Nc                    d }	 | r||                                  }j                            |                                           r|                                 d S              }                    ||di                                           }|d S j                            |          } | _	        | 
                               d S # t          $ rG |r,|                                dk    r|                                                                Y d S t          $ r}|rF|                                dk    r.                    d||d           |                                 nj        rt#          j        d|d                                          Y d }~d S d }~wt&          j        $ r |r|                                 Y d S Y d S 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[  sJ   D)6 A88::D*224888}}  

//11H44hvw.? 5 A A A 3355<FN..t44* ./*##$455555+ # 1 1 1 !DKKMMR//JJLLL/000000 1 1 1 	8DKKMMR////#7%( $1 1   
 JJLLLL[ 8N#B#'$8 8 8 8/000000000, ! ! ! !JJLLLLLL! ! !!s2   AC :C C AG#	G,A;F--(GGrA   )r   r   )r   r   r+   r   r   s   ```@@r"   start_serving_pipez$ProactorEventLoop.start_serving_pipeX  sg      G$$+	6 +	6 +	6 +	6 +	6 +	6 +	6 +	6 +	6 +	6Z 	'(((xr#   c	           
        K   |                                  }
t          | |||||||f|
|d|	}	 |
 d {V  nN# t          t          f$ r  t          $ r0 |                                 |                                 d {V   w xY w|S )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 7 067 7	LLLLLLLL-. 	 	 	 	 	 	LLNNN,,..       	
 s
   8 ABrA   )
rH   rI   rJ   rK   r   r   r   r   r   rL   rM   s   @r"   r   r   5  s        <<# # # # # #
1 1 1 1 1&  1 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
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 dS )#r   z#Proactor implementation using IOCP.c                     d | _         g | _        t          j        t          j        t
          d|          | _        i | _        t          j	                    | _
        g | _        t          j	                    | _        d S rW   )r7   _resultsrf   CreateIoCompletionPortINVALID_HANDLE_VALUEr   _iocp_cacher   r   rS   _unregistered_stopped_serving)r   concurrencys     r"   r   zIocpProactor.__init__  sg    
 7,dA{D D
"?,, ' 1 1r#   c                 2    | j         t          d          d S )NzIocpProactor is closed)r   ru   r[   s    r"   _check_closedzIocpProactor._check_closed  s!    :7888 r#   c                     dt          | j                  z  dt          | j                  z  g}| j        |                    d           d| j        j        dd                    |          dS )Nzoverlapped#=%sz
result#=%sr   < r(   )lenr   r   r   r`   r!   rH   join)r   r-   s     r"   __repr__zIocpProactor.__repr__  sl     3t{#3#33s4=1113:KK!!! N333SXXd^^^^DDr#   c                     || _         d S rA   )r7   )r   r   s     r"   set_loopzIocpProactor.set_loop  s    


r#   Nc                 n    | j         s|                     |           | j         }g | _         	 |d }S # d }w xY wrA   )r   r\   )r   timeoutr   s      r"   selectzIocpProactor.select  sJ    } 	 JJwm	 CC$CJJJJs   0 4c                 b    | j                                         }|                    |           |S rA   )r7   r   rE   )r   valuerb   s      r"   _resultzIocpProactor._result  s,    j&&((u
r#   r   c                    |                      |           t          j        t                    }	 t	          |t
          j                  r*|                    |                                ||           n(|                    |                                |           n%# t          $ r | 
                    d          cY S w xY wd }|                     |||          S )Nr#   c                     	 |                                 S # t          $ r3}|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_recvz&IocpProactor.recv.<locals>.finish_recv  f    ||~~%   <K$E$/$G$I I I.99    
A.AA)_register_with_iocprf   
Overlappedr   
isinstancesocketWSARecvr   ReadFiler   r   	_registerr   connnbytesr   r    r  s         r"   recvzIocpProactor.recv  s      &&&#D))	%$.. 3

4;;==&%8888DKKMM6222 	% 	% 	%<<$$$$$	%	 	 	 ~~b$444   A,B B?>B?c                    |                      |           t          j        t                    }	 t	          |t
          j                  r*|                    |                                ||           n(|                    |                                |           n%# t          $ r | 
                    d          cY S w xY wd }|                     |||          S )Nr   c                     	 |                                 S # t          $ r3}|j        t          j        t          j        fv rt          |j          d }~ww xY wrA   r   r  s       r"   r  z+IocpProactor.recv_into.<locals>.finish_recv  r  r  )r  rf   r  r   r	  r
  WSARecvIntor   ReadFileIntor   r   r  r   r  bufr   r    r  s         r"   	recv_intozIocpProactor.recv_into  s      &&&#D))	#$.. 4t{{}}c59999s333 	# 	# 	#<<??"""	#	 	 	 ~~b$444r  c                 2   |                      |           t          j        t                    }	 |                    |                                ||           n%# t          $ r |                     d          cY S w xY wd }|                     |||          S )N)r#   Nc                     	 |                                 S # t          $ r3}|j        t          j        t          j        fv rt          |j          d }~ww xY wrA   r   r  s       r"   r  z*IocpProactor.recvfrom.<locals>.finish_recv   r  r  )	r  rf   r  r   WSARecvFromr   r   r   r  r  s         r"   recvfromzIocpProactor.recvfrom  s      &&&#D))	-NN4;;==&%8888 	- 	- 	-<<,,,,,	-	 	 	 ~~b$444   )A A<;A<c                 2   |                      |           t          j        t                    }	 |                    |                                ||           n%# t          $ r |                     d          cY S w xY wd }|                     |||          S )Nr   Nc                     	 |                                 S # t          $ r3}|j        t          j        t          j        fv rt          |j          d }~ww xY wrA   r   r  s       r"   r  z/IocpProactor.recvfrom_into.<locals>.finish_recv  r  r  )	r  rf   r  r   WSARecvFromIntor   r   r   r  r  s         r"   recvfrom_intozIocpProactor.recvfrom_into  s      &&&#D))	+t{{}}c59999 	+ 	+ 	+<<	*****	+	 	 	 ~~b$444r  c                     |                      |           t          j        t                    }|                    |                                |||           d }|                     |||          S )Nc                     	 |                                 S # t          $ r3}|j        t          j        t          j        fv rt          |j          d }~ww xY wrA   r   r  s       r"   finish_sendz(IocpProactor.sendto.<locals>.finish_send&  r  r  )r  rf   r  r   	WSASendTor   r  )r   r  r  r   r   r    r&  s          r"   sendtozIocpProactor.sendto   sm      &&&#D))
T[[]]C555	 	 	 ~~b$444r#   c                 j   |                      |           t          j        t                    }t	          |t
          j                  r*|                    |                                ||           n(|                    |                                |           d }| 	                    |||          S )Nc                     	 |                                 S # t          $ r3}|j        t          j        t          j        fv rt          |j          d }~ww xY wrA   r   r  s       r"   r&  z&IocpProactor.send.<locals>.finish_send:  r  r  )
r  rf   r  r   r	  r
  WSASendr   	WriteFiler  )r   r  r  r   r    r&  s         r"   sendzIocpProactor.send2  s      &&&#D))dFM** 	-JJt{{}}c51111LL,,,	 	 	 ~~b$444r#   c                    |                                 |                     j                  t          j        t
                    }|                                                                                               fd}d }|                     ||          } ||          }t          j
        || j                   |S )Nc                 J   |                                  t          j        d                                          }                    t
          j        t          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_acceptL  s    LLNNN+dHOO$5$566COOF-'@#G G GOOH//11222))++++r#   c                 l   K   	 |  d {V  d S # t           j        $ r |                                  w xY wrA   )r   r   r   )r3   r  s     r"   accept_coroz(IocpProactor.accept.<locals>.accept_coroU  sN      ,   

s    %3r   )r  _get_accept_socketfamilyrf   r  r   AcceptExr   r  r   ensure_futurer7   )r   r8  r    r9  r;  r3   coror  s    `     @r"   acceptzIocpProactor.acceptF  s      ***&&x77#D))
HOO%%t{{}}555	, 	, 	, 	, 	, 	,	 	 	 Hm<<{64((Dtz2222r#   c                    j         t          j        k    rWt          j                                        |           | j                                        }|                    d            |S | 	                               	 t          j
                                        j                   nL# t          $ r?}|j        t          j        k    r                                 d         dk    r Y d }~nd }~ww xY wt          j        t$                    }|                                                    |           fd}|                     ||          S )Nr   r   c                     |                                                      t          j        t          j        d           S rW   )r   r2  r
  r3  rf   SO_UPDATE_CONNECT_CONTEXT)r   r  r    r  s      r"   finish_connectz,IocpProactor.connect.<locals>.finish_connectx  s;    LLNNNOOF-'A1F F FKr#   )typer
  
SOCK_DGRAMrf   
WSAConnectr   r7   r   rE   r  	BindLocalr=  r6   rh   errno	WSAEINVALgetsocknamer  r   	ConnectExr  )r   r  r+   rb   er    rE  s    `     r"   connectzIocpProactor.connectb  sS   9))) "4;;==':::***,,CNN4   J  &&&	!$++--==== 	 	 	zU_,,!!!$)) *))))		 #D))
T[[]]G,,,	 	 	 	 	 ~~b$777s   ,B1 1
C:;5C55C:c           	      N   |                      |           t          j        t                    }|dz  }|dz	  dz  }|                    |                                t          j        |                                          |||dd           d }|                     |||          S )Nl        r   c                     	 |                                 S # t          $ r3}|j        t          j        t          j        fv rt          |j          d }~ww xY wrA   r   r  s       r"   finish_sendfilez.IocpProactor.sendfile.<locals>.finish_sendfile  r  r  )	r  rf   r  r   TransmitFiler   msvcrtget_osfhandler  )	r   sockfileoffsetcountr    
offset_lowoffset_highrS  s	            r"   sendfilezIocpProactor.sendfile  s      &&&#D))k)
|{2
,T[[]];;"Kq!	% 	% 	%
	 	 	 ~~b$888r#   c                    |                                 t          j        t                    }|                                                              }|r|                               S fd}|                     ||          S )Nc                 0    |                                  S rA   )r   )r   r  r    r   s      r"   finish_accept_pipez4IocpProactor.accept_pipe.<locals>.finish_accept_pipe  s    LLNNNKr#   )r  rf   r  r   ConnectNamedPiper   r   r  )r   r   r    	connectedr`  s    `   r"   r   zIocpProactor.accept_pipe  s      &&&#D))''66	 	& <<%%%	 	 	 	 	 ~~b$(:;;;r#   c                 *  K   t           }	 	 t          j        |          }n`# t          $ r }|j        t          j        k    r Y d }~nd }~ww xY wt          |dz  t                    }t          j	        |           d {V  vt          j        |          S )NT   )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_pipe  s      '	%$099   <;#>>> ?>>>>
 	#9::E+e$$$$$$$$$	% '///s   ! 
AAAc                 0    |                      ||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                 B    |                      |d d          }||_        |S r   )rm  rr   )r   rs   done_callbackrb   s       r"   r   zIocpProactor._wait_cancel  s(    ##E466 +
r#   c                    |                                   |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                 ,                                     S rA   )r\   )r   r  r    r   s      r"   finish_wait_for_handlez=IocpProactor._wait_for_handle.<locals>.finish_wait_for_handle  s     7799r#   r   )r   rX   INFINITEmathceilrf   r  r   RegisterWaitWithQueuer   r+   rp   r7   ry   r   r   )	r   rT   r   
_is_cancelmsr    rU   rt  r   s	           @r"   rm  zIocpProactor._wait_for_handle  s    ?!BB 7S=))B #D))!7DJ
B0 0 	3!"fk
KKKAA!"fk4'+z3 3 3A 	(#B'	 	 	 	 	 $%b!-C"DBJr#   c                     || j         vrJ| j                             |           t          j        |                                | j        dd           d S d S rW   )rS   r   rf   r   r   r   r   objs     r"   r  z IocpProactor._register_with_iocp  sX     d&&&  %%%.szz||TZANNNNN '&r#   c                 L   |                                   t          || j                  }|j        r|j        d= |j        sP	  |d d |          }|                    |           n,# t          $ r}|                    |           Y d }~nd }~ww xY w||||f| j        |j	        <   |S r   )
r   r   r7   r   r%   rE   r6   rB   r   r+   )r   r    r}  callbackr   r   rN  s          r"   r  zIocpProactor._register  s    
 btz222 	(#B'z 
	$
$ tR00 U####  # # #""""""""# $%b#x"8BJs   A% %
B/B		Bc                 b    |                                   | 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   r`   )r   r    s     r"   r   zIocpProactor._unregister  s3     	!!"%%%%%r#   c                 X    t          j         |          }|                    d           |S rW   )r
  r5  )r   r=  ss      r"   r<  zIocpProactor._get_accept_socket  s%    M&!!	Qr#   c           	      $   |t           }nF|dk     rt          d          t          j        |dz            }|t           k    rt          d          	 t	          j        | j        |          }|n]d}|\  }}}}	 | j                            |          \  }}	}
}nq# t          $ rd | j
                                        r$| j
                            dd||||fz  d           |dt          j        fvrt          j        |           Y w xY w|
| j        v r|                                 n|                                s	  ||||	          }|                    |           | j                            |           nF# t,          $ r9}|                    |           | j                            |           Y d }~nd }~ww xY wd }n# d }w xY w{| j        D ]"}	| j                            |	j        d            #| j                                         d S )	Nr   znegative timeoutrr  ztimeout too bigTz8GetQueuedCompletionStatus() returned an unexpected eventz)err=%s transferred=%s key=%#x address=%#x)r1   status)ru  
ValueErrorrv  rw  rf   GetQueuedCompletionStatusr   r   popKeyErrorr7   	get_debugr8   r   rX   r   r   r5   donerE   r   r`   r6   rB   r   r+   r   )r   r   rz  r  errtransferredr  r+   r   r    r}  r  r   rN  s                 r"   r\   zIocpProactor._poll$  sy   ?BBq[[/000 7S=))BX~~ !2333&	 :4:rJJF~B-3*Cc7'+{w'?'?$2sHH   :'')) J55%7#N&);W%E$F7 7    q+"BCCC',,, d+++



 VVXX 
	$H[#r::E
 LL'''M((++++  , , ,OOA&&&M((++++++++, AAAHHHHM&	R $ 	. 	.BKOOBJ----  """""sC   :B A+DD>E; 0G ;
F>/F94G 9F>>G Gc                 :    | j                             |           d S rA   )r   r   r|  s     r"   _stop_servingzIocpProactor._stop_serving]  s!     	!!#&&&&&r#   c                    | j         d S t          | j                                                  D ]\  }}}}|                                rt          |t                    r2	 |                                 H# t          $ rB}| j	        1d||d}|j
        r
|j
        |d<   | j	                            |           Y d }~d }~ww xY wd}t          j                    }||z   }	| j        rs|	t          j                    k    r@t          j        d| t          j                    |z
             t          j                    |z   }	|                     |           | j        sg | _        t%          j        | j                    d | _         d S )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    r}  r  r9   r:   
msg_update
start_timenext_msgs
             r"   r   zIocpProactor.closec  s   :F '+4;+=+=+?+?&@&@ 	C 	C"CS(}} CC!233 CCJJLLLL 	C 	C 	Cz-'C),&)# #
 0 P:=:OG$67
99'BBB	C 
^%%

*k 	#4>++++K!4>#3#3j#@B B B>++j8 JJz""" k 	# DJ'''


s   #A88
C8B??Cc                 .    |                                   d S rA   )r   r[   s    r"   r   zIocpProactor.__del__  s    

r#   rA   )r   r   )!rH   rI   rJ   rK   ru  r   r   r   r   r   r   r  r  r  r#  r(  r-  rA  rO  r]  r   r   rn  r   rm  r  r  r   r<  r\   r  r   r   r   r#   r"   r   r     s       --#+ 2 2 2 29 9 9E E E  	 	 	 	  
5 5 5 5.5 5 5 5.5 5 5 5(5 5 5 5(5 5 5 5$5 5 5 5(  88 8 8>9 9 9*< < <"0 0 0&= = = =       DO O O  @& & &  
7# 7# 7# 7#r' ' '- - -^    r#   r   c                       e Zd Zd ZdS )r   c           	           t          j        |f|||||d| _         fd} j        j                            t           j        j                            }	|	                    |           d S )N)r   r   r   r   r   c                 d    j                                         }                    |           d S rA   )_procpoll_process_exited)r   
returncoder   s     r"   r  z4_WindowsSubprocessTransport._start.<locals>.callback  s.    **J  ,,,,,r#   )	r   Popenr  r7   r{   rn  intrQ   r   )
r   r   r   r   r   r   r   r   r  r   s
   `         r"   _startz"_WindowsSubprocessTransport._start  s    "('U6&' '%' '
	- 	- 	- 	- 	- J 00TZ5G1H1HII	H%%%%%r#   N)rH   rI   rJ   r  r   r#   r"   r   r     s#        
& 
& 
& 
& 
&r#   r   c                       e Zd ZeZdS )r   N)rH   rI   rJ   r   _loop_factoryr   r#   r"   r   r             %MMMr#   r   c                       e Zd ZeZdS )r   N)rH   rI   rJ   r   r  r   r#   r"   r   r     r  r#   r   )2rK   sysplatformImportErrorrf   rX   rJ  rv  rU  r
  r0  r  r    r   r   r   r   r	   r
   r   r   logr   __all__r   ru  ERROR_CONNECTION_REFUSEDERROR_CONNECTION_ABORTEDre  ri  Futurer   rO   rp   ry   objectr   BaseSelectorEventLoopr   BaseProactorEventLoopr   r   BaseSubprocessTransportr   r   BaseDefaultEventLoopPolicyr   r   r   r   r#   r"   <module>r     sx   4 4 



<7
+l
#
##                                                                   |       - - - - - - - -`G# G# G# G# G#GN G# G# G#T& & & & &- & & &01P 1P 1P 1P 1P- 1P 1P 1Ph8 8 8 8 8 8 8 8v2 2 2 2 2 E 2 2 2g g g g g= g g gTt t t t t t t tn& & & & &/"I & & & . & & & & &V%F & & && & & & &V%F & & & 8   r#   