a DOg@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/python39/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)r6rr0rr8rr r!r0Ssz_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_result)N) __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!rcsz_BaseWaitHandleFuture.__init__cCst|jdtjkSNr)_winapiZWaitForSingleObjectrFZ WAIT_OBJECT_0rr r r!_pollqs z_BaseWaitHandleFuture._pollcsdt}|d|jd|jdurB|r4dnd}|||jdur`|d|jd|S)Nzhandle=r#ZsignaledZwaitingz wait_handle=)rr%appendrFrNrGr(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+r/) rHrG _overlappedZUnregisterWaitr1winerrorERROR_IO_PENDINGrr2r3rRrrJr4r5r r r!_unregister_waits$   $z&_BaseWaitHandleFuture._unregister_waitcs|tj|dSr7)rXrr0r9rr r!r0sz_BaseWaitHandleFuture.cancelcs|t|dSr:)rXrr;r<rr r!r;sz#_BaseWaitHandleFuture.set_exceptioncs|t|dSr:)rXrr=r>rr r!r=sz _BaseWaitHandleFuture.set_result)N) r@rArBrCrrNr%rRrXr0r;r=rDr r rr!rE`s  rEcsFeZdZdZddfdd 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)rreventrJrrr r!rsz_WaitCancelFuture.__init__cCs tddS)Nz'_WaitCancelFuture must not be cancelled) RuntimeErrorrMr r r!r0sz_WaitCancelFuture.cancelcs$t||jdur ||dSr:)rr=rZr>rr r!r=s  z_WaitCancelFuture.set_resultcs$t||jdur ||dSr:)rr;rZr<rr r!r;s  z_WaitCancelFuture.set_exception) r@rArBrCrr0r=r;rDr r rr!rYs  rYcs6eZdZddfdd ZfddZddZZS) _WaitHandleFutureNrcs<tj||||d||_d|_tdddd|_d|_dS)NrTF)rr _proactorZ_unregister_proactorrTZ CreateEvent_event _event_fut)rrrIrJproactorrrr r!rs z_WaitHandleFuture.__init__csF|jdur"t|jd|_d|_|j|jd|_t|dSr:) r_rL CloseHandler`r^ _unregisterrrrRrPrr r!rRs   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 |_dSrS)rHrGrTZUnregisterWaitExr_r1rUrVrr2r3r^ _wait_cancelrRr`rWr r r!rXs(   $ z"_WaitHandleFuture._unregister_wait)r@rArBrrRrXrDr 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)rkrm)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:)closedrLZPIPE_ACCESS_DUPLEXZFILE_FLAG_OVERLAPPEDZFILE_FLAG_FIRST_PIPE_INSTANCEZCreateNamedPipergZPIPE_TYPE_MESSAGEZPIPE_READMODE_MESSAGEZ PIPE_WAITZPIPE_UNLIMITED_INSTANCESr ZBUFSIZEZNMPWAIT_WAIT_FOREVERNULL PipeHandlerjadd)rfirstflagshpiper r r!rm s"     zPipeServer._server_pipe_handlecCs |jduSr:)rgrMr r r!rpszPipeServer.closedcCsR|jdur|jd|_|jdurN|jD] }|q*d|_d|_|jdSr:)rlr0rgrjcloserkclear)rrwr r r!rx"s     zPipeServer.closeN) r@rArBrCrrormrprx__del__r r r r!res  rec@seZdZdZdS)_WindowsSelectorEventLoopz'Windows version of selector event loop.N)r@rArBrCr r r r!r{1sr{csHeZdZdZd fdd ZfddZddZd d Zdd d ZZ S)r z2Windows version of proactor event loop using IOCP.Ncs|durt}t|dSr:)rrr)rrarr r!r8szProactorEventLoop.__init__c szd|jdusJ||jtW|jdur|jj}|j|dur^|js^|j |d|_n>|jdur|jj}|j|dur|js|j |d|_0dSr:) Z_self_reading_future call_soonZ_loop_self_readingr run_foreverrr0r"r^rcrrrr r!r}=s         zProactorEventLoop.run_forevercs8|j|}|IdH}|}|j||d|id}||fS)Naddrextra)r^ connect_pipe_make_duplex_pipe_transport)rprotocol_factoryr'frwprotocoltransr 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-rwzAccept pipe failed on pipe %rT)exc_info)r?rjdiscardrprxrror^ accept_piper1filenor3Z_debugr ZwarningrCancelledErrorrladd_done_callback)rrwrr4r'loop_accept_piperrZserverr r!r[sB   z>ProactorEventLoop.start_serving_pipe..loop_accept_pipe)N)rer|)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 BaseExceptionrxZ_wait) rrargsshellstdinstdoutstderrbufsizerkwargsrZtranspr r r!_make_subprocess_transports"  z,ProactorEventLoop._make_subprocess_transport)N)N) r@rArBrCrr}rrrrDr r rr!r 5s 0r c@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 |_ dSrK) r2_resultsrTCreateIoCompletionPortINVALID_HANDLE_VALUErq_iocp_cacherhrirH _unregistered_stopped_serving)rZ concurrencyr r r!rs  zIocpProactor.__init__cCs|jdurtddS)NzIocpProactor is closed)rr\rMr r r! _check_closeds zIocpProactor._check_closedcCsFdt|jdt|jg}|jdur0|dd|jjd|fS)Nzoverlapped#=%sz result#=%srpz<%s %s> )lenrrrrOrr@join)rr)r r r!__repr__s     zIocpProactor.__repr__cCs ||_dSr:)r2)rrr r r!set_loopszIocpProactor.set_loopNcCs |js|||j}g|_|Sr:)rrN)rtimeoutrnr r r!selects  zIocpProactor.selectcCs|j}|||Sr:)r2rr=)rvaluerQr r r!_results  zIocpProactor._resultrcCs|||tt}z4t|tjr6||||n|||Wnt yd| dYS0dd}| |||S)Nc SsTz |WStyN}z,|jtjtjfvr8t|jnWYd}~n d}~00dSr: getresultr1rUrTZERROR_NETNAME_DELETEDZERROR_OPERATION_ABORTEDConnectionResetErrorrrkeyrr4r r r! finish_recvs  z&IocpProactor.recv..finish_recv) _register_with_iocprT Overlappedrq isinstancesocketZWSARecvrZReadFileBrokenPipeErrorr _registerrconnnbytesrurrr 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) rrTrrqrrZ WSARecvIntorZ ReadFileIntorrr)rrbufrurrr 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) rrTrrqZ 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)rrTrrqZ WSASendTorr)rrrrurrrr 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) rrTrrqrrZWSASendrZ WriteFiler)rrrrurrr r r!sends    zIocpProactor.sendcsv||jtt}|fdd}dd}|||}||}t j ||j d|S)NcsD|td}tjtj|   fS)Nz@P) rstructZpackr setsockoptr SOL_SOCKETrTZSO_UPDATE_ACCEPT_CONTEXT settimeoutZ gettimeoutZ getpeername)rrrrrlistenerr r! finish_accept/sz*IocpProactor.accept..finish_acceptcs2z|IdHWntjy,|Yn0dSr:)rrrx)r.rr r r! accept_coro8s z(IocpProactor.accept..accept_coror) r_get_accept_socketfamilyrTrrqZAcceptExrrr Z ensure_futurer2)rrrrrr.coror rr!accept)s     zIocpProactor.acceptc sjtjkr4t||j}|d|S| zt j WnDt y}z,|j tjkrrddkrWYd}~n d}~00tt}||fdd}|||S)Nrrcs|tjtjdSrK)rrrrrTZSO_UPDATE_CONNECT_CONTEXTrrrrr r!finish_connect[s z,IocpProactor.connect..finish_connect)typerZ SOCK_DGRAMrTZ WSAConnectrr2rr=rZ BindLocalrr1rUerrnoZ WSAEINVALZ getsocknamerrqZ ConnectExr)rrr'rQerrr 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) rrTrrqZ TransmitFilermsvcrtZ get_osfhandler) rZsockfileoffsetcountrZ offset_lowZ offset_highrr r r!sendfileds      zIocpProactor.sendfilecsJ|tt}|}|r0|Sfdd}|||S)Ncs |Sr:)rrrwr r!finish_accept_pipesz4IocpProactor.accept_pipe..finish_accept_pipe)rrTrrqZConnectNamedPiperrr)rrwrZ connectedrr rr!rys    zIocpProactor.accept_pipec stt}zt|}WqjWn2tyH}z|jtjkr4WYd}~n d}~00t|dt}t |IdHqt |S)N) CONNECT_PIPE_INIT_DELAYrTZ ConnectPiper1rUZERROR_PIPE_BUSYminCONNECT_PIPE_MAX_DELAYr sleepr rr)rr'ZdelayrIr4r 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)rrIrr r r!wait_for_handleszIocpProactor.wait_for_handlecCs||dd}||_|Srf)rrZ)rr[Z done_callbackrQr r r!rdszIocpProactor._wait_cancelcs||durtj}nt|d}tt}t||j |j |}|r\t ||||j dnt |||||j djr~jd=fdd}|d|f|j|j <S)N@@rrcsSr:)rNrrr r!finish_wait_for_handlesz=IocpProactor._wait_for_handle..finish_wait_for_handler)rrLINFINITEmathceilrTrrqZRegisterWaitWithQueuerr'rYr2r]rr)rrIrZ _is_cancelmsrrJrr rr!rs$    zIocpProactor._wait_for_handlecCs0||jvr,|j|t||jdddSrK)rHrsrTrrrrobjr 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) 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)rrrOr~r r r!rcszIocpProactor._unregistercCst|}|d|SrK)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 ValueErrorrrrTZGetQueuedCompletionStatusrrpopKeyErrorr2Z get_debugr3rrLrbrr0Zdoner1r;rrOr=rr'ry)rrrrerrZ transferredrr'rrrrrrr r r!rNsL           "  zIocpProactor._pollcCs|j|dSr:)rrsrr 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+r/g?z,%r is running after closing for %.1f seconds)rlistritemsZ cancelledrrYr0r1r2rr3time monotonicr debugrNrrLrb) rr'rQrrrr4r5Z msg_updateZ start_timeZnext_msgr r r!rxDs>     $     zIocpProactor.closecCs |dSr:)rxrMr r r!rzsszIocpProactor.__del__)r)N)r)r)r)rN)r)N)N)r@rArBrCrrrrrrrrrrrrrrrrrrdrrrrcrrNrrxrzr r r r!rs8        "    7/rc@seZdZddZdS)rc  sPtj|f|||||d|_fdd}jjtjj} | |dS)N)rrrrrcsj}|dSr:)_procZpollZ_process_exited)r returncoderMr r!r~s z4_WindowsSubprocessTransport._start..callback) r Popenrr2r^rintrFr) rrrrrrrrrrr rMr!_startys z"_WindowsSubprocessTransport._startN)r@rArBrr r r r!rwsrc@seZdZeZdS)rN)r@rArBr _loop_factoryr r r r!rsrc@seZdZeZdS)rN)r@rArBr rr r r r!rsr)2rCsysplatform ImportErrorrTrLrrrrrrrhrrrrrrr r logr __all__rqrZERROR_CONNECTION_REFUSEDZERROR_CONNECTION_ABORTEDrrZFuturerrErYr]objectreZBaseSelectorEventLoopr{ZBaseProactorEventLoopr rZBaseSubprocessTransportrr ZBaseDefaultEventLoopPolicyrrrr r r r!sX          0J4;e`