fKdZddlZejdk7redddlZddlZddlZddlmZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZdZej6Zej8ZdZdZdZdZ GddejBZ"GddejBZ#Gdde#Z$Gdde#Z%Gdde&Z'Gdd ejPZ)Gd!d"ejTZ+Gd#d$Z,Gd%d&ejZZ.e)Z/Gd'd(ej`Z1Gd)d*ej`Z2e2Z3y)+z.Selector and proactor event loops for Windows.Nwin32z win32 only)partial)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. Nloopcft|||jr |jd=||_yNr)super__init___source_traceback_ov)selfovr __class__s -/usr/lib/python3.12/asyncio/windows_events.pyrz_OverlappedFuture.__init__7s1 d#  ! !&&r*ct|}|jH|jjrdnd}|j dd|d|jj dd|S)Npending completedrz overlapped=)r _repr_inforr&insertaddressr infostater"s r#r*z_OverlappedFuture._repr_info=s\w!# 88 !%!1!1I{E KK\%4883C3CB2GqI J r$c|jy |jjd|_y#t$rM}d||d}|jr|j|d<|jj |Yd}~d|_yd}~wwxYw)Nz&Cancelling an overlapped future failedmessage exceptionfuturesource_traceback)rcancelOSErrorr_loopcall_exception_handler)r exccontexts r#_cancel_overlappedz$_OverlappedFuture._cancel_overlappedDs 88   7 HHOO  7C G %%.2.D.D*+ JJ - -g 6 6 7s1 B r$cd|_yrB)r)r futs r#_unregister_wait_cbz)_BaseWaitHandleFuture._unregister_wait_cbs r$c|jsyd|_|j}d|_ tj||jdy#t$rh}|j tj k7rAd||d}|jr|j|d<|jj|Yd}~yYd}~~d}~wwxYwNFz$Failed to unregister the wait handler1r5) rTrS _overlappedUnregisterWaitr7winerrorERROR_IO_PENDINGrr8r9rdr rVr:r;s r#_unregister_waitz&_BaseWaitHandleFuture._unregister_waits  ''     & &{ 3   & ||{;;;E!$" ))262H2HG./ 11':< sA CAB<<CcD|jt| |Sr>)rlrr6r@s r#r6z_BaseWaitHandleFuture.cancels  w~#~&&r$cD|jt| |yrB)rlrrCrDs r#rCz#_BaseWaitHandleFuture.set_exceptions  i(r$cD|jt| |yrB)rlrrFrGs r#rFz _BaseWaitHandleFuture.set_results  6"r$rB) rIrJrKrLrr]r*rdrlr6rCrFrMrNs@r#rPrPas6<8<  '  '0')##r$rPcBeZdZdZddfd ZdZfdZfdZxZS)_WaitCancelFuturezoSubclass of Future which represents a wait for the cancellation of a _WaitHandleFuture using an event. Nrc:t|||||d|_y)Nr)rr_done_callback)r r!eventrVrr"s r#rz_WaitCancelFuture.__init__s! UKd;"r$ctd)Nz'_WaitCancelFuture must not be cancelled) RuntimeErrorr\s r#r6z_WaitCancelFuture.cancelsDEEr$c`t|||j|j|yyrB)rrFrsrGs r#rFz_WaitCancelFuture.set_results/ 6"    *    % +r$c`t|||j|j|yyrB)rrCrsrDs r#rCz_WaitCancelFuture.set_exceptions/ i(    *    % +r$) rIrJrKrLrr6rFrCrMrNs@r#rqrqs'8<# F& &&r$rqc4eZdZddfd ZfdZdZxZS)_WaitHandleFutureNrct|||||||_d|_t j dddd|_d|_y)NrTF)rr _proactor_unregister_proactorrg CreateEvent_event _event_fut)r r!rUrVproactorrr"s r#rz_WaitHandleFuture.__init__sG V[t<!$(!!--dD%F r$c|j-tj|jd|_d|_|jj |j d|_t|!|yrB) rrY CloseHandlerr| _unregisterrrrd)r rcr"s r#rdz%_WaitHandleFuture._unregister_wait_cbsY ;; "    ,DK"DO ""488, #C(r$c|jsyd|_|j}d|_ tj||j|jj|j|j|_y#t $rh}|j tjk7rAd||d}|jr|j|d<|jj|Yd}~yYd}~d}~wwxYwrf)rTrSrgUnregisterWaitExrr7rirjrr8r9r| _wait_cancelrdrrks r#rlz"_WaitHandleFuture._unregister_waits  ''     ( (dkk B..55dkk6:6N6NP ||{;;;E!$" ))262H2HG./ 11':< s A?? C0AC++C0)rIrJrKrrdrlrMrNs@r#rzrzsBF)$Pr$rzc2eZdZdZdZdZdZdZdZeZ y) PipeServerzXClass representing a pipe server. This is much like a bound, listening socket. c||_tj|_d|_d|_|j d|_yNT)_addressweakrefWeakSet_free_instances_pipe_accept_pipe_future_server_pipe_handle)r r,s r#rzPipeServer.__init__s; &0 #' --d3 r$cL|j|jdc}|_|S)NF)rr)r tmps r#_get_unconnected_pipez PipeServer._get_unconnected_pipes% **d&>&>u&ETZ r$c ,|jrytjtjz}|r|tjz}tj |j |tjtjztjztjtjtjtjtj}tj|}|j j#||SrB)closedrYPIPE_ACCESS_DUPLEXFILE_FLAG_OVERLAPPEDFILE_FLAG_FIRST_PIPE_INSTANCECreateNamedPiperPIPE_TYPE_MESSAGEPIPE_READMODE_MESSAGE PIPE_WAITPIPE_UNLIMITED_INSTANCESr BUFSIZENMPWAIT_WAIT_FOREVERNULL PipeHandleradd)r firstflagshpipes r#rzPipeServer._server_pipe_handles ;;=**W-I-II  W:: :E  # # MM5  % %(E(E E      , ,  ! !=#8#8  ( (',,  8''*   & r$c|jduSrB)rr\s r#rzPipeServer.closed s %&r$c |j!|jjd|_|jJ|jD]}|j d|_d|_|jj yyrB)rr6rrcloserclear)r rs r#rzPipeServer.close#su  # # /  $ $ + + -'+D $ == $,,   DJ DM  & & ( %r$N) rIrJrKrLrrrrr__del__r$r#rrs'4$' )Gr$rceZdZdZy)_WindowsSelectorEventLoopz'Windows version of selector event loop.N)rIrJrKrLrr$r#rr2s1r$rcDeZdZdZdfd ZfdZdZdZ ddZxZ S)rz2Windows version of proactor event loop using IOCP.c<| t}t| |yrB)rrr)r rr"s r#rzProactorEventLoop.__init__9s  #~H "r$c4 |jJ|j|jt||ja|jj }|jj |'|js|jj|d|_yy#|ja|jj }|jj |'|js|jj|d|_wwxYwrB) _self_reading_future call_soon_loop_self_readingr run_foreverrr6r&r|r)r r!r"s r#rzProactorEventLoop.run_forever>s 1,,4 44 NN422 3 G  !((4..22))002>"**NN..r2,0)5t((4..22))002>"**NN..r2,0)5s 7B((A/DcK|jj|}|d{}|}|j||d|i}||fS7%w)Naddrextra)r| connect_pipe_make_duplex_pipe_transport)r protocol_factoryr,frprotocoltranss r#create_pipe_connectionz(ProactorEventLoop.create_pipe_connectionQsZ NN ' ' 0w#%00x8>7H1Jh s!A A &A cfKtdfd jgSw)NcJd} |ri|j}jj|jr|j y}j ||dij }|yjj|}|_ |jy#t$r9|r#|jdk7r|j jYyt$rz}|r9|jdk7r&jd||d|j n$j rt#j$d|djYd}~yd}~wt&j($r|r|j YyYywxYw) NrrrzPipe accept failed)r2r3rzAccept pipe failed on pipe %rT)exc_info)rHrdiscardrrrrr| accept_piperadd_done_callbackBrokenPipeErrorfilenorr7r9_debugrwarningr CancelledError) rrrr:r,loop_accept_piperr servers r#rz>ProactorEventLoop.start_serving_pipe..loop_accept_pipe\stD) 688:D**2248}} /1H44hvw.?5A335<NN..t4*./*##$45+# 1DKKMR/JJL/0 1DKKMR///#7%( $1 JJL[[NN#B#'$8/00,, !JJL !s1A B7/B7B77?F"8F"A0E55(F"!F"rB)rr)r rr,rrs```@@r#start_serving_pipez$ProactorEventLoop.start_serving_pipeYs2G$+ 6+ 6Z '(xs*1c K|j} t||||||||f| |d| } | d{| S7#ttf$rt$r+| j | j d{7wxYww)N)waiterr) create_future_WindowsSubprocessTransport SystemExitKeyboardInterrupt BaseExceptionr_wait) r rargsshellstdinstdoutstderrbufsizerkwargsrtransps r#_make_subprocess_transportz,ProactorEventLoop._make_subprocess_transports##%,T8T5-2FFG74:%7067 LL  -.    LLN,,.  s1'A>868A>8;A;3A64A;;A>rB) rIrJrKrLrrrrrrMrNs@r#rr6s%<# 1&1j04r$rceZdZdZefdZdZdZdZd!dZ dZ e d Z e d Zd"d Zd"d Zd"d Zd"dZd#dZd"dZdZdZdZdZdZd!dZdZdZdZdZdZdZ d!dZ!dZ"dZ#d Z$y)$rz#Proactor implementation using IOCP.cd|_g|_tjtjt d||_i|_tj|_ g|_ tj|_ yrX) r8_resultsrgCreateIoCompletionPortINVALID_HANDLE_VALUEr_iocp_cacherrrT _unregistered_stopped_serving)r concurrencys r#rzIocpProactor.__init__s_   77  , ,dA{D  "??, ' 1r$c2|j tdy)NzIocpProactor is closed)rrvr\s r# _check_closedzIocpProactor._check_closeds :: 78 8 r$cdt|jzdt|jzg}|j|j dd|j j ddj|dS)Nzoverlapped#=%sz result#=%sr< r))lenrrrrar"rIjoin)r r.s r#__repr__zIocpProactor.__repr__s_ 3t{{#33s4==113 ::  KK ! NN33SXXd^DDr$c||_yrB)r8)r rs r#set_loopzIocpProactor.set_loops  r$Ncz|js|j||j}g|_ |d}S#d}wxYwrB)rr])r timeoutrs r#selectzIocpProactor.selects:}} JJw mm  C$Cs6:c\|jj}|j||SrB)r8rrF)r valuercs r#_resultzIocpProactor._results%jj&&( u r$c |jS#t$rD}|jtjtj fvrt |jd}~wwxYwrB) getresultr7rirgERROR_NETNAME_DELETEDERROR_OPERATION_ABORTEDConnectionResetErrorr)rkeyr!r:s r#finish_socket_funczIocpProactor.finish_socket_funcsY <<> ! || A A + C C EE*CHH55  s A?AAc |j|||S#t$r,}|jtjk(r |dfcYd}~Sd}~wwxYwrB)rr7rirgERROR_PORT_UNREACHABLE)clsrrr! empty_resultr:s r#_finish_recvfromzIocpProactor._finish_recvfromsN ))%b9 9 ||{AAA#T))  s A  AA AA c|j|tjt} t |t j r"|j |j||n |j|j||j|||jS#t$r|jdcYSwxYw)Nr$) _register_with_iocprg Overlappedr isinstancesocketWSARecvrReadFilerr _registerrr connnbytesrr!s r#recvzIocpProactor.recvs   &  # #D ) %$ . 4;;=&%8 DKKM62~~b$(?(?@@ %<<$ $ %AB%%CCc|j|tjt} t |t j r"|j |j||n |j|j||j|||jS#t$r|jdcYSwxYwrX) r rgr rr r  WSARecvIntor ReadFileIntorrrrr rbufrr!s r# recv_intozIocpProactor.recv_intos   &  # #D ) #$ .t{{}c59 s3~~b$(?(?@@ #<<? " #rc*|j|tjt} |j |j |||j||t|jdS#t $r|jdcYSwxYw)N)r$Nr$r) r rgr r WSARecvFromrrrrrrrs r#recvfromzIocpProactor.recvfroms   &  # #D ) - NN4;;=&% 8~~b$0E0E=@)BC C -<< , , -!A55BBc*|j|tjt} |j |j |||j||t|jdS#t $r|jdcYSwxYw)NrNrr) r rgr rWSARecvFromIntorrrrrrrs r# recvfrom_intozIocpProactor.recvfrom_intos   &  # #D ) +   t{{}c5 9~~b$0E0E=>)@A A +<< * * +rc|j|tjt}|j |j ||||j |||jSrB)r rgr r WSASendTorrr)r rrrrr!s r#sendtozIocpProactor.sendtosQ   &  # #D ) T[[]C5~~b$(?(?@@r$cH|j|tjt}t |t j r"|j |j||n |j|j||j|||jSrB) r rgr rr r WSASendr WriteFilerrrs r#sendzIocpProactor.sendsq   &  # #D ) dFMM * JJt{{}c5 1 LL ,~~b$(?(?@@r$c||j|jjtjt }|j jjfd}d}|j||}||}tj||j|S)Nc,|jtjdj}j t j tj|jjjfS)Nz@P) rstructpackr setsockoptr  SOL_SOCKETrgSO_UPDATE_ACCEPT_CONTEXT settimeout gettimeout getpeername)rrr!rrlisteners r# finish_acceptz*IocpProactor.accept..finish_accept*sl LLN++dHOO$56C OOF--'@@# G OOH//1 2))++ +r$cvK |d{y7#tj$r|jwxYwwrB)r rr)r4rs r# accept_coroz(IocpProactor.accept..accept_coro3s2  ,,   s 99%69r) r _get_accept_socketfamilyrgr rAcceptExrrr ensure_futurer8)r r5r!r6r8r4corors ` @r#acceptzIocpProactor.accept$s   *&&x7  # #D ) HOO%t{{}5 , Hm<64( Dtzz2 r$cjtjk(rQtjj ||j j}|jd|S|j tjj jtj"t$}|j'j |fd}|j)||S#t$r?}|jtjk7rj!ddk(rYd}~d}~wwxYw)Nrrc|jjtjtj dSrX)rr/r r0rgSO_UPDATE_CONNECT_CONTEXT)rrr!rs r#finish_connectz,IocpProactor.connect..finish_connectVs1 LLN OOF--'AA1 FKr$)typer  SOCK_DGRAMrg WSAConnectrr8rrFr  BindLocalr:r7rierrno WSAEINVAL getsocknamer r ConnectExr)r rr,rcer!rBs ` r#connectzIocpProactor.connect@s 99)) )  " "4;;=' :****,C NN4 J   &   ! !$++- = # #D ) T[[]G, ~~b$77! zzU__,!!$)*  s.D E  5EE c 6|j|tjt}|dz}|dz dz}|j |j t j|j |||dd|j|||jS)Nl r) r rgr r TransmitFilermsvcrt get_osfhandlerr)r sockfileoffsetcountr! offset_low offset_highs r#sendfilezIocpProactor.sendfile_s   &  # #D )k) |{2   ,,T[[];"Kq! % ~~b$(?(?@@r$c|jtjt}|j j }|r|j Sfd}|j||S)Nc(|jSrB)r)rrr!rs r#finish_accept_pipez4IocpProactor.accept_pipe..finish_accept_pipevs LLNKr$)r rgr rConnectNamedPiperrr)r rr! connectedr[s ` r#rzIocpProactor.accept_pipeksf   &  # #D )'' 6 <<% % ~~b$(:;;r$c<Kt} tj|} tj|S#t$r(}|jtj k7rYd}~nd}~wwxYwt |dzt}tj|d{7w)N) CONNECT_PIPE_INIT_DELAYrg ConnectPiper7riERROR_PIPE_BUSYminCONNECT_PIPE_MAX_DELAYr sleepr r)r r,delayrUr:s r#rzIocpProactor.connect_pipe|s' $009''// <<;#>#>>?   #9:E++e$ $ $s6B6B A'A"B"A''.BBBc(|j||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)r rUrs r#wait_for_handlezIocpProactor.wait_for_handles $$VWe<.finish_wait_for_handles779 r$r)rrYINFINITEmathceilrgr rRegisterWaitWithQueuerr,rqr8rzrr) r rUr _is_cancelmsr!rVrors @r#rhzIocpProactor._wait_for_handles  ?!!B7S=)B # #D )!77 DJJ B0 !"fk KA!"fk4'+zz3A  ##B' $%b!-C"D BJJr$c||jvrL|jj|tj|j |j ddyyrX)rTrrgrrrr objs r#r z IocpProactor._register_with_iocpsI d&& &     %  . .szz|TZZA N 'r$c^|jt||j}|jr |jd=|js |dd|}|j |||||f|j|j<|S#t $r}|j|Yd}~>d}~wwxYwr) rrr8rr&rFr7rCrr,)r r!rxcallbackrrrKs r#rzIocpProactor._registers  btzz 2  ##B'zz  $ tR0 U#$%b#x"8 BJJ #"" #s B B,B''B,cZ|j|jj|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)rrra)r r!s r#rzIocpProactor._unregisters$  !!"%r$cRtj|}|jd|SrX)r r2)r r:ss r#r9zIocpProactor._get_accept_sockets MM& ! Qr$c "|t}n<|dkr tdtj|dz}|tk\r td t j |j |}|nd}|\}}}} |jj|\}} } } | |j vr|j#nI|j%s9 | ||| } |j'| |j(j+|d}|j0D](} |jj| j2d*|j0j5y#t$rl|jjr%|jjdd||||fzd|dtjfvrtj|Y}wxYw#t,$r7} |j/| |j(j+|Yd} ~ d} ~ wwxYw#d}wxYw)Nrznegative timeoutrmztimeout too bigz8GetQueuedCompletionStatus() returned an unexpected eventz)err=%s transferred=%s key=%#x address=%#x)r2status)rp ValueErrorrqrrrgGetQueuedCompletionStatusrrpopKeyErrorr8 get_debugr9rrYrrr6donerFrrar7rCrr,r)r rrurerr transferredrr,rr!rxrzrrKs r#r]zIocpProactor._polls ?B q[/0 07S=)BX~ !233 ::4::rJF~B-3 *Cc7 '+{{w'?$2sH d+++ VVX $[#r:E LL'MM((+AMR$$ .B KKOOBJJ - .   "E ::'')JJ55%7#N&);W%E$F7q+"B"BCC'', ,,OOA&MM((++,AsC4 E G,H A1GG H,H<H HH Hc:|jj|yrB)rrrws r# _stop_servingzIocpProactor._stop_serving2s !!#&r$c4|jyt|jjD]:\}}}}|j rt |t r* |j<d}tj}||z} |jrx| tjkrCtjd|tj|z tj|z} |j!||jrxg|_t%j&|jd|_y#t$rS}|j>++ K!4>>#3j#@B>>+j8 JJz "kk DJJ' ; Czz-'C),&)# 00:=:O:OG$67 99'B CsD;; FAFFc$|jyrB)rr\s r#rzIocpProactor.__del__gs  r$rB)rr!)%rIrJrKrLrprrrrrr staticmethodr classmethodrrrrr#r&r*r>rLrXrrrirrhr rrr9r]rrrrr$r#rrs-#+29E     A A C AAA88> A<"0&= DO@& 7#r' -^r$rceZdZdZy)rc tj|f|||||d|_fd}jjj t jj} | j|y)N)rrrrrc\jj}j|yrB)_procpoll_process_exited)r returncoder s r#rzz4_WindowsSubprocessTransport._start..callbackrs!*J   ,r$) r Popenrr8r|riintrRr) r rrrrrrrrzrs ` r#_startz"_WindowsSubprocessTransport._startmso"(( 'U6&'%'  - JJ 0 0TZZ5G5G1H I H%r$N)rIrJrKrrr$r#rrks &r$rceZdZeZy)rN)rIrJrKr _loop_factoryrr$r#rr}%Mr$rceZdZeZy)rN)rIrJrKrrrr$r#rrrr$r)4rLsysplatform ImportErrorrgrYrG functoolsrrqrPr r-rrrrrr r r r r logr__all__rrpERROR_CONNECTION_REFUSEDERROR_CONNECTION_ABORTEDr`rdFuturerrPrqrzobjectrBaseSelectorEventLooprBaseProactorEventLooprrBaseSubprocessTransportrrBaseDefaultEventLoopPolicyrrrrr$r#rs\4 <<7 l ##   ||    --`G#GNNG#T&-&01P-1Ph88v2 E E2g==gTHHV &/"I"I &.&V%F%F&&V%F%F&8r$