a i@sdZddlZejdkredddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZddl mZddl mZdd l mZdd l mZdd l mZdd l mZdd l mZddlmZdZdZdZdZdZdZdZGdddejZ GdddejZ!Gddde!Z"Gddde!Z#Gddde$Z%Gdd d ej&Z'Gd!d"d"ej(Z)Gd#d$d$Z*Gd%d&d&ej+Z,e'Z-Gd'd(d(ej.Z/Gd)d*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?cs`eZdZdZddfdd ZfddZdd Zdfd d Zfd d ZfddZ Z S)_OverlappedFuturezSubclass of Future which represents an overlapped operation. Cancelling it will immediately cancel the overlapped operation. Nloopcs&tj|d|jr|jd=||_dSNr)super__init___source_traceback_ov)selfovr __class__./usr/lib64/python3.9/asyncio/windows_events.pyr6sz_OverlappedFuture.__init__csHt}|jdurD|jjr dnd}|dd|d|jjdd|S)NpendingZ completedrz overlapped=)r _repr_inforr#insertaddressrinfostaterr!r"r&<s    z_OverlappedFuture._repr_infoc Cst|jdurdSz|jWnLtyh}z4d||d}|jrH|j|d<|j|WYd}~n d}~00d|_dS)Nz&Cancelling an overlapped future failedmessage exceptionfuturesource_traceback)rcancelOSErrorr_loopcall_exception_handler)rexccontextr!r!r"_cancel_overlappedCs  "z$_OverlappedFuture._cancel_overlappedcs|tj|dSN)msg)r7rr1rr9rr!r"r1Ssz_OverlappedFuture.cancelcst||dSN)r set_exceptionr7rr.rr!r"r<Ws z_OverlappedFuture.set_exceptioncst|d|_dSr;)r set_resultrrresultrr!r"r>[s z_OverlappedFuture.set_result)N) __name__ __module__ __qualname____doc__rr&r7r1r<r> __classcell__r!r!rr"r0s  rcspeZdZdZddfdd ZddZfdd Zd d Zd d Zdfdd Z fddZ fddZ Z S)_BaseWaitHandleFuturez2Subclass of Future which represents a wait handle.Nrcs8tj|d|jr|jd=||_||_||_d|_dS)NrrT)rrrr_handle _wait_handle _registered)rrhandle wait_handlerrr!r"rcsz_BaseWaitHandleFuture.__init__cCst|jdtjkSNr)_winapiZWaitForSingleObjectrGZ WAIT_OBJECT_0rr!r!r"_pollqs z_BaseWaitHandleFuture._pollcsdt}|d|jd|jdurB|r4dnd}|||jdur`|d|jd|S)Nzhandle=r$signaledZwaitingz wait_handle=)rr&appendrGrOrHr)rr!r"r&vs    z _BaseWaitHandleFuture._repr_infocCs d|_dSr;)rrfutr!r!r"_unregister_wait_cbsz)_BaseWaitHandleFuture._unregister_wait_cbc Cs|js dSd|_|j}d|_zt|Wnfty}zN|jtjkr|d||d}|jrb|j|d<|j |WYd}~dSWYd}~n d}~00| ddSNFz$Failed to unregister the wait handler,r0) rIrH _overlappedZUnregisterWaitr2winerrorERROR_IO_PENDINGrr3r4rTrrKr5r6r!r!r"_unregister_waits$   $z&_BaseWaitHandleFuture._unregister_waitcs|tj|dSr8)rZrr1r:rr!r"r1sz_BaseWaitHandleFuture.cancelcs|t|dSr;)rZrr<r=rr!r"r<sz#_BaseWaitHandleFuture.set_exceptioncs|t|dSr;)rZrr>r?rr!r"r>sz _BaseWaitHandleFuture.set_result)N) rArBrCrDrrOr&rTrZr1r<r>rEr!r!rr"rF`s  rFcsFeZdZdZddfdd ZddZfdd Zfd d ZZS) _WaitCancelFuturezoSubclass of Future which represents a wait for the cancellation of a _WaitHandleFuture using an event. Nrcstj||||dd|_dS)Nr)rr_done_callback)rreventrKrrr!r"rsz_WaitCancelFuture.__init__cCs tddS)Nz'_WaitCancelFuture must not be cancelled) RuntimeErrorrNr!r!r"r1sz_WaitCancelFuture.cancelcs$t||jdur ||dSr;)rr>r\r?rr!r"r>s  z_WaitCancelFuture.set_resultcs$t||jdur ||dSr;)rr<r\r=rr!r"r<s  z_WaitCancelFuture.set_exception) rArBrCrDrr1r>r<rEr!r!rr"r[s  r[cs6eZdZddfdd ZfddZddZZS) _WaitHandleFutureNrcs<tj||||d||_d|_tdddd|_d|_dS)NrTF)rr _proactorZ_unregister_proactorrVZ CreateEvent_event _event_fut)rrrJrKproactorrrr!r"rs z_WaitHandleFuture.__init__csF|jdur"t|jd|_d|_|j|jd|_t|dSr;) rarM CloseHandlerbr` _unregisterrrrTrRrr!r"rTs   z%_WaitHandleFuture._unregister_wait_cbc Cs|js dSd|_|j}d|_zt||jWnfty}zN|jtjkrd||d}|jrf|j|d<|j |WYd}~dSWYd}~n d}~00|j |j|j |_dSrU)rIrHrVZUnregisterWaitExrar2rWrXrr3r4r` _wait_cancelrTrbrYr!r!r"rZs(   $ z"_WaitHandleFuture._unregister_wait)rArBrCrrTrZrEr!r!rr"r_s r_c@s<eZdZdZddZddZddZdd Zd d ZeZ d S) PipeServerzXClass representing a pipe server. This is much like a bound, listening socket. cCs,||_t|_d|_d|_|d|_dSNT)_addressweakrefWeakSet_free_instances_pipe_accept_pipe_future_server_pipe_handle)rr(r!r!r"rs  zPipeServer.__init__cCs|j|d}|_|S)NF)rmro)rtmpr!r!r"_get_unconnected_pipesz PipeServer._get_unconnected_pipec Csr|r dStjtjB}|r&|tjO}t|j|tjtjBtj Btj t j t j tj tj}t |}|j||Sr;)closedrMZPIPE_ACCESS_DUPLEXZFILE_FLAG_OVERLAPPEDZFILE_FLAG_FIRST_PIPE_INSTANCEZCreateNamedPiperiZPIPE_TYPE_MESSAGEZPIPE_READMODE_MESSAGEZ PIPE_WAITZPIPE_UNLIMITED_INSTANCESr BUFSIZEZNMPWAIT_WAIT_FOREVERNULL PipeHandlerladd)rfirstflagshpiper!r!r"ro s"     zPipeServer._server_pipe_handlecCs |jduSr;)rirNr!r!r"rrszPipeServer.closedcCsR|jdur|jd|_|jdurN|jD] }|q*d|_d|_|jdSr;)rnr1rirlclosermclear)rrzr!r!r"r{"s     zPipeServer.closeN) rArBrCrDrrqrorrr{__del__r!r!r!r"rgs  rgc@seZdZdZdS)_WindowsSelectorEventLoopz'Windows version of selector event loop.N)rArBrCrDr!r!r!r"r~1sr~csHeZdZdZd fdd ZfddZddZd d Zdd d ZZ S)rz2Windows version of proactor event loop using IOCP.Ncs|durt}t|dSr;)rrr)rrcrr!r"r8szProactorEventLoop.__init__c szV||jtW|jdur|jj}|j|durP|jsP|j |d|_n>|jdur|jj}|j|dur|js|j |d|_0dSr;) call_soonZ_loop_self_readingr run_foreverZ_self_reading_futurerr1r#r`rerrrr!r"r=s        zProactorEventLoop.run_forevercs8|j|}|IdH}|}|j||d|id}||fS)Naddrextra)r` connect_pipe_make_duplex_pipe_transport)rprotocol_factoryr(frzprotocoltransr!r!r"create_pipe_connectionPs  z(ProactorEventLoop.create_pipe_connectioncs.tdfdd gS)Nc s d}zn|rN|}j|r4|WdS}j||did}|durdWdSj|}Wnt y}zN|r| dkr d||d|nj rt jd|ddWYd}~n8d}~0tjy|r|Yn0|_|dS) NrrrzPipe accept failed)r-r.rzzAccept pipe failed on pipe %rT)exc_info)r@rldiscardrrr{rrqr` accept_piper2filenor4Z_debugr warningrCancelledErrorrnadd_done_callback)rrzrr5r(loop_accept_piperrZserverr!r"r[sB   z>ProactorEventLoop.start_serving_pipe..loop_accept_pipe)N)rgr)rrr(r!rr"start_serving_pipeXs( z$ProactorEventLoop.start_serving_pipec s|} t||||||||f| |d| } z| IdHWn@ttfyRYn*tyz| | IdHYn0| S)N)waiterr) create_future_WindowsSubprocessTransport SystemExitKeyboardInterrupt BaseExceptionr{_wait) rrargsshellstdinstdoutstderrbufsizerkwargsrZtranspr!r!r"_make_subprocess_transports"  z,ProactorEventLoop._make_subprocess_transport)N)N) rArBrCrDrrrrrrEr!r!rr"r5s 0rc@seZdZdZd;ddZddZddZd d ZdddZ d?ddZ d@ddZ dAddZddZddZdd Zd!d"Zd#d$ZdBd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2ZdCd3d4Zd5d6Zd7d8Zd9d:Zd S)Drz#Proactor implementation using IOCP.rcCsDd|_g|_ttjtd||_i|_t |_ g|_ t |_ dSrL) r3_resultsrVCreateIoCompletionPortINVALID_HANDLE_VALUErt_iocp_cacherjrkrI _unregistered_stopped_serving)rZ concurrencyr!r!r"rs  zIocpProactor.__init__cCs|jdurtddS)NzIocpProactor is closed)rr^rNr!r!r" _check_closeds zIocpProactor._check_closedcCsFdt|jdt|jg}|jdur0|dd|jjd|fS)Nzoverlapped#=%sz result#=%srrz<%s %s> )lenrrrrQr rAjoin)rr*r!r!r"__repr__s     zIocpProactor.__repr__cCs ||_dSr;)r3)rrr!r!r"set_loopszIocpProactor.set_loopNcCs |js|||j}g|_|Sr;)rrO)rtimeoutrpr!r!r"selects  zIocpProactor.selectcCs|j}|||Sr;)r3rr>)rvaluerSr!r!r"_results  zIocpProactor._resultrcCs|||tt}z4t|tjr6||||n|||Wnt yd| dYS0dd}| |||S)Nc SsTz |WStyN}z,|jtjtjfvr8t|jnWYd}~n d}~00dSr; getresultr2rWrVZERROR_NETNAME_DELETEDZERROR_OPERATION_ABORTEDConnectionResetErrorrrkeyrr5r!r!r" finish_recvs  z&IocpProactor.recv..finish_recv) _register_with_iocprV Overlappedrt isinstancesocketZWSARecvrZReadFileBrokenPipeErrorr _registerrconnnbytesrxrrr!r!r"recvs     zIocpProactor.recvcCs|||tt}z4t|tjr6||||n|||Wnt yd| dYS0dd}| |||S)Nrc SsTz |WStyN}z,|jtjtjfvr8t|jnWYd}~n d}~00dSr;rrr!r!r"rs  z+IocpProactor.recv_into..finish_recv) rrVrrtrrZ WSARecvIntorZ ReadFileIntorrr)rrbufrxrrr!r!r" recv_intos     zIocpProactor.recv_intocCs^||tt}z||||WntyF|dYS0dd}||||S)N)rNc SsTz |WStyN}z,|jtjtjfvr8t|jnWYd}~n d}~00dSr;rrr!r!r"rs  z*IocpProactor.recvfrom..finish_recv) rrVrrtZ WSARecvFromrrrrrr!r!r"recvfroms    zIocpProactor.recvfromcCs>||tt}|||||dd}||||S)Nc SsTz |WStyN}z,|jtjtjfvr8t|jnWYd}~n d}~00dSr;rrr!r!r" finish_send s  z(IocpProactor.sendto..finish_send)rrVrrtZ WSASendTorr)rrrrxrrrr!r!r"sendtos    zIocpProactor.sendtocCsZ||tt}t|tjr4||||n|||dd}| |||S)Nc SsTz |WStyN}z,|jtjtjfvr8t|jnWYd}~n d}~00dSr;rrr!r!r"rs  z&IocpProactor.send..finish_send) rrVrrtrrZWSASendrZ WriteFiler)rrrrxrrr!r!r"sends    zIocpProactor.sendcsv||jtt}|fdd}dd}|||}||}t j ||j d|S)NcsD|td}tjtj|   fS)Nz@P) rstructpackr setsockoptr SOL_SOCKETrVZSO_UPDATE_ACCEPT_CONTEXT settimeout gettimeout getpeername)rrrrrlistenerr!r" finish_accept/sz*IocpProactor.accept..finish_acceptcs2z|IdHWntjy,|Yn0dSr;)rrr{)r/rr!r!r" accept_coro8s z(IocpProactor.accept..accept_coror) r_get_accept_socketfamilyrVrrtZAcceptExrrr Z ensure_futurer3)rrrrrr/coror!rr"accept)s     zIocpProactor.acceptc sjtjkr4t||j}|d|S| zt j WnDt y}z,|j tjkrrddkrWYd}~n d}~00tt}||fdd}|||S)Nrrcs|tjtjdSrL)rrrrrVZSO_UPDATE_CONNECT_CONTEXTrrrrr!r"finish_connect[s z,IocpProactor.connect..finish_connect)typer SOCK_DGRAMrVZ WSAConnectrr3rr>rZ BindLocalrr2rWerrnoZ WSAEINVAL getsocknamerrtZ ConnectExr)rrr(rSerrr!rr"connectEs"       zIocpProactor.connectc Csb||tt}|d@}|d?d@}||t||||dddd}||||S)Nr rc SsTz |WStyN}z,|jtjtjfvr8t|jnWYd}~n d}~00dSr;rrr!r!r"finish_sendfilens  z.IocpProactor.sendfile..finish_sendfile) rrVrrtZ TransmitFilermsvcrtZ get_osfhandler) rsockfileoffsetcountrZ offset_lowZ offset_highrr!r!r"sendfileds      zIocpProactor.sendfilecsJ|tt}|}|r0|Sfdd}|||S)Ncs |Sr;)rrrzr!r"finish_accept_pipesz4IocpProactor.accept_pipe..finish_accept_pipe)rrVrrtZConnectNamedPiperrr)rrzrZ connectedrr!rr"rys    zIocpProactor.accept_pipec stt}zt|}WqjWn2tyH}z|jtjkr4WYd}~n d}~00t|dt}t |IdHqt |S)N) CONNECT_PIPE_INIT_DELAYrVZ ConnectPiper2rWZERROR_PIPE_BUSYminCONNECT_PIPE_MAX_DELAYr sleepr ru)rr(delayrJr5r!r!r"rs  zIocpProactor.connect_pipecCs|||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)rrJrr!r!r"wait_for_handleszIocpProactor.wait_for_handlecCs||dd}||_|Srh)rr\)rr]Z done_callbackrSr!r!r"rfszIocpProactor._wait_cancelcs||durtj}nt|d}tt}t||j |j |}|r\t ||||j dnt |||||j djr~jd=fdd}|d|f|j|j <S)N@@rrcsSr;)rOrrr!r"finish_wait_for_handlesz=IocpProactor._wait_for_handle..finish_wait_for_handler)rrMINFINITEmathceilrVrrtZRegisterWaitWithQueuerr(r[r3r_rr)rrJrZ _is_cancelmsrrKrr!rr"rs$    zIocpProactor._wait_for_handlecCs0||jvr,|j|t||jdddSrL)rIrvrVrrrrobjr!r!r"rs  z IocpProactor._register_with_iocpc Cs|t||jd}|jr$|jd=|jstz|dd|}Wn.tyh}z||WYd}~nd}~00||||||f|j|j <|Sr) rrr3rr#r2r<r>rr()rrrcallbackrrrr!r!r"rs  zIocpProactor._registercCs||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)rrrQrr!r!r"reszIocpProactor._unregistercCst|}|d|SrL)rr)rrsr!r!r"rs  zIocpProactor._get_accept_socketc Cs|durt}n0|dkr tdnt|d}|tkr>tdt|j|}|durXqZd}|\}}}}z|j|\}} } } WnVt y|j r|j dd||||fd|dtj fvrt|Yq>Yn0| |jvr|q>|s>z| ||| } Wn<ty@} z"|| |j|WYd} ~ q>d} ~ 00|| |j|q>|jD]} |j| jdq`|jdS)Nrznegative timeoutrztimeout too bigz8GetQueuedCompletionStatus() returned an unexpected eventz)err=%s transferred=%s key=%#x address=%#x)r-status)r ValueErrorrrrVZGetQueuedCompletionStatusrrpopKeyErrorr3Z get_debugr4rrMrdrr1doner2r<rrQr>rr(r|)rrrrerrZ transferredrr(rrrrrrr!r!r"rOsL           "  zIocpProactor._pollcCs|j|dSr;)rrvrr!r!r" _stop_serving>szIocpProactor._stop_servingc Cs|jdurdSt|jD]\}\}}}}|r6qt|trBqz |Wqty}z>|j durd||d}|j r|j |d<|j |WYd}~qd}~00qd}t } | |} |jr| t krtd|t | t |} ||qg|_t|jd|_dS)NzCancelling a future failedr,r0g?z,%r is running after closing for %.1f seconds)rlistritems cancelledrr[r1r2r3rr4time monotonicr debugrOrrMrd) rr(rSrrrr5r6Z msg_updateZ start_timeZnext_msgr!r!r"r{Ds>     $     zIocpProactor.closecCs |dSr;)r{rNr!r!r"r}sszIocpProactor.__del__)r)N)r)r)r)rN)r)N)N)rArBrCrDrrrrrrrrrrrrrrrrrrfrrrrerrOrr{r}r!r!r!r"rs8        "    7/rc@seZdZddZdS)rc  sPtj|f|||||d|_fdd}jjtjj} | |dS)N)rrrrrcsj}|dSr;)_procpollZ_process_exited)r returncoderNr!r"r~s z4_WindowsSubprocessTransport._start..callback) r Popenrr3r`rintrGr) rrrrrrrrrrr!rNr"_startys z"_WindowsSubprocessTransport._startN)rArBrCrr!r!r!r"rwsrc@seZdZeZdS)rN)rArBrCr _loop_factoryr!r!r!r"rsrc@seZdZeZdS)rN)rArBrCrrr!r!r!r"rsr)2rDsysplatform ImportErrorrVrMrrrrrr rjrrrrrr r r logr __all__rtrZERROR_CONNECTION_REFUSEDZERROR_CONNECTION_ABORTEDrrFuturerrFr[r_objectrgZBaseSelectorEventLoopr~ZBaseProactorEventLooprrZBaseSubprocessTransportrr ZBaseDefaultEventLoopPolicyrrrr!r!r!r"sX          0J4;e`