o ?Og@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.NZwin32z 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__=/opt/alt/python310/lib64/python3.10/asyncio/windows_events.pyr6s z_OverlappedFuture.__init__csHt}|jdur"|jjrdnd}|dd|d|jjdd|S)NpendingZ 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)r6rr0rr9rr r!r0Sz_OverlappedFuture.cancelcst||dSN)r set_exceptionr6rr-rr r!r=Ws  z_OverlappedFuture.set_exceptioncst|d|_dSr<)r set_resultrrresultrr r!r?[s  z_OverlappedFuture.set_resultr<) __name__ __module__ __qualname____doc__rr%r6r0r=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!rcs z_BaseWaitHandleFuture.__init__cCst|jdtjkSNr)_winapiZWaitForSingleObjectrHZ WAIT_OBJECT_0rr r r!_pollqs z_BaseWaitHandleFuture._pollcsdt}|d|jd|jdur!|rdnd}|||jdur0|d|jd|S)Nzhandle=r#ZsignaledZwaitingz wait_handle=)rr%appendrHrPrIr(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+r/) rJrI _overlappedZUnregisterWaitr1winerrorERROR_IO_PENDINGrr2r3rTrrLr4r5r r r!_unregister_waits*     z&_BaseWaitHandleFuture._unregister_waitcr7r8)rZrr0r:rr r!r0r;z_BaseWaitHandleFuture.cancelc|t|dSr<)rZrr=r>rr r!r=z#_BaseWaitHandleFuture.set_exceptioncr[r<)rZrr?r@rr r!r?r\z _BaseWaitHandleFuture.set_resultr<) rBrCrDrErrPr%rTrZr0r=r?rFr r rr!rG`s   rGcsFeZdZdZddfdd 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)rreventrLrrr r!rs z_WaitCancelFuture.__init__cCstd)Nz'_WaitCancelFuture must not be cancelled) RuntimeErrorrOr r r!r0sz_WaitCancelFuture.cancelc(t||jdur||dSdSr<)rr?r^r@rr r!r?  z_WaitCancelFuture.set_resultcrar<)rr=r^r>rr r!r=rbz_WaitCancelFuture.set_exception) rBrCrDrErr0r?r=rFr r rr!r]s  r]cs6eZdZddfdd ZfddZddZZS) _WaitHandleFutureNrcs<tj||||d||_d|_tdddd|_d|_dS)NrTF)rr _proactorZ_unregister_proactorrVZ CreateEvent_event _event_fut)rrrKrLproactorrrr r!rs  z_WaitHandleFuture.__init__csF|jdurt|jd|_d|_|j|jd|_t|dSr<) rerN CloseHandlerfrd _unregisterrrrTrRrr r!rTs   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 |_dSrU)rJrIrVZUnregisterWaitExrer1rWrXrr2r3rd _wait_cancelrTrfrYr r r!rZs.      z"_WaitHandleFuture._unregister_wait)rBrCrDrrTrZrFr r rr!rcs rcc@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)rqrs)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<)closedrNZPIPE_ACCESS_DUPLEXZFILE_FLAG_OVERLAPPEDZFILE_FLAG_FIRST_PIPE_INSTANCEZCreateNamedPipermZPIPE_TYPE_MESSAGEZPIPE_READMODE_MESSAGEZ PIPE_WAITZPIPE_UNLIMITED_INSTANCESr ZBUFSIZEZNMPWAIT_WAIT_FOREVERNULL PipeHandlerpadd)rfirstflagshpiper r r!rs s"     zPipeServer._server_pipe_handlecCs |jduSr<)rmrOr r r!rv zPipeServer.closedcCsV|jdur |jd|_|jdur)|jD]}|qd|_d|_|jdSdSr<)rrr0rmrpcloserqclear)rr}r r r!r"s     zPipeServer.closeN) rBrCrDrErrursrvr__del__r r r r!rks  rkc@seZdZdZdS)_WindowsSelectorEventLoopz'Windows version of selector event loop.N)rBrCrDrEr r r r!r1rcsJeZdZdZd fdd ZfddZddZd d Z d d d ZZ S)r z2Windows version of proactor event loop using IOCP.Ncs|durt}t|dSr<)rrr)rrgrr r!r8szProactorEventLoop.__init__c sz.||jtW|jdur-|jj}|j|dur(|js(|j |d|_dSdS|jdurM|jj}|j|durJ|jsJ|j |d|_wr<) call_soonZ_loop_self_readingr run_foreverZ_self_reading_futurerr0r"rdrirrrr r!r=s        zProactorEventLoop.run_forevercs:|j|}|IdH}|}|j||d|id}||fS)Naddrextra)rd connect_pipe_make_duplex_pipe_transport)rprotocol_factoryr'fr}protocoltransr 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-r}zAccept pipe failed on pipe %rT)exc_info)rArpdiscardrvrrrurd accept_pipeBrokenPipeErrorfilenorr1r3Z_debugr ZwarningrCancelledErrorrradd_done_callback)rr}rr4r'loop_accept_piperrZserverr r!r[sR    z>ProactorEventLoop.start_serving_pipe..loop_accept_piper<)rkr)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 BaseExceptionrZ_wait) rrargsshellstdinstdoutstderrbufsizerkwargsrZtranspr r r!_make_subprocess_transports&   z,ProactorEventLoop._make_subprocess_transportr<) rBrCrDrErrrrrrFr r rr!r 5s 5r c@seZdZdZd;ddZddZddZd d ZdddZ d=ddZddZddZdd Zd!d"Zd#d$Zd )lenrrrrQrrBjoin)rr)r r r!__repr__s    zIocpProactor.__repr__cCs ||_dSr<)r2)rrr r r!set_loopr~zIocpProactor.set_loopNcCs.|js|||j}g|_z|Wd}Sd}wr<)rrP)rtimeoutrtr r r!selects  zIocpProactor.selectcCs|j}|||Sr<)r2rr?)rvaluerSr r r!_result  zIocpProactor._resultrcC|||tt}zt|tjr||||n|||Wnt y2| dYSwdd}| |||S)Nc SBz|WSty }z|jtjtjfvrt|jd}~wwr< getresultr1rWrVZERROR_NETNAME_DELETEDZERROR_OPERATION_ABORTEDConnectionResetErrorrrkeyrr4r r r! finish_recv  z&IocpProactor.recv..finish_recv) _register_with_iocprV Overlappedrw isinstancesocketZWSARecvrZReadFilerr _registerrconnnbytesr{rrr r r!recv     zIocpProactor.recvcCr)Nrc Srr<rrr r r!rrz+IocpProactor.recv_into..finish_recv) rrVrrwrrZ WSARecvIntorZ ReadFileIntorrr)rrbufr{rrr r r! recv_intorzIocpProactor.recv_intocCs^||tt}z ||||Wnty#|dYSwdd}||||S)N)rNc Srr<rrr r r!rrz*IocpProactor.recvfrom..finish_recv) rrVrrwZ WSARecvFromrrrrrr r r!recvfroms    zIocpProactor.recvfromcCs>||tt}|||||dd}||||S)Nc Srr<rrr r r! finish_sendrz(IocpProactor.sendto..finish_send)rrVrrwZ WSASendTorr)rrrr{rrrr r r!sendto s   zIocpProactor.sendtocCsZ||tt}t|tjr||||n|||dd}| |||S)Nc Srr<rrr r r!r&rz&IocpProactor.send..finish_send) rrVrrwrrZWSASendrZ WriteFiler)rrrr{rrr r r!sends    zIocpProactor.sendcsv||jtt}|fdd}dd}|||}||}t j ||j d|S)NcsD|td}tjtj|   fS)Nz@P) rstructZpackr setsockoptr SOL_SOCKETrVZSO_UPDATE_ACCEPT_CONTEXT settimeoutZ gettimeoutZ getpeername)rrrrrlistenerr r! finish_accept8s z*IocpProactor.accept..finish_acceptcs.z|IdHWdStjy|wr<)rrr)r.rr r r! accept_coroAsz(IocpProactor.accept..accept_coror) r_get_accept_socketfamilyrVrrwZAcceptExrrr Z ensure_futurer2)rrrrrr.coror rr!accept2s     zIocpProactor.acceptc sjtjkrt||j}|d|S| z t j Wn"t yL}z|j tjkr9ddkrBWYd}~nd}~wwtt}||fdd}|||S)Nrrcs|tjtjdSrM)rrrrrVZSO_UPDATE_CONNECT_CONTEXTrrrrr r!finish_connectds z,IocpProactor.connect..finish_connect)typerZ SOCK_DGRAMrVZ WSAConnectrr2rr?rZ BindLocalrr1rWerrnoZ WSAEINVALZ getsocknamerrwZ ConnectExr)rrr'rSerrr rr!connectNs(        zIocpProactor.connectc Csb||tt}|d@}|d?d@}||t||||dddd}||||S)Nr rc Srr<rrr r r!finish_sendfilewrz.IocpProactor.sendfile..finish_sendfile) rrVrrwZ TransmitFilermsvcrtZ get_osfhandler) rZsockfileoffsetcountrZ offset_lowZ offset_highrr r r!sendfilems      zIocpProactor.sendfilecsJ|tt}|}|r|Sfdd}|||S)Ncs |Sr<)rrr}r r!finish_accept_pipesz4IocpProactor.accept_pipe..finish_accept_pipe)rrVrrwZConnectNamedPiperrr)rr}rZ connectedrr rr!rs    zIocpProactor.accept_pipec stt} zt|}Wn)ty$}z |jtjkrWYd}~nd}~wwt|dt}t |IdHqt |S)NT) CONNECT_PIPE_INIT_DELAYrVZ ConnectPiper1rWZERROR_PIPE_BUSYminCONNECT_PIPE_MAX_DELAYr sleepr rx)rr'ZdelayrKr4r 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)rrKrr r r!wait_for_handleszIocpProactor.wait_for_handlecCs||dd}||_|Srl)rr^)rr_Z done_callbackrSr r r!rjszIocpProactor._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<)rPrrr r!finish_wait_for_handlesz=IocpProactor._wait_for_handle..finish_wait_for_handler)rrNINFINITEmathceilrVrrwZRegisterWaitWithQueuerr'r]r2rcrr)rrKrZ _is_cancelmsrrLrr rr!rs$     zIocpProactor._wait_for_handlecCs4||jvr|j|t||jdddSdSrM)rJryrVrrrrobjr 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) rrr2rr"r1r=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!riszIocpProactor._unregistercCst|}|d|SrM)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 timeoutrztimeout too bigTz8GetQueuedCompletionStatus() returned an unexpected eventz)err=%s transferred=%s key=%#x address=%#x)r,status)r ValueErrorrrrVZGetQueuedCompletionStatusrrpopKeyErrorr2Z get_debugr3rrNrhrr0Zdoner1r=rrQr?rr'r)rrrrerrZ transferredrr'rrrrrrr r r!rPsZ            )zIocpProactor._pollcCs|j|dSr<)rryrr 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+r/g?z,%r is running after closing for %.1f seconds)rlistritemsZ cancelledrr]r0r1r2rr3time monotonicr debugrPrrNrh) rr'rSrrrr4r5Z msg_updateZ start_timeZnext_msgr r r!rOsD            zIocpProactor.closecCs |dSr<)rrOr r r!r~s zIocpProactor.__del__)rr<)r)rN)rBrCrDrErrrrrrrrrrrrrrrrrrjrrrrirrPrrrr r r r!rs:         "   9 /rc@seZdZddZdS)rc  sPtj|f|||||d|_fdd}jjtjj} | |dS)N)rrrrrcsj}|dSr<)_procZpollZ_process_exited)r returncoderOr r!rs z4_WindowsSubprocessTransport._start..callback) r Popenrr2rdrintrHr) rrrrrrrrrrr rOr!_starts z"_WindowsSubprocessTransport._startN)rBrCrDrr r r r!rs rc@eZdZeZdS)rN)rBrCrDr _loop_factoryr r r r!rrrc@r)rN)rBrCrDr rr r r r!rrr)2rEsysplatform ImportErrorrVrNrrrrrr rnrrrrrrr r logr __all__rwrZERROR_CONNECTION_REFUSEDZERROR_CONNECTION_ABORTEDrrZFuturerrGr]rcobjectrkZBaseSelectorEventLooprZBaseProactorEventLoopr rZBaseSubprocessTransportrr ZBaseDefaultEventLoopPolicyrrrr r r r!sZ          0J4;jf