o [dr@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/lib/python3.10/asyncio/windows_events.pyr6s z_OverlappedFuture.__init__csHt}|jdur"|jjrdnd}|dd|d|jjdd|S)Npending completedrz overlapped=)r _repr_inforr#insertaddressrinfostaterr!r"r'<s   z_OverlappedFuture._repr_infoc Cst|jdurdSz|jWn&ty4}zd||d}|jr$|j|d<|j|WYd}~nd}~wwd|_dS)Nz&Cancelling an overlapped future failedmessage exceptionfuturesource_traceback)rcancelOSErrorr_loopcall_exception_handler)rexccontextr!r!r"_cancel_overlappedCs   z$_OverlappedFuture._cancel_overlappedc|tj|dSN)msg)r8rr2rr;rr!r"r2Sz_OverlappedFuture.cancelcst||dSN)r set_exceptionr8rr/rr!r"r?Ws  z_OverlappedFuture.set_exceptioncst|d|_dSr>)r set_resultrrresultrr!r"rA[s  z_OverlappedFuture.set_resultr>) __name__ __module__ __qualname____doc__rr'r8r2r?rA __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"rcs z_BaseWaitHandleFuture.__init__cCst|jdtjkSNr)_winapiWaitForSingleObjectrJ WAIT_OBJECT_0rr!r!r"_pollqs z_BaseWaitHandleFuture._pollcsdt}|d|jd|jdur!|rdnd}|||jdur0|d|jd|S)Nzhandle=r%signaledwaitingz wait_handle=)rr'appendrJrTrKr*rr!r"r'vs    z _BaseWaitHandleFuture._repr_infocCs d|_dSr>)rrfutr!r!r"_unregister_wait_cbs z)_BaseWaitHandleFuture._unregister_wait_cbc Cs|jsdSd|_|j}d|_zt|Wn3tyH}z'|jtjkr>d||d}|jr1|j|d<|j |WYd}~dSWYd}~nd}~ww| ddSNFz$Failed to unregister the wait handler-r1) rLrK _overlappedUnregisterWaitr3winerrorERROR_IO_PENDINGrr4r5rZrrNr6r7r!r!r"_unregister_waits*     z&_BaseWaitHandleFuture._unregister_waitcr9r:)rarr2r<rr!r"r2r=z_BaseWaitHandleFuture.cancelc|t|dSr>)rarr?r@rr!r"r?z#_BaseWaitHandleFuture.set_exceptioncrbr>)rarrArBrr!r"rArcz _BaseWaitHandleFuture.set_resultr>) rDrErFrGrrTr'rZrar2r?rArHr!r!rr"rI`s   rIcsFeZdZdZddfdd 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)rreventrNrrr!r"rs z_WaitCancelFuture.__init__cCstd)Nz'_WaitCancelFuture must not be cancelled) RuntimeErrorrSr!r!r"r2sz_WaitCancelFuture.cancelc(t||jdur||dSdSr>)rrArerBrr!r"rA  z_WaitCancelFuture.set_resultcrhr>)rr?rer@rr!r"r?riz_WaitCancelFuture.set_exception) rDrErFrGrr2rAr?rHr!r!rr"rds  rdcs6eZdZddfdd ZfddZddZZS) _WaitHandleFutureNrcs<tj||||d||_d|_tdddd|_d|_dS)NrTF)rr _proactor_unregister_proactorr\ CreateEvent_event _event_fut)rrrMrNproactorrrr!r"rs  z_WaitHandleFuture.__init__csF|jdurt|jd|_d|_|j|jd|_t|dSr>) rnrP CloseHandlerork _unregisterrrrZrXrr!r"rZs   z%_WaitHandleFuture._unregister_wait_cbc Cs|jsdSd|_|j}d|_z t||jWn3tyJ}z'|jtjkr@d||d}|jr3|j|d<|j |WYd}~dSWYd}~nd}~ww|j |j|j |_dSr[)rLrKr\UnregisterWaitExrnr3r^r_rr4r5rk _wait_cancelrZror`r!r!r"ras.      z"_WaitHandleFuture._unregister_wait)rDrErFrrZrarHr!r!rr"rjs rjc@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)r{r})rtmpr!r!r"_get_unconnected_pipesz PipeServer._get_unconnected_pipec Csr|rdStjtjB}|r|tjO}t|j|tjtjBtj Btj t j t j tj tj}t |}|j||Sr>)closedrPPIPE_ACCESS_DUPLEXFILE_FLAG_OVERLAPPEDFILE_FLAG_FIRST_PIPE_INSTANCECreateNamedPiperwPIPE_TYPE_MESSAGEPIPE_READMODE_MESSAGE PIPE_WAITPIPE_UNLIMITED_INSTANCESr BUFSIZENMPWAIT_WAIT_FOREVERNULL PipeHandlerzadd)rfirstflagshpiper!r!r"r} s"     zPipeServer._server_pipe_handlecCs |jduSr>)rwrSr!r!r"r zPipeServer.closedcCsV|jdur |jd|_|jdur)|jD]}|qd|_d|_|jdSdSr>)r|r2rwrzcloser{clear)rrr!r!r"r"s     zPipeServer.closeN) rDrErFrGrrr}rr__del__r!r!r!r"rus  ruc@seZdZdZdS)_WindowsSelectorEventLoopz'Windows version of selector event loop.N)rDrErFrGr!r!r!r"r1rcsJeZdZdZd fdd ZfddZddZd d Z d d d ZZ S)rz2Windows version of proactor event loop using IOCP.Ncs|durt}t|dSr>)rrr)rrprr!r"r8szProactorEventLoop.__init__c sz2|jdusJ||jtW|jdur1|jj}|j|dur,|j|d|_dSdS|jdurN|jj}|j|durK|j|d|_wr>) _self_reading_future call_soon_loop_self_readingr run_foreverrr2rkrrrrrr!r"r=s         zProactorEventLoop.run_forevercs:|j|}|IdH}|}|j||d|id}||fS)Naddrextra)rk connect_pipe_make_duplex_pipe_transport)rprotocol_factoryr)frprotocoltransr!r!r"create_pipe_connectionPs  z(ProactorEventLoop.create_pipe_connectioncs0tdfdd gS)Nc sTd}z7|r'|}j|r|WdS}j||did}|dur2WdSj|}Wnft yT|rL| dkrL| YdSt y}z-|rq| dkrq d||d|n jr|tjd|dd WYd}~dSd}~wtjy|r|YdSYdSw|_|dS) NrrrzPipe accept failed)r.r/rzAccept pipe failed on pipe %rT)exc_info)rCrzdiscardrrrrrk accept_pipeBrokenPipeErrorfilenorr3r5_debugr warningrCancelledErrorr|add_done_callback)rrrr6r)loop_accept_piperrserverr!r"r[sR    z>ProactorEventLoop.start_serving_pipe..loop_accept_piper>)rur)rrr)r!rr"start_serving_pipeXs  -z$ProactorEventLoop.start_serving_pipec sx|} t||||||||f| |d| } z| IdHW| Sttfy)ty;| | IdHw)N)waiterr) create_future_WindowsSubprocessTransport SystemExitKeyboardInterrupt BaseExceptionr_wait) rrargsshellstdinstdoutstderrbufsizerkwargsrtranspr!r!r"_make_subprocess_transports&   z,ProactorEventLoop._make_subprocess_transportr>) rDrErFrGrrrrrrHr!r!rr"r5s 5rc@seZdZdZd;ddZddZddZd d ZdddZ d=ddZddZddZdd Zd!d"Zd#d$Zd )lenrrrrWr rDjoin)rr+r!r!r"__repr__s    zIocpProactor.__repr__cCs ||_dSr>)r4)rrr!r!r"set_looprzIocpProactor.set_loopNcCs.|js|||j}g|_z|Wd}Sd}wr>)rrT)rtimeoutr~r!r!r"selects  zIocpProactor.selectcCs|j}|||Sr>)r4rrA)rvaluerYr!r!r"_result  zIocpProactor._resultrcC|||tt}zt|tjr||||n|||Wnt y2| dYSwdd}| |||S)Nc SBz|WSty }z|jtjtjfvrt|jd}~wwr> getresultr3r^r\ERROR_NETNAME_DELETEDERROR_OPERATION_ABORTEDConnectionResetErrorrrkeyrr6r!r!r" finish_recv  z&IocpProactor.recv..finish_recv) _register_with_iocpr\ Overlappedr isinstancesocketWSARecvrReadFilerr _registerrconnnbytesrrrr!r!r"recv     zIocpProactor.recvcCr)Nrc Srr>rrr!r!r"rrz+IocpProactor.recv_into..finish_recv) rr\rrrr WSARecvIntor ReadFileIntorrr)rrbufrrrr!r!r" recv_intorzIocpProactor.recv_intocCs^||tt}z ||||Wnty#|dYSwdd}||||S)N)rNc Srr>rrr!r!r"rrz*IocpProactor.recvfrom..finish_recv) rr\rr WSARecvFromrrrrrr!r!r"recvfroms    zIocpProactor.recvfromcCs>||tt}|||||dd}||||S)Nc Srr>rrr!r!r" finish_sendrz(IocpProactor.sendto..finish_send)rr\rr WSASendTorr)rrrrrrrr!r!r"sendto s   zIocpProactor.sendtocCsZ||tt}t|tjr||||n|||dd}| |||S)Nc Srr>rrr!r!r"r&rz&IocpProactor.send..finish_send) rr\rrrrWSASendr WriteFiler)rrrrrrr!r!r"sends    zIocpProactor.sendcsv||jtt}|fdd}dd}|||}||}t j ||j d|S)NcsD|td}tjtj|   fS)Nz@P) rstructpackr setsockoptr SOL_SOCKETr\SO_UPDATE_ACCEPT_CONTEXT settimeout gettimeout getpeername)rrrrrlistenerr!r" finish_accept8s z*IocpProactor.accept..finish_acceptcs.z|IdHWdStjy|wr>)rrr)r0rr!r!r" accept_coroAsz(IocpProactor.accept..accept_coror) r_get_accept_socketfamilyr\rrAcceptExrrr ensure_futurer4)rrrrrr0coror!rr"accept2s     zIocpProactor.acceptc sjtjkrt||j}|d|S| z t j Wn"t yL}z|j tjkr9ddkrBWYd}~nd}~wwtt}||fdd}|||S)Nrrcs|tjtjdSrO)rrrrr\SO_UPDATE_CONNECT_CONTEXTrrrrr!r"finish_connectds z,IocpProactor.connect..finish_connect)typer SOCK_DGRAMr\ WSAConnectrr4rrAr BindLocalrr3r^errno WSAEINVAL getsocknamerr ConnectExr)rrr)rYerrr!rr"connectNs(        zIocpProactor.connectc Csb||tt}|d@}|d?d@}||t||||dddd}||||S)Nr rc Srr>rrr!r!r"finish_sendfilewrz.IocpProactor.sendfile..finish_sendfile) rr\rr TransmitFilermsvcrt get_osfhandler) rsockfileoffsetcountr offset_low offset_highrr!r!r"sendfilems      zIocpProactor.sendfilecsJ|tt}|}|r|Sfdd}|||S)Ncs |Sr>)rrrr!r"finish_accept_pipesz4IocpProactor.accept_pipe..finish_accept_pipe)rr\rrConnectNamedPiperrr)rrr connectedr(r!r'r"rs    zIocpProactor.accept_pipec stt} zt|}Wn)ty$}z |jtjkrWYd}~nd}~wwt|dt}t |IdHqt |S)NT) CONNECT_PIPE_INIT_DELAYr\ ConnectPiper3r^ERROR_PIPE_BUSYminCONNECT_PIPE_MAX_DELAYr sleepr r)rr)delayrMr6r!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)rrMrr!r!r"wait_for_handleszIocpProactor.wait_for_handlecCs||dd}||_|Srv)r3re)rrf done_callbackrYr!r!r"rtszIocpProactor._wait_cancelcs||dur tj}nt|d}tt}t||j |j |}|r.t ||||j dn t |||||j djr?jd=fdd}|d|f|j|j <S)N@@rrcsSr>)rTrrr!r"finish_wait_for_handlesz=IocpProactor._wait_for_handle..finish_wait_for_handler)rrPINFINITEmathceilr\rrRegisterWaitWithQueuerr)rdr4rjrr)rrMr _is_cancelmsrrNr8r!r7r"r3s$     zIocpProactor._wait_for_handlecCs4||jvr|j|t||jdddSdSrO)rLrr\rrrrobjr!r!r"rs  z IocpProactor._register_with_iocpc Cs|t||jd}|jr|jd=|js:z|dd|}Wnty4}z ||WYd}~n d}~ww||||||f|j|j <|Sr) rrr4rr#r3r?rArr))rrr@callbackrrrr!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)rrrWrr!r!r"rrszIocpProactor._unregistercCst|}|d|SrO)rr)rrsr!r!r"r rzIocpProactor._get_accept_socketc Cs|durt}n|dkrtdt|d}|tkrtd t|j|}|dur+nd}|\}}}}z |j|\}} } } Wn)t yh|j rZ|j dd||||fd|dtj fvrft|Yqw| |jvrs|n=|sz5z| ||| } Wnty} z|| |j|WYd} ~ nd} ~ ww|| |j|Wd}nd}wq|jD] } |j| jdq|jdS) Nrznegative timeoutr6ztimeout too bigTz8GetQueuedCompletionStatus() returned an unexpected eventz)err=%s transferred=%s key=%#x address=%#x)r.status)r9 ValueErrorr:r;r\GetQueuedCompletionStatusrrpopKeyErrorr4 get_debugr5rrPrqrr2doner3r?rrWrArr)r)rrr>rCerr transferredrr)rrr@rArrr!r!r"rTsZ            )zIocpProactor._pollcCs|j|dSr>)rrr?r!r!r" _stop_servingIszIocpProactor._stop_servingc Cs|jdurdSt|jD]D\}\}}}}|rqt|tr!qz|WqtyR}z|j durHd||d}|j rB|j |d<|j |WYd}~qd}~wwd}t } | |} |jr| t krwtd|t | t |} |||js`g|_t|jd|_dS)NzCancelling a future failedr-r1g?z,%r is running after closing for %.1f seconds)rlistritems cancelledrrdr2r3r4rr5time monotonicr debugrTrrPrq) rr)rYrr@rAr6r7 msg_update start_timenext_msgr!r!r"rOsD            zIocpProactor.closecCs |dSr>)rrSr!r!r"r~s zIocpProactor.__del__)rr>)r)rN)rDrErFrGrrrrrrrrrrrr rr&rrr4rtr3rrrrrrTrLrrr!r!r!r"rs:         "   9 /rc@seZdZddZdS)rc  sPtj|f|||||d|_fdd}jjtjj} | |dS)N)rrrrrcsj}|dSr>)_procpoll_process_exited)r returncoderSr!r"rAs z4_WindowsSubprocessTransport._start..callback) r PopenrVr4rkr4intrJr) rrrrrrrrrArr!rSr"_starts z"_WindowsSubprocessTransport._startN)rDrErFr\r!r!r!r"rs rc@eZdZeZdS)rN)rDrErFr _loop_factoryr!r!r!r"rrrc@r])rN)rDrErFrr^r!r!r!r"rrr)2rGsysplatform ImportErrorr\rPrr:rrrrPrxrrrrrr r r logr __all__rr9ERROR_CONNECTION_REFUSEDERROR_CONNECTION_ABORTEDr,r0FuturerrIrdrjobjectruBaseSelectorEventLooprBaseProactorEventLooprrBaseSubprocessTransportrr BaseDefaultEventLoopPolicyrrrr!r!r!r"sZ          0J4;jf