\dAdZddlZejdkr edddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZddl mZddl mZdd l mZdd l mZdd l mZdd l mZdd l mZddlmZdZejZejZdZdZdZdZGddejZ GddejZ!Gdde!Z"Gdde!Z#Gdde$Z%Gddej&Z'Gd d!ej(Z)Gd"d#Z*Gd$d%ej+Z,e'Z-Gd&d'ej.Z/Gd(d)ej.Z0e0Z1dS)*z.Selector and proactor event loops for Windows.Nwin32z win32 only)events)base_subprocess)futures) exceptions)proactor_events)selector_events)tasks) windows_utils)logger)SelectorEventLoopProactorEventLoop IocpProactorDefaultEventLoopPolicyWindowsSelectorEventLoopPolicyWindowsProactorEventLoopPolicyiigMbP?g?cXeZdZdZddfd ZfdZdZd fd ZfdZfd Z xZ S) _OverlappedFuturezSubclass of Future which represents an overlapped operation. Cancelling it will immediately cancel the overlapped operation. Nloopcxt||jr|jd=||_dSNr)super__init___source_traceback_ov)selfovr __class__s '..\python\lib\asyncio\windows_events.pyrz_OverlappedFuture.__init__6s? d###  ! +&r*ct}|j8|jjrdnd}|dd|d|jjdd|S)Npending completedrz overlapped=)r _repr_inforr%insertaddressrinfostater!s r"r)z_OverlappedFuture._repr_info<shww!!## 8 !%!1BII{E KKI%II483CIIII J J J r#c|jdS |jnH#t$r;}d||d}|jr |j|d<|j|Yd}~nd}~wwxYwd|_dS)Nz&Cancelling an overlapped future failedmessage exceptionfuturesource_traceback)rcancelOSErrorr_loopcall_exception_handler)rexccontexts r"_cancel_overlappedz$_OverlappedFuture._cancel_overlappedCs 8  F 7 HOO     7 7 7C G % E.2.D*+ J - -g 6 6 6 6 6 6 6 6 7s% A*1A%%A*cp|t|SN)msg)r;rr5rr>r!s r"r5z_OverlappedFuture.cancelSs- !!!ww~~#~&&&r#crt||dSN)r set_exceptionr;rr2r!s r"rBz_OverlappedFuture.set_exceptionWs3 i((( !!!!!r#cXt|d|_dSrA)r set_resultrrresultr!s r"rEz_OverlappedFuture.set_result[s& 6"""r#rA) __name__ __module__ __qualname____doc__rr)r;r5rBrE __classcell__r!s@r"rr0s $(  ''''''"""""r#rcdeZdZdZddfd ZdZfdZdZdZd fd Z fd Z fd Z xZ S) _BaseWaitHandleFuturez2Subclass of Future which represents a wait handle.Nrct||jr|jd=||_||_||_d|_dS)NrrT)rrrr_handle _wait_handle _registered)rr handle wait_handlerr!s r"rz_BaseWaitHandleFuture.__init__cs\ d###  ! +&r* ' r#cRtj|jdtjkSNr)_winapiWaitForSingleObjectrQ WAIT_OBJECT_0rs r"_pollz_BaseWaitHandleFuture._pollqs$+DL!<<%& 'r#c6t}|d|jd|j-|rdnd}|||j|d|jd|S)Nzhandle=r'signaledwaitingz wait_handle=)rr)appendrQr\rRr,s r"r)z _BaseWaitHandleFuture._repr_infovsww!!## /dl///000 < #"&**,,=JJIE KK      ( KK=t'8=== > > > r#cd|_dSrA)r)rfuts r"_unregister_wait_cbz)_BaseWaitHandleFuture._unregister_wait_cbsr#c^|jsdSd|_|j}d|_ tj|nc#t$rV}|jtjkr7d||d}|jr |j|d<|j |Yd}~dSYd}~nd}~wwxYw| ddSNFz$Failed to unregister the wait handler0r4) rSrR _overlappedUnregisterWaitr6winerrorERROR_IO_PENDINGrr7r8rcrrUr9r:s r"_unregister_waitz&_BaseWaitHandleFuture._unregister_waits  F '     &{ 3 3 3 3   |{;;;E!$" )I262HG./ 11':::<;;;;    &&&&&s5 BABBcp|t|Sr=)rkrr5r?s r"r5z_BaseWaitHandleFuture.cancels- ww~~#~&&&r#cr|t|dSrA)rkrrBrCs r"rBz#_BaseWaitHandleFuture.set_exceptions3  i(((((r#cr|t|dSrA)rkrrErFs r"rEz _BaseWaitHandleFuture.set_results3  6"""""r#rA) rHrIrJrKrr\r)rcrkr5rBrErLrMs@r"rOrO`s<<8<        '''  '''0'''''')))))#########r#rOcBeZdZdZddfd ZdZfdZfdZxZS)_WaitCancelFuturezoSubclass of Future which represents a wait for the cancellation of a _WaitHandleFuture using an event. Nrc`t||||d|_dS)Nr)rr_done_callback)rr eventrUrr!s r"rz_WaitCancelFuture.__init__s2 UKd;;;"r#c td)Nz'_WaitCancelFuture must not be cancelled) RuntimeErrorr[s r"r5z_WaitCancelFuture.cancelsDEEEr#ct||j||dSdSrA)rrErrrFs r"rEz_WaitCancelFuture.set_resultsF 6"""   *    % % % % % + *r#ct||j||dSdSrA)rrBrrrCs r"rBz_WaitCancelFuture.set_exceptionsF i(((   *    % % % % % + *r#) rHrIrJrKrr5rErBrLrMs@r"rprps8<####### FFF&&&&& &&&&&&&&&r#rpc4eZdZddfd ZfdZdZxZS)_WaitHandleFutureNrct||||||_d|_t jdddd|_d|_dS)NrTF)rr _proactor_unregister_proactorrf CreateEvent_event _event_fut)rr rTrUproactorrr!s r"rz_WaitHandleFuture.__init__sV V[t<<<!$(!!-dD%FF r#c|j'tj|jd|_d|_|j|jd|_t|dSrA) r~rX CloseHandlerr{ _unregisterrrrc)rrbr!s r"rcz%_WaitHandleFuture._unregister_wait_cbsk ; "   , , ,DK"DO ""48,,, ##C(((((r#c|jsdSd|_|j}d|_ tj||jnc#t $rV}|jtjkr7d||d}|jr |j|d<|j |Yd}~dSYd}~nd}~wwxYw|j |j|j |_dSre)rSrRrfUnregisterWaitExr~r6rhrirr7r8r{ _wait_cancelrcrrjs r"rkz"_WaitHandleFuture._unregister_waits  F '     (dk B B B B   |{;;;E!$" )I262HG./ 11':::<;;;; .55dk6:6NPPs; BABB)rHrIrJrrcrkrLrMs@r"ryrystBF)))))$PPPPPPPr#ryc4eZdZdZdZdZdZdZdZeZ dS) PipeServerzXClass representing a pipe server. This is much like a bound, listening socket. c||_tj|_d|_d|_|d|_dSNT)_addressweakrefWeakSet_free_instances_pipe_accept_pipe_future_server_pipe_handle)rr+s r"rzPipeServer.__init__sC &00 #' --d33 r#cJ|j|dc}|_|S)NF)rr)rtmps r"_get_unconnected_pipez PipeServer._get_unconnected_pipes& *d&>&>u&E&ETZ r#c |rdStjtjz}|r|tjz}tj|j|tjtjztj ztj tj tj tj tj}tj|}|j||SrA)closedrXPIPE_ACCESS_DUPLEXFILE_FLAG_OVERLAPPEDFILE_FLAG_FIRST_PIPE_INSTANCECreateNamedPiperPIPE_TYPE_MESSAGEPIPE_READMODE_MESSAGE PIPE_WAITPIPE_UNLIMITED_INSTANCESr BUFSIZENMPWAIT_WAIT_FOREVERNULL PipeHandleradd)rfirstflagshpipes r"rzPipeServer._server_pipe_handle s ;;== 4*W-II  ; W: :E  # M5  %(E E     ,  !=#8  (',  8 8'**   &&& r#c|jduSrA)rr[s r"rzPipeServer.closeds %&r#c|j |jd|_|jG|jD]}|d|_d|_|jdSdSrA)rr5rrcloserclear)rrs r"rzPipeServer.close"s  # /  $ + + - - -'+D $ = $,   DJ DM  & & ( ( ( ( ( % $r#N) rHrIrJrKrrrrr__del__r#r"rrsj444$''' ) ) )GGGr#rceZdZdZdS)_WindowsSelectorEventLoopz'Windows version of selector event loop.N)rHrIrJrKrr#r"rr1s1111r#rcDeZdZdZdfd ZfdZdZdZ ddZxZ S) rz2Windows version of proactor event loop using IOCP.Ncj|t}t|dSrA)rrr)rrr!s r"rzProactorEventLoop.__init__8s0  #~~H """""r#c |jJ||jt|jJ|jj}|j||j|d|_dSdS#|jH|jj}|j||j|d|_wxYwrA) _self_reading_future call_soon_loop_self_readingr run_foreverrr5r{r)rr r!s r"rzProactorEventLoop.run_forever=s 1,444 NN42 3 3 3 GG   ! ! !(4.2)00222>N..r222,0)))54t(4.2)00222>N..r222,0)0000s ABAC*cK|j|}|d{V}|}|||d|i}||fS)Naddrextra)r{ connect_pipe_make_duplex_pipe_transport)rprotocol_factoryr+frprotocoltranss r"create_pipe_connectionz(ProactorEventLoop.create_pipe_connectionPsl N ' ' 0 0wwwwww##%%00x8>7H1JJhr#crKtdfd gS)Ncd} |r||}j|r|dS}||di}|dSj|}|_ | dS#t$rG|r,| dkr| YdSt$r}|rF| dkr.d||d|njrt#jd|d Yd}~dSd}~wt&j$r|r|YdSYdSwxYw) NrrrzPipe accept failed)r1r2rzAccept pipe failed on pipe %rT)exc_info)rGrdiscardrrrrr{ accept_piperadd_done_callbackBrokenPipeErrorfilenorr6r8_debugr warningrCancelledError) rrrr9r+loop_accept_piperrservers r"rz>ProactorEventLoop.start_serving_pipe..loop_accept_pipe[sJD) 6 A88::D*224888}} //11H44hvw.?5AAA3355<FN..t44*./*##$455555+# 1 1 1!DKKMMR//JJLLL/000000 1 1 1 8DKKMMR////#7%( $11 JJLLLL[8N#B#'$8888/000000000, ! ! !!JJLLLLLL!!! !s2AC:CCA G# G,A;F--(GGrA)rr)rrr+rrs```@@r"start_serving_pipez$ProactorEventLoop.start_serving_pipeXsgG$$+ 6+ 6+ 6+ 6+ 6+ 6+ 6+ 6+ 6+ 6Z '(((xr#c K|} t||||||||f| |d| } | d{VnN#ttf$rt$r0| | d{VwxYw| S)N)waiterr) create_future_WindowsSubprocessTransport SystemExitKeyboardInterrupt BaseExceptionr_wait) rrargsshellstdinstdoutstderrbufsizerkwargsrtransps r"_make_subprocess_transportz,ProactorEventLoop._make_subprocess_transports##%%,T8T5-2FFG74:%770677 LLLLLLLL-.        LLNNN,,..    s 8A BrA) rHrIrJrKrrrrrrLrMs@r"rr5s<<###### 11111&111j04r#rceZdZdZefdZdZdZdZd dZ dZ d!d Z d!d Z d!d Z d!d Zd"dZd!dZdZdZdZdZdZd dZdZdZdZdZdZdZd dZdZdZdZ dS)#rz#Proactor implementation using IOCP.cd|_g|_tjtjt d||_i|_tj |_ g|_ tj |_ dSrW) r7_resultsrfCreateIoCompletionPortINVALID_HANDLE_VALUEr_iocp_cacherrrS _unregistered_stopped_serving)r concurrencys r"rzIocpProactor.__init__sg   7  ,dA{DD  "?,, ' 1 1r#c2|jtddS)NzIocpProactor is closed)rrur[s r" _check_closedzIocpProactor._check_closeds! : 788 8  r#cdt|jzdt|jzg}|j|dd|jjdd|dS)Nzoverlapped#=%sz result#=%sr< r()lenrrrr`r!rHjoin)rr-s r"__repr__zIocpProactor.__repr__sl 3t{#3#33s4=1113 :  KK ! ! ! N333SXXd^^^^DDr#c||_dSrA)r7)rrs r"set_loopzIocpProactor.set_loops  r#Ncn|js|||j}g|_ |d}S#d}wxYwrA)rr\)rtimeoutrs r"selectzIocpProactor.selectsJ} JJw   m  CC$CJJJJs04cb|j}|||SrA)r7rrE)rvaluerbs r"_resultzIocpProactor._results,j&&(( u r#rc||tjt} t |t jr*||||n(|||n%#t$r| dcYSwxYwd}| |||S)Nr#c |S#t$r3}|jtjtjfvrt |jd}~wwxYwrA getresultr6rhrfERROR_NETNAME_DELETEDERROR_OPERATION_ABORTEDConnectionResetErrorrrkeyr r9s r" finish_recvz&IocpProactor.recv..finish_recvf ||~~%   B?c||tjt} t |t jr*||||n(|||n%#t$r| dcYSwxYwd}| |||S)Nrc |S#t$r3}|jtjtjfvrt |jd}~wwxYwrArrs r"rz+IocpProactor.recv_into..finish_recvrr) rrfrrr r  WSARecvIntor ReadFileIntorrr rrbufrr rs r" recv_intozIocpProactor.recv_intos   &&&  #D ) ) #$ .. 4t{{}}c59999 s333 # # #<<?? " " " #   ~~b$ 444rc2||tjt} ||||n%#t $r|dcYSwxYwd}||||S)N)r#Nc |S#t$r3}|jtjtjfvrt |jd}~wwxYwrArrs r"rz*IocpProactor.recvfrom..finish_recvrr) rrfrr WSARecvFromrrrr rs r"recvfromzIocpProactor.recvfroms   &&&  #D ) ) - NN4;;==&% 8 8 8 8 - - -<< ,, , , , -   ~~b$ 444)AA<;A<c2||tjt} ||||n%#t $r|dcYSwxYwd}||||S)NrNc |S#t$r3}|jtjtjfvrt |jd}~wwxYwrArrs r"rz/IocpProactor.recvfrom_into..finish_recvrr) rrfrrWSARecvFromIntorrrr rs r" recvfrom_intozIocpProactor.recvfrom_into s   &&&  #D ) ) +   t{{}}c5 9 9 9 9 + + +<< ** * * * +   ~~b$ 444rc||tjt}|||||d}||||S)Nc |S#t$r3}|jtjtjfvrt |jd}~wwxYwrArrs r" finish_sendz(IocpProactor.sendto..finish_send&rr)rrfrr WSASendTorr )rrrrrr r&s r"sendtozIocpProactor.sendto sm   &&&  #D ) ) T[[]]C555   ~~b$ 444r#cj||tjt}t |t jr*||||n(|||d}| |||S)Nc |S#t$r3}|jtjtjfvrt |jd}~wwxYwrArrs r"r&z&IocpProactor.send..finish_send:rr) rrfrrr r WSASendr WriteFiler )rrrrr r&s r"sendzIocpProactor.send2s   &&&  #D ) ) dFM * * - JJt{{}}c5 1 1 1 1 LL , , ,   ~~b$ 444r#c||jtjt }|fd}d}|||}||}tj ||j |S)NcJ|tjd}t jtj|   fS)Nz@P) rstructpackr setsockoptr  SOL_SOCKETrfSO_UPDATE_ACCEPT_CONTEXT settimeout gettimeout getpeername)rrr rrlisteners r" finish_acceptz*IocpProactor.accept..finish_acceptLs LLNNN+dHOO$5$566C OOF-'@# G G G OOH//11 2 2 2))+++ +r#clK |d{VdS#tj$r|wxYwrA)rrr)r3rs r" accept_coroz(IocpProactor.accept..accept_coroUsN  ,     s%3r) r_get_accept_socketfamilyrfrrAcceptExrr r ensure_futurer7)rr8r r9r;r3corors ` @r"acceptzIocpProactor.acceptFs   ***&&x77  #D ) ) HOO%%t{{}}555 , , , , , ,   Hm<<{64(( Dtz2222 r#cjtjkrWtj||j}|d|S|  tj j nL#t$r?}|j tjkrddkrYd}~nd}~wwxYwtjt$}||fd}|||S)Nrrc|tjtjdSrW)rr2r r3rfSO_UPDATE_CONNECT_CONTEXT)rrr rs r"finish_connectz,IocpProactor.connect..finish_connectxs; LLNNN OOF-'A1 F F FKr#)typer  SOCK_DGRAMrf WSAConnectrr7rrEr BindLocalr=r6rherrno WSAEINVAL getsocknamerr ConnectExr )rrr+rber rEs ` r"connectzIocpProactor.connectbsS 9) ) )  "4;;==' : : :***,,C NN4 J   &&&   !$++-- = = = =   zU_,,!!!$))*))))    #D ) ) T[[]]G,,,     ~~b$777s,B11 C:;5C55C:c N||tjt}|dz}|dz dz}||t j||||ddd}||||S)Nl rc |S#t$r3}|jtjtjfvrt |jd}~wwxYwrArrs r"finish_sendfilez.IocpProactor.sendfile..finish_sendfilerr) rrfrr TransmitFilermsvcrt get_osfhandler ) rsockfileoffsetcountr offset_low offset_highrSs r"sendfilezIocpProactor.sendfiles   &&&  #D ) )k) |{2   ,T[[]];;"Kq! % % %    ~~b$888r#c|tjt}|}|r|Sfd}|||S)Nc0|SrA)r)rrr rs r"finish_accept_pipez4IocpProactor.accept_pipe..finish_accept_pipes LLNNNKr#)rrfrrConnectNamedPiperrr )rrr connectedr`s ` r"rzIocpProactor.accept_pipes   &&&  #D ) )'' 66  &<<%% %     ~~b$(:;;;r#c*Kt} tj|}n`#t$r }|jtjkrYd}~nd}~wwxYwt |dzt}tj |d{Vvtj |S)NT) CONNECT_PIPE_INIT_DELAYrf ConnectPiper6rhERROR_PIPE_BUSYminCONNECT_PIPE_MAX_DELAYr sleepr r)rr+delayrTr9s r"rzIocpProactor.connect_pipes' % $099   <;#>>>?>>>>   #9::E+e$$ $ $ $ $ $ $ $ %'///s! A AA c0|||dS)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)rrTrs r"wait_for_handlezIocpProactor.wait_for_handles $$VWe<<.finish_wait_for_handles7799 r#r)rrXINFINITEmathceilrfrrRegisterWaitWithQueuerr+rpr7ryrr) rrTr _is_cancelmsr rUrtrs @r"rmzIocpProactor._wait_for_handles  ?!BB7S=))B #D ) )!7 DJ B00  3!"fk KKKAA!"fk4'+z333A  (#B'     $%b!-C"D BJr#c||jvrJ|j|tj||jdddSdSrW)rSrrfrrrrobjs r"rz IocpProactor._register_with_iocpsX d& & &    % % %  .szz||TZA N N N N N ' &r#cL|t||j}|jr|jd=|jsP |dd|}||n,#t $r}||Yd}~nd}~wwxYw||||f|j|j <|Sr) rrr7rr%rEr6rBrr+)rr r}callbackrrrNs r"r zIocpProactor._registers  btz 2 2 2  (#B'z $  $ tR00 U#### # # #"""""""" #$%b#x"8 BJs A%% B/B  Bcb||j|dS)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)rrr`)rr s r"rzIocpProactor._unregisters3  !!"%%%%%r#cXtj|}|d|SrW)r r5)rr=ss r"r<zIocpProactor._get_accept_sockets% M& ! ! Qr#c $|t}nF|dkrtdtj|dz}|tkrtd t j|j|}|n]d}|\}}}} |j|\}} } } nq#t$rd|j r$|j dd||||fzd|dtj fvrtj|YwxYw| |jvr|n|s | ||| } || |j|nF#t,$r9} || |j|Yd} ~ nd} ~ wwxYwd}n#d}wxYw{|jD]"} |j| jd#|jdS) Nrznegative timeoutrrztimeout too bigTz8GetQueuedCompletionStatus() returned an unexpected eventz)err=%s transferred=%s key=%#x address=%#x)r1status)ru ValueErrorrvrwrfGetQueuedCompletionStatusrrpopKeyErrorr7 get_debugr8rrXrrr5donerErr`r6rBrr+r)rrrzrerr transferredrr+rr r}rrrNs r"r\zIocpProactor._poll$sy ?BB q[[/00 07S=))BX~~ !2333&  :4:rJJF~B-3 *Cc7 '+{w'?'?$2sHH   :''))J55%7#N&);W%E$F77q+"BCCC',,, d+++ VVXX  $H[#r::E LL'''M((++++ ,,,OOA&&&M((++++++++,AAAHHHHM& R$ . .B KOOBJ - - - -   """""sC:BA+DD> E; 0G; F>/F94G9F>>GGc:|j|dSrA)rrr|s r" _stop_servingzIocpProactor._stop_serving]s! !!#&&&&&r#c|jdSt|jD]\}}}}|rt |t r2 |H#t$rB}|j 1d||d}|j r |j |d<|j |Yd}~d}~wwxYwd}tj }||z} |jrs| tj kr@tjd|tj |z tj |z} |||jsg|_t%j|jd|_dS)NzCancelling a future failedr0r4g?z,%r is running after closing for %.1f seconds)rlistrvalues cancelledr rpr5r6r7rr8time monotonicr debugr\rrXr) rrbr r}rr9r: msg_update start_timenext_msgs r"rzIocpProactor.closecs :  F'+4;+=+=+?+?&@&@ C C "CS(}} CC!233 C CJJLLLL C C Cz-'C),&)## 0P:=:OG$67 99'BBB C ^%%  *k #4>++++ K!4>#3#3j#@BBB>++j8 JJz " " "k # DJ''' s#A88 C8B??Cc.|dSrA)rr[s r"rzIocpProactor.__del__s r#rA)rr )!rHrIrJrKrurrrrrrrrrr#r(r-rArOr]rrrnrrmrr rr<r\rrrrr#r"rrs--#+2222999EEE     5555.5555.5555(5555(5555$5555(8888>999*<<<"000&====   DOOO@&&& 7#7#7#7#r''' ---^r#rceZdZdZdS)rc tj|f|||||d|_fd}jjt jj} | |dS)N)rrrrrcdj}|dSrA)_procpoll_process_exited)r returncoders r"rz4_WindowsSubprocessTransport._start..callbacks.**J   , , , , ,r#) r Popenrr7r{rnintrQr) rrrrrrrrrrs ` r"_startz"_WindowsSubprocessTransport._starts"( 'U6&''%''  - - - - - J 0 0TZ5G1H1H I I H%%%%%r#N)rHrIrJrrr#r"rrs# & & & & &r#rceZdZeZdS)rN)rHrIrJr _loop_factoryrr#r"rr%MMMr#rceZdZeZdS)rN)rHrIrJrrrr#r"rrrr#r)2rKsysplatform ImportErrorrfrXrJrvrUr r0rrrrrrr r r r logr __all__rruERROR_CONNECTION_REFUSEDERROR_CONNECTION_ABORTEDreriFuturerrOrpryobjectrBaseSelectorEventLooprBaseProactorEventLooprrBaseSubprocessTransportrrBaseDefaultEventLoopPolicyrrrrr#r"rsx44 <7 +l # ##  |   --------`G#G#G#G#G#GNG#G#G#T&&&&&-&&&01P1P1P1P1P-1P1P1Ph88888888v22222 E222ggggg=gggTttttttttn & & & & &/"I & & &.&&&&&V%F&&&&&&&&V%F&&&8r#